From b253d3e0c2591700f597ad63a93bc62c5f48409d Mon Sep 17 00:00:00 2001
From: gol-cha <info@mevo.xyz>
Date: Sat, 2 Feb 2019 09:26:49 +0900
Subject: [PATCH 001/192] Upgrade new Web Share Target API (#9963)

* Update manifest.json for new Web Share Target API.

* fix code formatting
---
 app/serializers/manifest_serializer.rb | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/serializers/manifest_serializer.rb b/app/serializers/manifest_serializer.rb
index 859ef0d149..cc8b9a4d45 100644
--- a/app/serializers/manifest_serializer.rb
+++ b/app/serializers/manifest_serializer.rb
@@ -52,6 +52,14 @@ class ManifestSerializer < ActiveModel::Serializer
   end
 
   def share_target
-    { url_template: 'share?title={title}&text={text}&url={url}' }
+    {
+      url_template: 'share?title={title}&text={text}&url={url}',
+      action: 'share',
+      params: {
+        title: 'title',
+        text: 'text',
+        url: 'url',
+      },
+    }
   end
 end
-- 
GitLab


From 5092d17f2936146fa26e5d8a9b9e391f77010f28 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Acid=20Chicken=20=28=E7=A1=AB=E9=85=B8=E9=B6=8F=29?=
 <root@acid-chicken.com>
Date: Sat, 2 Feb 2019 20:25:04 +0900
Subject: [PATCH 002/192] Add WebP support (#9879)

* Add WebP support

* Remove the changes to the tooltip

refs: https://github.com/tootsuite/mastodon/pull/9879#pullrequestreview-199312528
---
 app/javascript/mastodon/utils/resize_image.js | 2 +-
 app/models/concerns/account_avatar.rb         | 2 +-
 app/models/concerns/account_header.rb         | 2 +-
 app/models/media_attachment.rb                | 4 ++--
 app/models/preview_card.rb                    | 2 +-
 5 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/javascript/mastodon/utils/resize_image.js b/app/javascript/mastodon/utils/resize_image.js
index d1608094f7..bbdbc865e9 100644
--- a/app/javascript/mastodon/utils/resize_image.js
+++ b/app/javascript/mastodon/utils/resize_image.js
@@ -31,7 +31,7 @@ const loadImage = inputFile => new Promise((resolve, reject) => {
 });
 
 const getOrientation = (img, type = 'image/png') => new Promise(resolve => {
-  if (type !== 'image/jpeg') {
+  if (!['image/jpeg', 'image/webp'].includes(type)) {
     resolve(1);
     return;
   }
diff --git a/app/models/concerns/account_avatar.rb b/app/models/concerns/account_avatar.rb
index 2d5ebfca35..5fff3ef5d2 100644
--- a/app/models/concerns/account_avatar.rb
+++ b/app/models/concerns/account_avatar.rb
@@ -3,7 +3,7 @@
 module AccountAvatar
   extend ActiveSupport::Concern
 
-  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
   LIMIT = 2.megabytes
 
   class_methods do
diff --git a/app/models/concerns/account_header.rb b/app/models/concerns/account_header.rb
index 067e166eb6..a748fdff72 100644
--- a/app/models/concerns/account_header.rb
+++ b/app/models/concerns/account_header.rb
@@ -3,7 +3,7 @@
 module AccountHeader
   extend ActiveSupport::Concern
 
-  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
   LIMIT = 2.megabytes
   MAX_PIXELS = 750_000 # 1500x500px
 
diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 6b939124fa..2e0f98cc6f 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -25,10 +25,10 @@ class MediaAttachment < ApplicationRecord
 
   enum type: [:image, :gifv, :video, :unknown]
 
-  IMAGE_FILE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif'].freeze
+  IMAGE_FILE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp'].freeze
   VIDEO_FILE_EXTENSIONS = ['.webm', '.mp4', '.m4v', '.mov'].freeze
 
-  IMAGE_MIME_TYPES             = ['image/jpeg', 'image/png', 'image/gif'].freeze
+  IMAGE_MIME_TYPES             = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
   VIDEO_MIME_TYPES             = ['video/webm', 'video/mp4', 'video/quicktime'].freeze
   VIDEO_CONVERTIBLE_MIME_TYPES = ['video/webm', 'video/quicktime'].freeze
 
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index a792b352bd..f26ea0c748 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -25,7 +25,7 @@
 #
 
 class PreviewCard < ApplicationRecord
-  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
+  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'].freeze
   LIMIT = 1.megabytes
 
   self.inheritance_column = false
-- 
GitLab


From 6a5e3da6b044e50635d293c2716883cc5627e4c8 Mon Sep 17 00:00:00 2001
From: Jakub Mendyk <jakubmendyk.szkola@gmail.com>
Date: Sat, 2 Feb 2019 19:01:18 +0100
Subject: [PATCH 003/192] Allow most kinds of characters in URL query (fixes
 #8408) (#8447)

* Allow unicode characters in URL query strings

Fixes #8408

* Alternative approach to unicode support in urls

Adds PoC/idea to approch this problem.
---
 app/lib/formatter.rb       | 39 +++++++++++++++++++++++++++++++++++++-
 spec/lib/formatter_spec.rb | 32 ++++++++++++++++++++++++++++---
 2 files changed, 67 insertions(+), 4 deletions(-)

diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 05fd9eeb12..2e35871696 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -99,7 +99,7 @@ class Formatter
   end
 
   def encode_and_link_urls(html, accounts = nil, options = {})
-    entities = Extractor.extract_entities_with_indices(html, extract_url_without_protocol: false)
+    entities = utf8_friendly_extractor(html, extract_url_without_protocol: false)
 
     if accounts.is_a?(Hash)
       options  = accounts
@@ -199,6 +199,43 @@ class Formatter
     result.flatten.join
   end
 
+  def utf8_friendly_extractor(text, options = {})
+    old_to_new_index = [0]
+
+    escaped = text.chars.map do |c|
+      output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c
+      old_to_new_index << old_to_new_index.last + output.length
+      output
+    end.join
+
+    # Note: I couldn't obtain list_slug with @user/list-name format
+    # for mention so this requires additional check
+    special = Extractor.extract_entities_with_indices(escaped, options).map do |extract|
+      # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present
+      key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first
+
+      new_indices = [
+        old_to_new_index.find_index(extract[:indices].first),
+        old_to_new_index.find_index(extract[:indices].last),
+      ]
+
+      has_prefix_char = [:hashtag, :screen_name, :cashtag].include?(key)
+      value_indices = [
+        new_indices.first + (has_prefix_char ? 1 : 0), # account for #, @ or $
+        new_indices.last - 1,
+      ]
+
+      next extract.merge(
+        :indices => new_indices,
+        key => text[value_indices.first..value_indices.last]
+      )
+    end
+
+    standard = Extractor.extract_entities_with_indices(text, options)
+
+    Extractor.remove_overlapping_entities(special + standard)
+  end
+
   def link_to_url(entity, options = {})
     url        = Addressable::URI.parse(entity[:url])
     html_attrs = { target: '_blank', rel: 'nofollow noopener' }
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index 0c1efe7c3c..9872d37567 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -74,10 +74,36 @@ RSpec.describe Formatter do
     end
 
     context 'given a URL with a query string' do
-      let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' }
+      context 'with escaped unicode character' do
+        let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink' }
 
-      it 'matches the full URL' do
-        is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&amp;q=autolink"'
+        it 'matches the full URL' do
+          is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&amp;q=autolink"'
+        end
+      end
+
+      context 'with unicode character' do
+        let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓&q=autolink' }
+
+        it 'matches the full URL' do
+          is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓&amp;q=autolink"'
+        end
+      end
+
+      context 'with unicode character at the end' do
+        let(:text) { 'https://www.ruby-toolbox.com/search?utf8=✓' }
+
+        it 'matches the full URL' do
+          is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=✓"'
+        end
+      end
+
+      context 'with escaped and not escaped unicode characters' do
+        let(:text) { 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&utf81=✓&q=autolink' }
+
+        it 'preserves escaped unicode characters' do
+          is_expected.to include 'href="https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&amp;utf81=✓&amp;q=autolink"'
+        end
       end
     end
 
-- 
GitLab


From bcfff65195f557dc086470f91b4c90b15c004cf7 Mon Sep 17 00:00:00 2001
From: ysksn <bluewhale1982@gmail.com>
Date: Sun, 3 Feb 2019 03:11:38 +0900
Subject: [PATCH 004/192] Create Redisable#redis (#9633)

* Create Redisable

* Use #redis instead of Redis.current
---
 app/lib/activity_tracker.rb                   |  6 ++----
 app/lib/activitypub/activity.rb               |  5 +----
 app/lib/feed_manager.rb                       |  9 +++------
 app/lib/ostatus/activity/base.rb              |  6 ++----
 app/lib/potential_friendship_tracker.rb       |  8 ++------
 app/models/concerns/redisable.rb              | 11 +++++++++++
 app/models/feed.rb                            |  6 ++----
 app/models/trending_tags.rb                   |  6 ++----
 app/services/batched_remove_status_service.rb |  5 +----
 app/services/follow_service.rb                |  6 ++----
 app/services/post_status_service.rb           |  6 ++----
 app/services/remove_status_service.rb         | 19 ++++++++-----------
 .../scheduler/feed_cleanup_scheduler.rb       |  5 +----
 13 files changed, 39 insertions(+), 59 deletions(-)
 create mode 100644 app/models/concerns/redisable.rb

diff --git a/app/lib/activity_tracker.rb b/app/lib/activity_tracker.rb
index 5b49726747..ae3c11b6af 100644
--- a/app/lib/activity_tracker.rb
+++ b/app/lib/activity_tracker.rb
@@ -4,6 +4,8 @@ class ActivityTracker
   EXPIRE_AFTER = 90.days.seconds
 
   class << self
+    include Redisable
+
     def increment(prefix)
       key = [prefix, current_week].join(':')
 
@@ -20,10 +22,6 @@ class ActivityTracker
 
     private
 
-    def redis
-      Redis.current
-    end
-
     def current_week
       Time.zone.today.cweek
     end
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 87318fb1c5..919678618a 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -2,6 +2,7 @@
 
 class ActivityPub::Activity
   include JsonLdHelper
+  include Redisable
 
   def initialize(json, account, **options)
     @json    = json
@@ -70,10 +71,6 @@ class ActivityPub::Activity
     @object_uri ||= value_or_id(@object)
   end
 
-  def redis
-    Redis.current
-  end
-
   def distribute(status)
     crawl_links(status)
 
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index f99df33e54..d77cdb3a3c 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -4,6 +4,7 @@ require 'singleton'
 
 class FeedManager
   include Singleton
+  include Redisable
 
   MAX_ITEMS = 400
 
@@ -35,7 +36,7 @@ class FeedManager
 
   def unpush_from_home(account, status)
     return false unless remove_from_feed(:home, account.id, status)
-    Redis.current.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s))
+    redis.publish("timeline:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s))
     true
   end
 
@@ -53,7 +54,7 @@ class FeedManager
 
   def unpush_from_list(list, status)
     return false unless remove_from_feed(:list, list.id, status)
-    Redis.current.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s))
+    redis.publish("timeline:list:#{list.id}", Oj.dump(event: :delete, payload: status.id.to_s))
     true
   end
 
@@ -142,10 +143,6 @@ class FeedManager
 
   private
 
-  def redis
-    Redis.current
-  end
-
   def push_update_required?(timeline_id)
     redis.exists("subscribed:#{timeline_id}")
   end
diff --git a/app/lib/ostatus/activity/base.rb b/app/lib/ostatus/activity/base.rb
index c5933f3adf..db70f19980 100644
--- a/app/lib/ostatus/activity/base.rb
+++ b/app/lib/ostatus/activity/base.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class OStatus::Activity::Base
+  include Redisable
+
   def initialize(xml, account = nil, **options)
     @xml     = xml
     @account = account
@@ -66,8 +68,4 @@ class OStatus::Activity::Base
       Status.find_by(uri: uri)
     end
   end
-
-  def redis
-    Redis.current
-  end
 end
diff --git a/app/lib/potential_friendship_tracker.rb b/app/lib/potential_friendship_tracker.rb
index 017a9748d5..188aa4a275 100644
--- a/app/lib/potential_friendship_tracker.rb
+++ b/app/lib/potential_friendship_tracker.rb
@@ -11,6 +11,8 @@ class PotentialFriendshipTracker
   }.freeze
 
   class << self
+    include Redisable
+
     def record(account_id, target_account_id, action)
       return if account_id == target_account_id
 
@@ -31,11 +33,5 @@ class PotentialFriendshipTracker
       return [] if account_ids.empty?
       Account.searchable.where(id: account_ids)
     end
-
-    private
-
-    def redis
-      Redis.current
-    end
   end
 end
diff --git a/app/models/concerns/redisable.rb b/app/models/concerns/redisable.rb
new file mode 100644
index 0000000000..c6cf973596
--- /dev/null
+++ b/app/models/concerns/redisable.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Redisable
+  extend ActiveSupport::Concern
+
+  private
+
+  def redis
+    Redis.current
+  end
+end
diff --git a/app/models/feed.rb b/app/models/feed.rb
index 5bce88f255..0e8943ff86 100644
--- a/app/models/feed.rb
+++ b/app/models/feed.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class Feed
+  include Redisable
+
   def initialize(type, id)
     @type = type
     @id   = id
@@ -27,8 +29,4 @@ class Feed
   def key
     FeedManager.instance.key(@type, @id)
   end
-
-  def redis
-    Redis.current
-  end
 end
diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb
index 3a8be21649..148535c212 100644
--- a/app/models/trending_tags.rb
+++ b/app/models/trending_tags.rb
@@ -7,6 +7,8 @@ class TrendingTags
   THRESHOLD            = 5
 
   class << self
+    include Redisable
+
     def record_use!(tag, account, at_time = Time.now.utc)
       return if disallowed_hashtags.include?(tag.name) || account.silenced? || account.bot?
 
@@ -59,9 +61,5 @@ class TrendingTags
       @disallowed_hashtags = @disallowed_hashtags.split(' ') if @disallowed_hashtags.is_a? String
       @disallowed_hashtags = @disallowed_hashtags.map(&:downcase)
     end
-
-    def redis
-      Redis.current
-    end
   end
 end
diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb
index 2e61904fc7..cd3b14e08e 100644
--- a/app/services/batched_remove_status_service.rb
+++ b/app/services/batched_remove_status_service.rb
@@ -2,6 +2,7 @@
 
 class BatchedRemoveStatusService < BaseService
   include StreamEntryRenderer
+  include Redisable
 
   # Delete given statuses and reblogs of them
   # Dispatch PuSH updates of the deleted statuses, but only local ones
@@ -109,10 +110,6 @@ class BatchedRemoveStatusService < BaseService
     end
   end
 
-  def redis
-    Redis.current
-  end
-
   def build_xml(stream_entry)
     return @activity_xml[stream_entry.id] if @activity_xml.key?(stream_entry.id)
 
diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb
index 9d36a1449d..92d8c864a7 100644
--- a/app/services/follow_service.rb
+++ b/app/services/follow_service.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class FollowService < BaseService
+  include Redisable
+
   # Follow a remote user, notify remote user about the follow
   # @param [Account] source_account From which to follow
   # @param [String, Account] uri User URI to follow in the form of username@domain (or account record)
@@ -67,10 +69,6 @@ class FollowService < BaseService
     follow
   end
 
-  def redis
-    Redis.current
-  end
-
   def build_follow_request_xml(follow_request)
     OStatus::AtomSerializer.render(OStatus::AtomSerializer.new.follow_request_salmon(follow_request))
   end
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 9959bb1fbf..686b10c581 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -1,6 +1,8 @@
 # frozen_string_literal: true
 
 class PostStatusService < BaseService
+  include Redisable
+
   MIN_SCHEDULE_OFFSET = 5.minutes.freeze
 
   # Post a text status update, fetch and notify remote users mentioned
@@ -110,10 +112,6 @@ class PostStatusService < BaseService
     ProcessHashtagsService.new
   end
 
-  def redis
-    Redis.current
-  end
-
   def scheduled?
     @scheduled_at.present?
   end
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 11d28e783d..28c5224b01 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -2,6 +2,7 @@
 
 class RemoveStatusService < BaseService
   include StreamEntryRenderer
+  include Redisable
 
   def call(status, **options)
     @payload      = Oj.dump(event: :delete, payload: status.id.to_s)
@@ -55,7 +56,7 @@ class RemoveStatusService < BaseService
 
   def remove_from_affected
     @mentions.map(&:account).select(&:local?).each do |account|
-      Redis.current.publish("timeline:#{account.id}", @payload)
+      redis.publish("timeline:#{account.id}", @payload)
     end
   end
 
@@ -133,26 +134,22 @@ class RemoveStatusService < BaseService
     return unless @status.public_visibility?
 
     @tags.each do |hashtag|
-      Redis.current.publish("timeline:hashtag:#{hashtag}", @payload)
-      Redis.current.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local?
+      redis.publish("timeline:hashtag:#{hashtag}", @payload)
+      redis.publish("timeline:hashtag:#{hashtag}:local", @payload) if @status.local?
     end
   end
 
   def remove_from_public
     return unless @status.public_visibility?
 
-    Redis.current.publish('timeline:public', @payload)
-    Redis.current.publish('timeline:public:local', @payload) if @status.local?
+    redis.publish('timeline:public', @payload)
+    redis.publish('timeline:public:local', @payload) if @status.local?
   end
 
   def remove_from_media
     return unless @status.public_visibility?
 
-    Redis.current.publish('timeline:public:media', @payload)
-    Redis.current.publish('timeline:public:local:media', @payload) if @status.local?
-  end
-
-  def redis
-    Redis.current
+    redis.publish('timeline:public:media', @payload)
+    redis.publish('timeline:public:local:media', @payload) if @status.local?
   end
 end
diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb
index cd22734180..bf5e207570 100644
--- a/app/workers/scheduler/feed_cleanup_scheduler.rb
+++ b/app/workers/scheduler/feed_cleanup_scheduler.rb
@@ -2,6 +2,7 @@
 
 class Scheduler::FeedCleanupScheduler
   include Sidekiq::Worker
+  include Redisable
 
   sidekiq_options unique: :until_executed, retry: 0
 
@@ -57,8 +58,4 @@ class Scheduler::FeedCleanupScheduler
   def feed_manager
     FeedManager.instance
   end
-
-  def redis
-    Redis.current
-  end
 end
-- 
GitLab


From ed3011061896dfc4819d517a0f4f4947e56feac4 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Sat, 2 Feb 2019 19:18:15 +0100
Subject: [PATCH 005/192] Make displaying application used to toot opt-in
 (#9897)

* Make storing and displaying application used to toot opt-in

* Revert to storing application info, and display it to the author via API
---
 app/controllers/settings/preferences_controller.rb  | 1 +
 app/lib/user_settings_decorator.rb                  | 5 +++++
 app/models/account.rb                               | 1 +
 app/models/user.rb                                  | 6 +++++-
 app/serializers/rest/status_serializer.rb           | 6 +++++-
 app/views/settings/preferences/show.html.haml       | 3 +++
 app/views/stream_entries/_detailed_status.html.haml | 2 +-
 config/locales/simple_form.en.yml                   | 2 ++
 config/settings.yml                                 | 1 +
 9 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/app/controllers/settings/preferences_controller.rb b/app/controllers/settings/preferences_controller.rb
index 41df3bde2f..90967635da 100644
--- a/app/controllers/settings/preferences_controller.rb
+++ b/app/controllers/settings/preferences_controller.rb
@@ -48,6 +48,7 @@ class Settings::PreferencesController < Settings::BaseController
       :setting_theme,
       :setting_hide_network,
       :setting_aggregate_reblogs,
+      :setting_show_application,
       notification_emails: %i(follow follow_request reblog favourite mention digest report),
       interactions: %i(must_be_follower must_be_following)
     )
diff --git a/app/lib/user_settings_decorator.rb b/app/lib/user_settings_decorator.rb
index 19b8544103..daeb3d936f 100644
--- a/app/lib/user_settings_decorator.rb
+++ b/app/lib/user_settings_decorator.rb
@@ -32,6 +32,7 @@ class UserSettingsDecorator
     user.settings['theme']               = theme_preference if change?('setting_theme')
     user.settings['hide_network']        = hide_network_preference if change?('setting_hide_network')
     user.settings['aggregate_reblogs']   = aggregate_reblogs_preference if change?('setting_aggregate_reblogs')
+    user.settings['show_application']    = show_application_preference if change?('setting_show_application')
   end
 
   def merged_notification_emails
@@ -90,6 +91,10 @@ class UserSettingsDecorator
     boolean_cast_setting 'setting_hide_network'
   end
 
+  def show_application_preference
+    boolean_cast_setting 'setting_show_application'
+  end
+
   def theme_preference
     settings['setting_theme']
   end
diff --git a/app/models/account.rb b/app/models/account.rb
index 11a3c21fe4..12d7a747ee 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -109,6 +109,7 @@ class Account < ApplicationRecord
            :staff?,
            :locale,
            :hides_network?,
+           :shows_application?,
            to: :user,
            prefix: true,
            allow_nil: true
diff --git a/app/models/user.rb b/app/models/user.rb
index fdd2741c1d..7432e3da88 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -100,7 +100,7 @@ class User < ApplicationRecord
 
   delegate :auto_play_gif, :default_sensitive, :unfollow_modal, :boost_modal, :delete_modal,
            :reduce_motion, :system_font_ui, :noindex, :theme, :display_media, :hide_network,
-           :expand_spoilers, :default_language, :aggregate_reblogs, to: :settings, prefix: :setting, allow_nil: false
+           :expand_spoilers, :default_language, :aggregate_reblogs, :show_application, to: :settings, prefix: :setting, allow_nil: false
 
   attr_reader :invite_code
 
@@ -244,6 +244,10 @@ class User < ApplicationRecord
     @aggregates_reblogs ||= settings.aggregate_reblogs
   end
 
+  def shows_application?
+    @shows_application ||= settings.shows_application
+  end
+
   def token_for_app(a)
     return nil if a.nil? || a.owner != self
     Doorkeeper::AccessToken
diff --git a/app/serializers/rest/status_serializer.rb b/app/serializers/rest/status_serializer.rb
index bfc2d78b41..66e19be560 100644
--- a/app/serializers/rest/status_serializer.rb
+++ b/app/serializers/rest/status_serializer.rb
@@ -12,7 +12,7 @@ class REST::StatusSerializer < ActiveModel::Serializer
   attribute :pinned, if: :pinnable?
 
   belongs_to :reblog, serializer: REST::StatusSerializer
-  belongs_to :application
+  belongs_to :application, if: :show_application?
   belongs_to :account, serializer: REST::AccountSerializer
 
   has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
@@ -38,6 +38,10 @@ class REST::StatusSerializer < ActiveModel::Serializer
     !current_user.nil?
   end
 
+  def show_application?
+    object.account.user_shows_application? || (current_user? && current_user.account_id == object.account_id)
+  end
+
   def visibility
     # This visibility is masked behind "private"
     # to avoid API changes because there are no
diff --git a/app/views/settings/preferences/show.html.haml b/app/views/settings/preferences/show.html.haml
index a2c61c9a68..3cb91631ed 100644
--- a/app/views/settings/preferences/show.html.haml
+++ b/app/views/settings/preferences/show.html.haml
@@ -34,6 +34,9 @@
   .fields-group
     = f.input :setting_hide_network, as: :boolean, wrapper: :with_label
 
+  .fields-group
+    = f.input :setting_show_application, as: :boolean, wrapper: :with_label
+
   %hr#settings_web/
 
   .fields-row
diff --git a/app/views/stream_entries/_detailed_status.html.haml b/app/views/stream_entries/_detailed_status.html.haml
index 18265e1107..e123d657fa 100644
--- a/app/views/stream_entries/_detailed_status.html.haml
+++ b/app/views/stream_entries/_detailed_status.html.haml
@@ -39,7 +39,7 @@
     = link_to TagManager.instance.url_for(status), class: 'detailed-status__datetime u-url u-uid', target: stream_link_target, rel: 'noopener' do
       %time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
     ·
-    - if status.application
+    - if status.application && @account.user&.setting_show_application
       - if status.application.website.blank?
         %strong.detailed-status__application= status.application.name
       - else
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 4363c59e42..325114755b 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -33,6 +33,7 @@ en:
         setting_display_media_show_all: Always show media marked as sensitive
         setting_hide_network: Who you follow and who follows you will not be shown on your profile
         setting_noindex: Affects your public profile and status pages
+        setting_show_application: The application you use to toot will be displayed in the detailed view of your toots
         setting_theme: Affects how Mastodon looks when you're logged in from any device.
         username: Your username will be unique on %{domain}
         whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word
@@ -100,6 +101,7 @@ en:
         setting_hide_network: Hide your network
         setting_noindex: Opt-out of search engine indexing
         setting_reduce_motion: Reduce motion in animations
+        setting_show_application: Disclose application used to send toots
         setting_system_font_ui: Use system's default font
         setting_theme: Site theme
         setting_unfollow_modal: Show confirmation dialog before unfollowing someone
diff --git a/config/settings.yml b/config/settings.yml
index 4f7c2c8f32..2cf286a9e4 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -26,6 +26,7 @@ defaults: &defaults
   expand_spoilers: false
   preview_sensitive_media: false
   reduce_motion: false
+  show_application: false
   system_font_ui: false
   noindex: false
   theme: 'default'
-- 
GitLab


From 582f86ab32b4ce2b9d242cf6f5c3c6c0dce4e144 Mon Sep 17 00:00:00 2001
From: Jeong Arm <kjwonmail@gmail.com>
Date: Sun, 3 Feb 2019 03:37:16 +0900
Subject: [PATCH 006/192] Re-enable ignored translations that is needed (#7842)

Some of strings should be translated.
---
 config/i18n-tasks.yml | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/config/i18n-tasks.yml b/config/i18n-tasks.yml
index eec8b6dbec..1bcac154b1 100644
--- a/config/i18n-tasks.yml
+++ b/config/i18n-tasks.yml
@@ -35,11 +35,8 @@ ignore_missing:
   - 'activemodel.errors.*'
   - 'activerecord.attributes.*'
   - 'activerecord.errors.*'
-  - '{devise,pagination,doorkeeper}.*'
+  - '{pagination,doorkeeper}.*'
   - '{date,datetime,time,number}.*'
-  - 'simple_form.{yes,no}'
-  - 'simple_form.{placeholders,hints,labels}.*'
-  - 'simple_form.{error_notification,required}.:'
   - 'errors.messages.*'
   - 'activerecord.errors.models.doorkeeper/*'
   - 'sessions.{browsers,platforms}.*'
-- 
GitLab


From 750c67660de753065ec160b4e389ba0dda2f81cc Mon Sep 17 00:00:00 2001
From: tmm576 <tmm576@users.noreply.github.com>
Date: Sat, 2 Feb 2019 14:22:05 -0500
Subject: [PATCH 007/192] Allow multiple files upload through web UI, including
 drag & drop (#9856)

* Allow drag and drop uploads of multiple files to compose

* Calculate aggregate upload progress for single action

* Allow multiple uploads to compose through traditional input, consolidate update file limit logic, provide file limit feedback
---
 app/javascript/mastodon/actions/alerts.js     |  4 +-
 app/javascript/mastodon/actions/compose.js    | 38 ++++++++++++++-----
 .../compose/components/upload_button.js       |  2 +-
 app/javascript/mastodon/features/ui/index.js  |  2 +-
 .../mastodon/locales/defaultMessages.json     | 11 +++++-
 app/javascript/mastodon/locales/en.json       |  1 +
 6 files changed, 43 insertions(+), 15 deletions(-)

diff --git a/app/javascript/mastodon/actions/alerts.js b/app/javascript/mastodon/actions/alerts.js
index 3f5d7ef46b..50cd48a9ed 100644
--- a/app/javascript/mastodon/actions/alerts.js
+++ b/app/javascript/mastodon/actions/alerts.js
@@ -22,7 +22,7 @@ export function clearAlert() {
   };
 };
 
-export function showAlert(title, message) {
+export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage) {
   return {
     type: ALERT_SHOW,
     title,
@@ -44,6 +44,6 @@ export function showAlertForError(error) {
     return showAlert(title, message);
   } else {
     console.error(error);
-    return showAlert(messages.unexpectedTitle, messages.unexpectedMessage);
+    return showAlert();
   }
 }
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index a4352faaba..0be2a5cd46 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -8,6 +8,8 @@ import resizeImage from '../utils/resize_image';
 import { importFetchedAccounts } from './importer';
 import { updateTimeline } from './timelines';
 import { showAlertForError } from './alerts';
+import { showAlert } from './alerts';
+import { defineMessages } from 'react-intl';
 
 let cancelFetchComposeSuggestionsAccounts;
 
@@ -49,6 +51,10 @@ export const COMPOSE_UPLOAD_CHANGE_REQUEST     = 'COMPOSE_UPLOAD_UPDATE_REQUEST'
 export const COMPOSE_UPLOAD_CHANGE_SUCCESS     = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
 export const COMPOSE_UPLOAD_CHANGE_FAIL        = 'COMPOSE_UPLOAD_UPDATE_FAIL';
 
+const messages = defineMessages({
+  uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
+});
+
 export function changeCompose(text) {
   return {
     type: COMPOSE_CHANGE,
@@ -184,20 +190,32 @@ export function submitComposeFail(error) {
 
 export function uploadCompose(files) {
   return function (dispatch, getState) {
-    if (getState().getIn(['compose', 'media_attachments']).size > 3) {
+    const uploadLimit = 4;
+    const media  = getState().getIn(['compose', 'media_attachments']);
+    const total = Array.from(files).reduce((a, v) => a + v.size, 0);
+    const progress = new Array(files.length).fill(0);
+
+    if (files.length + media.size > uploadLimit) {
+      dispatch(showAlert(undefined, messages.uploadErrorLimit));
       return;
     }
-
     dispatch(uploadComposeRequest());
 
-    resizeImage(files[0]).then(file => {
-      const data = new FormData();
-      data.append('file', file);
-
-      return api(getState).post('/api/v1/media', data, {
-        onUploadProgress: ({ loaded, total }) => dispatch(uploadComposeProgress(loaded, total)),
-      }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
-    }).catch(error => dispatch(uploadComposeFail(error)));
+    for (const [i, f] of Array.from(files).entries()) {
+      if (media.size + i > 3) break;
+
+      resizeImage(f).then(file => {
+        const data = new FormData();
+        data.append('file', file);
+
+        return api(getState).post('/api/v1/media', data, {
+          onUploadProgress: function({ loaded }){
+            progress[i] = loaded;
+            dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
+          },
+        }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
+      }).catch(error => dispatch(uploadComposeFail(error)));
+    };
   };
 };
 
diff --git a/app/javascript/mastodon/features/compose/components/upload_button.js b/app/javascript/mastodon/features/compose/components/upload_button.js
index b6fe770ead..db55ad70bf 100644
--- a/app/javascript/mastodon/features/compose/components/upload_button.js
+++ b/app/javascript/mastodon/features/compose/components/upload_button.js
@@ -63,7 +63,7 @@ class UploadButton extends ImmutablePureComponent {
             key={resetFileKey}
             ref={this.setRef}
             type='file'
-            multiple={false}
+            multiple
             accept={acceptContentTypes.toArray().join(',')}
             onChange={this.handleChange}
             disabled={disabled}
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index f01c2bf247..93e45678f2 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -263,7 +263,7 @@ class UI extends React.PureComponent {
     this.setState({ draggingOver: false });
     this.dragTargets = [];
 
-    if (e.dataTransfer && e.dataTransfer.files.length === 1) {
+    if (e.dataTransfer && e.dataTransfer.files.length >= 1) {
       this.props.dispatch(uploadCompose(e.dataTransfer.files));
     }
   }
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 6ac8160ba4..89d4e6bbaa 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -12,6 +12,15 @@
     ],
     "path": "app/javascript/mastodon/actions/alerts.json"
   },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "File upload limit exceeded.",
+        "id": "upload_error.limit"
+      }
+    ],
+    "path": "app/javascript/mastodon/actions/compose.json"
+  },
   {
     "descriptors": [
       {
@@ -2285,4 +2294,4 @@
     ],
     "path": "app/javascript/mastodon/features/video/index.json"
   }
-]
\ No newline at end of file
+]
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 1dbf280222..e840b17d84 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -342,6 +342,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Change preview",
   "upload_form.undo": "Delete",
-- 
GitLab


From 7e33d6d192128238768c976ba108a374ad073aa2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Sun, 3 Feb 2019 03:40:22 +0100
Subject: [PATCH 008/192] Bump httplog from 1.2.0 to 1.2.1 (#9942)

Bumps [httplog](https://github.com/trusche/httplog) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/trusche/httplog/releases)
- [Changelog](https://github.com/trusche/httplog/blob/master/CHANGELOG.md)
- [Commits](https://github.com/trusche/httplog/compare/v1.2.0...v1.2.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 8f661fc242..3b488710b0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -266,7 +266,7 @@ GEM
       domain_name (~> 0.5)
     http-form_data (2.1.1)
     http_accept_language (2.1.1)
-    httplog (1.2.0)
+    httplog (1.2.1)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
     i18n (1.5.3)
-- 
GitLab


From c5071f2d787e81251c2b3111074b20d94773ee44 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Sun, 3 Feb 2019 03:40:40 +0100
Subject: [PATCH 009/192] Bump capybara from 3.12.0 to 3.13.2 (#9935)

Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.12.0 to 3.13.2.
- [Release notes](https://github.com/teamcapybara/capybara/releases)
- [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md)
- [Commits](https://github.com/teamcapybara/capybara/compare/3.12.0...3.13.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index 8266488f89..44cae11ff2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -107,7 +107,7 @@ group :production, :test do
 end
 
 group :test do
-  gem 'capybara', '~> 3.12'
+  gem 'capybara', '~> 3.13'
   gem 'climate_control', '~> 0.2'
   gem 'faker', '~> 1.9'
   gem 'microformats', '~> 4.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 3b488710b0..5bec39a01f 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -126,7 +126,7 @@ GEM
       sshkit (~> 1.3)
     capistrano-yarn (2.0.2)
       capistrano (~> 3.0)
-    capybara (3.12.0)
+    capybara (3.13.2)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
@@ -669,7 +669,7 @@ DEPENDENCIES
   capistrano-rails (~> 1.4)
   capistrano-rbenv (~> 2.1)
   capistrano-yarn (~> 2.0)
-  capybara (~> 3.12)
+  capybara (~> 3.13)
   charlock_holmes (~> 0.7.6)
   chewy (~> 5.0)
   cld3 (~> 3.2.3)
-- 
GitLab


From d14c276e58f0f223b0e4889d342a948c961081b2 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sun, 3 Feb 2019 03:59:51 +0100
Subject: [PATCH 010/192] Add option to overwrite imported data (#9962)

* Add option to overwrite imported data

Fix #7465

* Add import for domain blocks
---
 app/models/account_domain_block.rb            |  1 +
 app/models/concerns/domain_normalizable.rb    |  2 +-
 app/models/export.rb                          |  1 +
 app/models/import.rb                          | 14 ++-
 app/services/import_service.rb                | 90 +++++++++++++++++++
 app/views/settings/imports/show.html.haml     |  7 +-
 app/workers/import/relationship_worker.rb     |  8 +-
 app/workers/import_worker.rb                  | 38 +-------
 config/locales/en.yml                         |  6 ++
 ...20190201012802_add_overwrite_to_imports.rb | 17 ++++
 db/schema.rb                                  |  3 +-
 .../concerns/account_interactions_spec.rb     |  4 +-
 12 files changed, 148 insertions(+), 43 deletions(-)
 create mode 100644 app/services/import_service.rb
 create mode 100644 db/migrate/20190201012802_add_overwrite_to_imports.rb

diff --git a/app/models/account_domain_block.rb b/app/models/account_domain_block.rb
index e352000c3a..7c0d60379e 100644
--- a/app/models/account_domain_block.rb
+++ b/app/models/account_domain_block.rb
@@ -12,6 +12,7 @@
 
 class AccountDomainBlock < ApplicationRecord
   include Paginable
+  include DomainNormalizable
 
   belongs_to :account
   validates :domain, presence: true, uniqueness: { scope: :account_id }
diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb
index dff3e5414f..fb84058fc2 100644
--- a/app/models/concerns/domain_normalizable.rb
+++ b/app/models/concerns/domain_normalizable.rb
@@ -10,6 +10,6 @@ module DomainNormalizable
   private
 
   def normalize_domain
-    self.domain = TagManager.instance.normalize_domain(domain)
+    self.domain = TagManager.instance.normalize_domain(domain&.strip)
   end
 end
diff --git a/app/models/export.rb b/app/models/export.rb
index a2520e9c24..fc4bb69648 100644
--- a/app/models/export.rb
+++ b/app/models/export.rb
@@ -1,4 +1,5 @@
 # frozen_string_literal: true
+
 require 'csv'
 
 class Export
diff --git a/app/models/import.rb b/app/models/import.rb
index 55e970b0d8..a7a0d80657 100644
--- a/app/models/import.rb
+++ b/app/models/import.rb
@@ -13,20 +13,30 @@
 #  data_file_size    :integer
 #  data_updated_at   :datetime
 #  account_id        :bigint(8)        not null
+#  overwrite         :boolean          default(FALSE), not null
 #
 
 class Import < ApplicationRecord
-  FILE_TYPES = ['text/plain', 'text/csv'].freeze
+  FILE_TYPES = %w(text/plain text/csv).freeze
+  MODES = %i(merge overwrite).freeze
 
   self.inheritance_column = false
 
   belongs_to :account
 
-  enum type: [:following, :blocking, :muting]
+  enum type: [:following, :blocking, :muting, :domain_blocking]
 
   validates :type, presence: true
 
   has_attached_file :data
   validates_attachment_content_type :data, content_type: FILE_TYPES
   validates_attachment_presence :data
+
+  def mode
+    overwrite? ? :overwrite : :merge
+  end
+
+  def mode=(str)
+    self.overwrite = str.to_sym == :overwrite
+  end
 end
diff --git a/app/services/import_service.rb b/app/services/import_service.rb
new file mode 100644
index 0000000000..3f558626e6
--- /dev/null
+++ b/app/services/import_service.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+require 'csv'
+
+class ImportService < BaseService
+  ROWS_PROCESSING_LIMIT = 20_000
+
+  def call(import)
+    @import  = import
+    @account = @import.account
+    @data    = CSV.new(import_data).reject(&:blank?)
+
+    case @import.type
+    when 'following'
+      import_follows!
+    when 'blocking'
+      import_blocks!
+    when 'muting'
+      import_mutes!
+    when 'domain_blocking'
+      import_domain_blocks!
+    end
+  end
+
+  private
+
+  def import_follows!
+    import_relationships!('follow', 'unfollow', @account.following, follow_limit)
+  end
+
+  def import_blocks!
+    import_relationships!('block', 'unblock', @account.blocking, ROWS_PROCESSING_LIMIT)
+  end
+
+  def import_mutes!
+    import_relationships!('mute', 'unmute', @account.muting, ROWS_PROCESSING_LIMIT)
+  end
+
+  def import_domain_blocks!
+    items = @data.take(ROWS_PROCESSING_LIMIT).map { |row| row.first.strip }
+
+    if @import.overwrite?
+      presence_hash = items.each_with_object({}) { |id, mapping| mapping[id] = true }
+
+      @account.domain_blocks.find_each do |domain_block|
+        if presence_hash[domain_block.domain]
+          items.delete(domain_block.domain)
+        else
+          @account.unblock_domain!(domain_block.domain)
+        end
+      end
+    end
+
+    items.each do |domain|
+      @account.block_domain!(domain)
+    end
+
+    AfterAccountDomainBlockWorker.push_bulk(items) do |domain|
+      [@account.id, domain]
+    end
+  end
+
+  def import_relationships!(action, undo_action, overwrite_scope, limit)
+    items = @data.take(limit).map { |row| row.first.strip }
+
+    if @import.overwrite?
+      presence_hash = items.each_with_object({}) { |id, mapping| mapping[id] = true }
+
+      overwrite_scope.find_each do |target_account|
+        if presence_hash[target_account.acct]
+          items.delete(target_account.acct)
+        else
+          Import::RelationshipWorker.perform_async(@account.id, target_account.acct, undo_action)
+        end
+      end
+    end
+
+    Import::RelationshipWorker.push_bulk(items) do |acct|
+      [@account.id, acct, action]
+    end
+  end
+
+  def import_data
+    Paperclip.io_adapters.for(@import.data).read
+  end
+
+  def follow_limit
+    FollowLimitValidator.limit_for_account(@account)
+  end
+end
diff --git a/app/views/settings/imports/show.html.haml b/app/views/settings/imports/show.html.haml
index 4512fc714d..7bb4beb01c 100644
--- a/app/views/settings/imports/show.html.haml
+++ b/app/views/settings/imports/show.html.haml
@@ -5,8 +5,11 @@
   .field-group
     = f.input :type, collection: Import.types.keys, wrapper: :with_block_label, include_blank: false, label_method: lambda { |type| I18n.t("imports.types.#{type}") }, hint: t('imports.preface')
 
-  .field-group
-    = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data')
+  .fields-row
+    .fields-group.fields-row__column.fields-row__column-6
+      = f.input :data, wrapper: :with_block_label, hint: t('simple_form.hints.imports.data')
+    .fields-group.fields-row__column.fields-row__column-6
+      = f.input :mode, as: :radio_buttons, collection: Import::MODES, label_method: lambda { |mode| safe_join([I18n.t("imports.modes.#{mode}"), content_tag(:span, I18n.t("imports.modes.#{mode}_long"), class: 'hint')]) }, collection_wrapper_tag: 'ul', item_wrapper_tag: 'li'
 
   .actions
     = f.button :button, t('imports.upload'), type: :submit
diff --git a/app/workers/import/relationship_worker.rb b/app/workers/import/relationship_worker.rb
index 1dd8bf8fbb..e9db20a463 100644
--- a/app/workers/import/relationship_worker.rb
+++ b/app/workers/import/relationship_worker.rb
@@ -13,11 +13,17 @@ class Import::RelationshipWorker
 
     case relationship
     when 'follow'
-      FollowService.new.call(from_account, target_account.acct)
+      FollowService.new.call(from_account, target_account)
+    when 'unfollow'
+      UnfollowService.new.call(from_account, target_account)
     when 'block'
       BlockService.new.call(from_account, target_account)
+    when 'unblock'
+      UnblockService.new.call(from_account, target_account)
     when 'mute'
       MuteService.new.call(from_account, target_account)
+    when 'unmute'
+      UnmuteService.new.call(from_account, target_account)
     end
   rescue ActiveRecord::RecordNotFound
     true
diff --git a/app/workers/import_worker.rb b/app/workers/import_worker.rb
index aeb221cf68..dfa71b29ec 100644
--- a/app/workers/import_worker.rb
+++ b/app/workers/import_worker.rb
@@ -1,44 +1,14 @@
 # frozen_string_literal: true
 
-require 'csv'
-
 class ImportWorker
   include Sidekiq::Worker
 
   sidekiq_options queue: 'pull', retry: false
 
-  attr_reader :import
-
   def perform(import_id)
-    @import = Import.find(import_id)
-
-    Import::RelationshipWorker.push_bulk(import_rows) do |row|
-      [@import.account_id, row.first, relationship_type]
-    end
-
-    @import.destroy
-  end
-
-  private
-
-  def import_contents
-    Paperclip.io_adapters.for(@import.data).read
-  end
-
-  def relationship_type
-    case @import.type
-    when 'following'
-      'follow'
-    when 'blocking'
-      'block'
-    when 'muting'
-      'mute'
-    end
-  end
-
-  def import_rows
-    rows = CSV.new(import_contents).reject(&:blank?)
-    rows = rows.take(FollowLimitValidator.limit_for_account(@import.account)) if @import.type == 'following'
-    rows
+    import = Import.find(import_id)
+    ImportService.new.call(import)
+  ensure
+    import&.destroy
   end
 end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c7ef36598a..f23f867e5c 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -628,10 +628,16 @@ en:
       one: Something isn't quite right yet! Please review the error below
       other: Something isn't quite right yet! Please review %{count} errors below
   imports:
+    modes:
+      merge: Merge
+      merge_long: Keep existing records and add new ones
+      overwrite: Overwrite
+      overwrite_long: Replace current records with the new ones
     preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking.
     success: Your data was successfully uploaded and will now be processed in due time
     types:
       blocking: Blocking list
+      domain_blocking: Domain blocking list
       following: Following list
       muting: Muting list
     upload: Upload
diff --git a/db/migrate/20190201012802_add_overwrite_to_imports.rb b/db/migrate/20190201012802_add_overwrite_to_imports.rb
new file mode 100644
index 0000000000..89b262cc72
--- /dev/null
+++ b/db/migrate/20190201012802_add_overwrite_to_imports.rb
@@ -0,0 +1,17 @@
+require Rails.root.join('lib', 'mastodon', 'migration_helpers')
+
+class AddOverwriteToImports < ActiveRecord::Migration[5.2]
+  include Mastodon::MigrationHelpers
+
+  disable_ddl_transaction!
+
+  def up
+    safety_assured do
+      add_column_with_default :imports, :overwrite, :boolean, default: false, allow_null: false
+    end
+  end
+
+  def down
+    remove_column :imports, :overwrite, :boolean
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 3487adf088..44e00df405 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2019_01_17_114553) do
+ActiveRecord::Schema.define(version: 2019_02_01_012802) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -290,6 +290,7 @@ ActiveRecord::Schema.define(version: 2019_01_17_114553) do
     t.integer "data_file_size"
     t.datetime "data_updated_at"
     t.bigint "account_id", null: false
+    t.boolean "overwrite", default: false, null: false
   end
 
   create_table "invites", force: :cascade do |t|
diff --git a/spec/models/concerns/account_interactions_spec.rb b/spec/models/concerns/account_interactions_spec.rb
index 8df52b7706..e8ef61f66c 100644
--- a/spec/models/concerns/account_interactions_spec.rb
+++ b/spec/models/concerns/account_interactions_spec.rb
@@ -237,9 +237,9 @@ describe AccountInteractions do
   end
 
   describe '#block_domain!' do
-    let(:domain_block) { Fabricate(:domain_block) }
+    let(:domain) { 'example.com' }
 
-    subject { account.block_domain!(domain_block) }
+    subject { account.block_domain!(domain) }
 
     it 'creates and returns AccountDomainBlock' do
       expect do
-- 
GitLab


From 364f2ff9aa2b4bf601d68a12bce758aeb5530467 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 4 Feb 2019 04:25:59 +0100
Subject: [PATCH 011/192] Add featured hashtags to profiles (#9755)

* Add hashtag filter to profiles

GET /@:username/tagged/:hashtag
GET /api/v1/accounts/:id/statuses?tagged=:hashtag

* Display featured hashtags on public profile

* Use separate model for featured tags

* Update featured hashtag counters on-write

* Limit featured tags to 10
---
 app/controllers/accounts_controller.rb        | 14 ++++-
 .../api/v1/accounts/statuses_controller.rb    |  5 ++
 .../settings/featured_tags_controller.rb      | 51 +++++++++++++++++++
 .../settings/profiles_controller.rb           |  2 +-
 .../settings/sessions_controller.rb           |  1 +
 app/javascript/styles/mastodon/accounts.scss  |  4 ++
 app/javascript/styles/mastodon/admin.scss     |  7 ++-
 app/javascript/styles/mastodon/widgets.scss   |  7 ++-
 app/models/concerns/account_associations.rb   |  1 +
 app/models/featured_tag.rb                    | 46 +++++++++++++++++
 app/models/tag.rb                             |  2 +
 app/services/process_hashtags_service.rb      | 12 ++++-
 app/services/remove_status_service.rb         |  4 ++
 app/views/accounts/show.html.haml             | 13 +++++
 .../settings/featured_tags/index.html.haml    | 27 ++++++++++
 config/locales/en.yml                         |  5 ++
 config/locales/simple_form.en.yml             |  4 ++
 config/navigation.rb                          |  1 +
 config/routes.rb                              |  2 +
 ...5102658_create_account_moderation_notes.rb |  1 +
 .../20190203180359_create_featured_tags.rb    | 12 +++++
 db/schema.rb                                  | 15 +++++-
 spec/fabricators/featured_tag_fabricator.rb   |  6 +++
 spec/models/featured_tag_spec.rb              |  4 ++
 24 files changed, 238 insertions(+), 8 deletions(-)
 create mode 100644 app/controllers/settings/featured_tags_controller.rb
 create mode 100644 app/models/featured_tag.rb
 create mode 100644 app/views/settings/featured_tags/index.html.haml
 create mode 100644 db/migrate/20190203180359_create_featured_tags.rb
 create mode 100644 spec/fabricators/featured_tag_fabricator.rb
 create mode 100644 spec/models/featured_tag_spec.rb

diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index f788a90789..6e3a23073b 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -57,6 +57,7 @@ class AccountsController < ApplicationController
 
   def filtered_statuses
     default_statuses.tap do |statuses|
+      statuses.merge!(hashtag_scope)    if tag_requested?
       statuses.merge!(only_media_scope) if media_requested?
       statuses.merge!(no_replies_scope) unless replies_requested?
     end
@@ -78,12 +79,15 @@ class AccountsController < ApplicationController
     Status.without_replies
   end
 
+  def hashtag_scope
+    Status.tagged_with(Tag.find_by(name: params[:tag].downcase)&.id)
+  end
+
   def set_account
     @account = Account.find_local!(params[:username])
   end
 
   def older_url
-    ::Rails.logger.info("older: max_id #{@statuses.last.id}, url #{pagination_url(max_id: @statuses.last.id)}")
     pagination_url(max_id: @statuses.last.id)
   end
 
@@ -92,7 +96,9 @@ class AccountsController < ApplicationController
   end
 
   def pagination_url(max_id: nil, min_id: nil)
-    if media_requested?
+    if tag_requested?
+      short_account_tag_url(@account, params[:tag], max_id: max_id, min_id: min_id)
+    elsif media_requested?
       short_account_media_url(@account, max_id: max_id, min_id: min_id)
     elsif replies_requested?
       short_account_with_replies_url(@account, max_id: max_id, min_id: min_id)
@@ -109,6 +115,10 @@ class AccountsController < ApplicationController
     request.path.ends_with?('/with_replies')
   end
 
+  def tag_requested?
+    request.path.ends_with?("/tagged/#{params[:tag]}")
+  end
+
   def filtered_status_page(params)
     if params[:min_id].present?
       filtered_statuses.paginate_by_min_id(PAGE_SIZE, params[:min_id]).reverse
diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 6c2a5c1414..6fdc827cb2 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -33,6 +33,7 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
     statuses.merge!(only_media_scope) if truthy_param?(:only_media)
     statuses.merge!(no_replies_scope) if truthy_param?(:exclude_replies)
     statuses.merge!(no_reblogs_scope) if truthy_param?(:exclude_reblogs)
+    statuses.merge!(hashtag_scope)    if params[:tagged].present?
 
     statuses
   end
@@ -67,6 +68,10 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
     Status.without_reblogs
   end
 
+  def hashtag_scope
+    Status.tagged_with(Tag.find_by(name: params[:tagged])&.id)
+  end
+
   def pagination_params(core_params)
     params.slice(:limit, :only_media, :exclude_replies).permit(:limit, :only_media, :exclude_replies).merge(core_params)
   end
diff --git a/app/controllers/settings/featured_tags_controller.rb b/app/controllers/settings/featured_tags_controller.rb
new file mode 100644
index 0000000000..19815e4168
--- /dev/null
+++ b/app/controllers/settings/featured_tags_controller.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+class Settings::FeaturedTagsController < Settings::BaseController
+  layout 'admin'
+
+  before_action :authenticate_user!
+  before_action :set_featured_tags, only: :index
+  before_action :set_featured_tag, except: [:index, :create]
+  before_action :set_most_used_tags, only: :index
+
+  def index
+    @featured_tag = FeaturedTag.new
+  end
+
+  def create
+    @featured_tag = current_account.featured_tags.new(featured_tag_params)
+    @featured_tag.reset_data
+
+    if @featured_tag.save
+      redirect_to settings_featured_tags_path
+    else
+      set_featured_tags
+      set_most_used_tags
+
+      render :index
+    end
+  end
+
+  def destroy
+    @featured_tag.destroy!
+    redirect_to settings_featured_tags_path
+  end
+
+  private
+
+  def set_featured_tag
+    @featured_tag = current_account.featured_tags.find(params[:id])
+  end
+
+  def set_featured_tags
+    @featured_tags = current_account.featured_tags.reject(&:new_record?)
+  end
+
+  def set_most_used_tags
+    @most_used_tags = Tag.most_used(current_account).where.not(id: @featured_tags.map(&:id)).limit(10)
+  end
+
+  def featured_tag_params
+    params.require(:featured_tag).permit(:name)
+  end
+end
diff --git a/app/controllers/settings/profiles_controller.rb b/app/controllers/settings/profiles_controller.rb
index db9081fdf0..8b640cdca1 100644
--- a/app/controllers/settings/profiles_controller.rb
+++ b/app/controllers/settings/profiles_controller.rb
@@ -32,6 +32,6 @@ class Settings::ProfilesController < Settings::BaseController
   end
 
   def set_account
-    @account = current_user.account
+    @account = current_account
   end
 end
diff --git a/app/controllers/settings/sessions_controller.rb b/app/controllers/settings/sessions_controller.rb
index 11b150ffd3..84ebb21f2c 100644
--- a/app/controllers/settings/sessions_controller.rb
+++ b/app/controllers/settings/sessions_controller.rb
@@ -1,6 +1,7 @@
 # frozen_string_literal: true
 
 class Settings::SessionsController < Settings::BaseController
+  before_action :authenticate_user!
   before_action :set_session, only: :destroy
 
   def destroy
diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss
index 63a5c61b8b..f4f458cf42 100644
--- a/app/javascript/styles/mastodon/accounts.scss
+++ b/app/javascript/styles/mastodon/accounts.scss
@@ -288,3 +288,7 @@
     border-bottom: 0;
   }
 }
+
+.directory__tag .trends__item__current {
+  width: auto;
+}
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index 177f8145fa..6d785707c9 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -153,10 +153,15 @@ $content-width: 840px;
       font-weight: 500;
     }
 
-    .directory__tag a {
+    .directory__tag > a,
+    .directory__tag > div {
       box-shadow: none;
     }
 
+    .directory__tag .table-action-link .fa {
+      color: inherit;
+    }
+
     .directory__tag h4 {
       font-size: 18px;
       font-weight: 700;
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index c97337e4e3..1eaf30c5b3 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -269,7 +269,8 @@
     box-sizing: border-box;
     margin-bottom: 10px;
 
-    a {
+    & > a,
+    & > div {
       display: flex;
       align-items: center;
       justify-content: space-between;
@@ -279,7 +280,9 @@
       text-decoration: none;
       color: inherit;
       box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
+    }
 
+    & > a {
       &:hover,
       &:active,
       &:focus {
@@ -287,7 +290,7 @@
       }
     }
 
-    &.active a {
+    &.active > a {
       background: $ui-highlight-color;
       cursor: default;
     }
diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb
index 7dafeee34c..397ec4a22a 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -55,5 +55,6 @@ module AccountAssociations
 
     # Hashtags
     has_and_belongs_to_many :tags
+    has_many :featured_tags, -> { includes(:tag) }, dependent: :destroy, inverse_of: :account
   end
 end
diff --git a/app/models/featured_tag.rb b/app/models/featured_tag.rb
new file mode 100644
index 0000000000..b5a10ad2da
--- /dev/null
+++ b/app/models/featured_tag.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: featured_tags
+#
+#  id             :bigint(8)        not null, primary key
+#  account_id     :bigint(8)
+#  tag_id         :bigint(8)
+#  statuses_count :bigint(8)        default(0), not null
+#  last_status_at :datetime
+#  created_at     :datetime         not null
+#  updated_at     :datetime         not null
+#
+
+class FeaturedTag < ApplicationRecord
+  belongs_to :account, inverse_of: :featured_tags, required: true
+  belongs_to :tag, inverse_of: :featured_tags, required: true
+
+  delegate :name, to: :tag, allow_nil: true
+
+  validates :name, presence: true
+  validate :validate_featured_tags_limit, on: :create
+
+  def name=(str)
+    self.tag = Tag.find_or_initialize_by(name: str.delete('#').mb_chars.downcase.to_s)
+  end
+
+  def increment(timestamp)
+    update(statuses_count: statuses_count + 1, last_status_at: timestamp)
+  end
+
+  def decrement(deleted_status_id)
+    update(statuses_count: [0, statuses_count - 1].max, last_status_at: account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).where.not(id: deleted_status_id).select(:created_at).first&.created_at)
+  end
+
+  def reset_data
+    self.statuses_count = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).count
+    self.last_status_at = account.statuses.where(visibility: %i(public unlisted)).tagged_with(tag).select(:created_at).first&.created_at
+  end
+
+  private
+
+  def validate_featured_tags_limit
+    errors.add(:base, I18n.t('featured_tags.errors.limit')) if account.featured_tags.count >= 10
+  end
+end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 99830ae92c..4373e967b2 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -14,6 +14,7 @@ class Tag < ApplicationRecord
   has_and_belongs_to_many :accounts
   has_and_belongs_to_many :sample_accounts, -> { searchable.discoverable.popular.limit(3) }, class_name: 'Account'
 
+  has_many :featured_tags, dependent: :destroy, inverse_of: :tag
   has_one :account_tag_stat, dependent: :destroy
 
   HASHTAG_NAME_RE = '[[:word:]_]*[[:alpha:]_·][[:word:]_]*'
@@ -23,6 +24,7 @@ class Tag < ApplicationRecord
 
   scope :discoverable, -> { joins(:account_tag_stat).where(AccountTagStat.arel_table[:accounts_count].gt(0)).where(account_tag_stats: { hidden: false }).order(Arel.sql('account_tag_stats.accounts_count desc')) }
   scope :hidden, -> { where(account_tag_stats: { hidden: true }) }
+  scope :most_used, ->(account) { joins(:statuses).where(statuses: { account: account }).group(:id).order(Arel.sql('count(*) desc')) }
 
   delegate :accounts_count,
            :accounts_count=,
diff --git a/app/services/process_hashtags_service.rb b/app/services/process_hashtags_service.rb
index cf7471c989..d5ec076a8b 100644
--- a/app/services/process_hashtags_service.rb
+++ b/app/services/process_hashtags_service.rb
@@ -2,12 +2,22 @@
 
 class ProcessHashtagsService < BaseService
   def call(status, tags = [])
-    tags = Extractor.extract_hashtags(status.text) if status.local?
+    tags    = Extractor.extract_hashtags(status.text) if status.local?
+    records = []
 
     tags.map { |str| str.mb_chars.downcase }.uniq(&:to_s).each do |name|
       tag = Tag.where(name: name).first_or_create(name: name)
+
       status.tags << tag
+      records << tag
+
       TrendingTags.record_use!(tag, status.account, status.created_at) if status.public_visibility?
     end
+
+    return unless status.public_visibility? || status.unlisted_visibility?
+
+    status.account.featured_tags.where(tag_id: records.map(&:id)).each do |featured_tag|
+      featured_tag.increment(status.created_at)
+    end
   end
 end
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index 28c5224b01..2012f15fc7 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -131,6 +131,10 @@ class RemoveStatusService < BaseService
   end
 
   def remove_from_hashtags
+    @account.featured_tags.where(tag_id: @status.tags.pluck(:id)).each do |featured_tag|
+      featured_tag.decrement(@status.id)
+    end
+
     return unless @status.public_visibility?
 
     @tags.each do |hashtag|
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index 0ee9dd7ded..23a595205c 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -63,4 +63,17 @@
         - @endorsed_accounts.each do |account|
           = account_link_to account
 
+    - @account.featured_tags.each do |featured_tag|
+      .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil }
+        = link_to short_account_tag_path(@account, featured_tag.tag) do
+          %h4
+            = fa_icon 'hashtag'
+            = featured_tag.name
+            %small
+              - if featured_tag.last_status_at.nil?
+                = t('accounts.nothing_here')
+              - else
+                %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at
+          .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true
+
     = render 'application/sidebar'
diff --git a/app/views/settings/featured_tags/index.html.haml b/app/views/settings/featured_tags/index.html.haml
new file mode 100644
index 0000000000..5f69517f3a
--- /dev/null
+++ b/app/views/settings/featured_tags/index.html.haml
@@ -0,0 +1,27 @@
+- content_for :page_title do
+  = t('settings.featured_tags')
+
+= simple_form_for @featured_tag, url: settings_featured_tags_path do |f|
+  = render 'shared/error_messages', object: @featured_tag
+
+  .fields-group
+    = f.input :name, wrapper: :with_block_label, hint: safe_join([t('simple_form.hints.featured_tag.name'), safe_join(@most_used_tags.map { |tag| link_to("##{tag.name}", settings_featured_tags_path(featured_tag: { name: tag.name }), method: :post) }, ', ')], ' ')
+
+  .actions
+    = f.button :button, t('featured_tags.add_new'), type: :submit
+
+%hr.spacer/
+
+- @featured_tags.each do |featured_tag|
+  .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil }
+    %div
+      %h4
+        = fa_icon 'hashtag'
+        = featured_tag.name
+        %small
+          - if featured_tag.last_status_at.nil?
+            = t('accounts.nothing_here')
+          - else
+            %time{ datetime: featured_tag.last_status_at.iso8601, title: l(featured_tag.last_status_at) }= l featured_tag.last_status_at
+          = table_link_to 'trash', t('filters.index.delete'), settings_featured_tag_path(featured_tag), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') }
+      .trends__item__current= number_to_human featured_tag.statuses_count, strip_insignificant_zeros: true
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f23f867e5c..c92fc781c8 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -588,6 +588,10 @@ en:
     lists: Lists
     mutes: You mute
     storage: Media storage
+  featured_tags:
+    add_new: Add new
+    errors:
+      limit: You have already featured the maximum amount of hashtags
   filters:
     contexts:
       home: Home timeline
@@ -807,6 +811,7 @@ en:
     development: Development
     edit_profile: Edit profile
     export: Data export
+    featured_tags: Featured hashtags
     followers: Authorized followers
     import: Import
     migrate: Account migration
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 325114755b..3a2746a539 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -37,6 +37,8 @@ en:
         setting_theme: Affects how Mastodon looks when you're logged in from any device.
         username: Your username will be unique on %{domain}
         whole_word: When the keyword or phrase is alphanumeric only, it will only be applied if it matches the whole word
+      featured_tag:
+        name: 'You might want to use one of these:'
       imports:
         data: CSV file exported from another Mastodon instance
       sessions:
@@ -110,6 +112,8 @@ en:
         username: Username
         username_or_email: Username or Email
         whole_word: Whole word
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Block notifications from non-followers
         must_be_following: Block notifications from people you don't follow
diff --git a/config/navigation.rb b/config/navigation.rb
index a9521f956d..1be621ac24 100644
--- a/config/navigation.rb
+++ b/config/navigation.rb
@@ -6,6 +6,7 @@ SimpleNavigation::Configuration.run do |navigation|
 
     primary.item :settings, safe_join([fa_icon('cog fw'), t('settings.settings')]), settings_profile_url do |settings|
       settings.item :profile, safe_join([fa_icon('user fw'), t('settings.edit_profile')]), settings_profile_url, highlights_on: %r{/settings/profile|/settings/migration}
+      settings.item :featured_tags, safe_join([fa_icon('hashtag fw'), t('settings.featured_tags')]), settings_featured_tags_url
       settings.item :preferences, safe_join([fa_icon('sliders fw'), t('settings.preferences')]), settings_preferences_url
       settings.item :notifications, safe_join([fa_icon('bell fw'), t('settings.notifications')]), settings_notifications_url
       settings.item :password, safe_join([fa_icon('lock fw'), t('auth.security')]), edit_user_registration_url, highlights_on: %r{/auth/edit|/settings/delete}
diff --git a/config/routes.rb b/config/routes.rb
index af49845ccb..ded62981d4 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -74,6 +74,7 @@ Rails.application.routes.draw do
   get '/@:username', to: 'accounts#show', as: :short_account
   get '/@:username/with_replies', to: 'accounts#show', as: :short_account_with_replies
   get '/@:username/media', to: 'accounts#show', as: :short_account_media
+  get '/@:username/tagged/:tag', to: 'accounts#show', as: :short_account_tag
   get '/@:account_username/:id', to: 'statuses#show', as: :short_account_status
   get '/@:account_username/:id/embed', to: 'statuses#embed', as: :embed_short_account_status
 
@@ -116,6 +117,7 @@ Rails.application.routes.draw do
     resource :migration, only: [:show, :update]
 
     resources :sessions, only: [:destroy]
+    resources :featured_tags, only: [:index, :create, :destroy]
   end
 
   resources :media, only: [:show] do
diff --git a/db/migrate/20171005102658_create_account_moderation_notes.rb b/db/migrate/20171005102658_create_account_moderation_notes.rb
index d1802b5b3c..974ed99403 100644
--- a/db/migrate/20171005102658_create_account_moderation_notes.rb
+++ b/db/migrate/20171005102658_create_account_moderation_notes.rb
@@ -7,6 +7,7 @@ class CreateAccountModerationNotes < ActiveRecord::Migration[5.1]
 
       t.timestamps
     end
+
     add_foreign_key :account_moderation_notes, :accounts, column: :target_account_id
   end
 end
diff --git a/db/migrate/20190203180359_create_featured_tags.rb b/db/migrate/20190203180359_create_featured_tags.rb
new file mode 100644
index 0000000000..b08410a3a7
--- /dev/null
+++ b/db/migrate/20190203180359_create_featured_tags.rb
@@ -0,0 +1,12 @@
+class CreateFeaturedTags < ActiveRecord::Migration[5.2]
+  def change
+    create_table :featured_tags do |t|
+      t.references :account, foreign_key: { on_delete: :cascade }
+      t.references :tag, foreign_key: { on_delete: :cascade }
+      t.bigint :statuses_count, default: 0, null: false
+      t.datetime :last_status_at
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 44e00df405..e9fb358f80 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 2019_02_01_012802) do
+ActiveRecord::Schema.define(version: 2019_02_03_180359) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -250,6 +250,17 @@ ActiveRecord::Schema.define(version: 2019_02_01_012802) do
     t.index ["status_id"], name: "index_favourites_on_status_id"
   end
 
+  create_table "featured_tags", force: :cascade do |t|
+    t.bigint "account_id"
+    t.bigint "tag_id"
+    t.bigint "statuses_count", default: 0, null: false
+    t.datetime "last_status_at"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["account_id"], name: "index_featured_tags_on_account_id"
+    t.index ["tag_id"], name: "index_featured_tags_on_tag_id"
+  end
+
   create_table "follow_requests", force: :cascade do |t|
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
@@ -708,6 +719,8 @@ ActiveRecord::Schema.define(version: 2019_02_01_012802) do
   add_foreign_key "custom_filters", "accounts", on_delete: :cascade
   add_foreign_key "favourites", "accounts", name: "fk_5eb6c2b873", on_delete: :cascade
   add_foreign_key "favourites", "statuses", name: "fk_b0e856845e", on_delete: :cascade
+  add_foreign_key "featured_tags", "accounts", on_delete: :cascade
+  add_foreign_key "featured_tags", "tags", on_delete: :cascade
   add_foreign_key "follow_requests", "accounts", column: "target_account_id", name: "fk_9291ec025d", on_delete: :cascade
   add_foreign_key "follow_requests", "accounts", name: "fk_76d644b0e7", on_delete: :cascade
   add_foreign_key "follows", "accounts", column: "target_account_id", name: "fk_745ca29eac", on_delete: :cascade
diff --git a/spec/fabricators/featured_tag_fabricator.rb b/spec/fabricators/featured_tag_fabricator.rb
new file mode 100644
index 0000000000..25cbdaac0b
--- /dev/null
+++ b/spec/fabricators/featured_tag_fabricator.rb
@@ -0,0 +1,6 @@
+Fabricator(:featured_tag) do
+  account
+  tag
+  statuses_count 1_337
+  last_status_at Time.now.utc
+end
diff --git a/spec/models/featured_tag_spec.rb b/spec/models/featured_tag_spec.rb
new file mode 100644
index 0000000000..07533e0b90
--- /dev/null
+++ b/spec/models/featured_tag_spec.rb
@@ -0,0 +1,4 @@
+require 'rails_helper'
+
+RSpec.describe FeaturedTag, type: :model do
+end
-- 
GitLab


From f86413fce29e70532fbbe5eab9ee8ff053f5552c Mon Sep 17 00:00:00 2001
From: mike castleman <m@mlcastle.net>
Date: Mon, 4 Feb 2019 01:45:29 -0200
Subject: [PATCH 012/192] change "finish tutorial" text to "finish toot-orial"
 (#9905)

---
 app/javascript/mastodon/features/introduction/index.js | 2 +-
 app/javascript/mastodon/locales/defaultMessages.json   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js
index e712b2f7d4..754477bb99 100644
--- a/app/javascript/mastodon/features/introduction/index.js
+++ b/app/javascript/mastodon/features/introduction/index.js
@@ -89,7 +89,7 @@ const FrameInteractions = ({ onNext }) => (
     </div>
 
     <div className='introduction__action'>
-      <button className='button' onClick={onNext}><FormattedMessage id='introduction.interactions.action' defaultMessage='Finish tutorial!' /></button>
+      <button className='button' onClick={onNext}><FormattedMessage id='introduction.interactions.action' defaultMessage='Finish toot-orial!' /></button>
     </div>
   </div>
 );
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 89d4e6bbaa..2dc755e0f5 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1457,7 +1457,7 @@
         "id": "introduction.interactions.favourite.text"
       },
       {
-        "defaultMessage": "Finish tutorial!",
+        "defaultMessage": "Finish toot-orial!",
         "id": "introduction.interactions.action"
       }
     ],
-- 
GitLab


From c78d64d9c399d58a49aa92fbb2c607bb681ef5a0 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Mon, 4 Feb 2019 12:46:05 +0900
Subject: [PATCH 013/192] Use video filesize limit with gifv (#9924)

---
 app/models/media_attachment.rb | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/models/media_attachment.rb b/app/models/media_attachment.rb
index 2e0f98cc6f..a57ba0b2ea 100644
--- a/app/models/media_attachment.rb
+++ b/app/models/media_attachment.rb
@@ -87,8 +87,8 @@ class MediaAttachment < ApplicationRecord
                     convert_options: { all: '-quality 90 -strip' }
 
   validates_attachment_content_type :file, content_type: IMAGE_MIME_TYPES + VIDEO_MIME_TYPES
-  validates_attachment_size :file, less_than: IMAGE_LIMIT, unless: :video?
-  validates_attachment_size :file, less_than: VIDEO_LIMIT, if: :video?
+  validates_attachment_size :file, less_than: IMAGE_LIMIT, unless: :video_or_gifv?
+  validates_attachment_size :file, less_than: VIDEO_LIMIT, if: :video_or_gifv?
   remotable_attachment :file, VIDEO_LIMIT
 
   include Attachmentable
@@ -111,6 +111,10 @@ class MediaAttachment < ApplicationRecord
     file.blank? && remote_url.present?
   end
 
+  def video_or_gifv?
+    video? || gifv?
+  end
+
   def to_param
     shortcode
   end
-- 
GitLab


From 88f35f339d19eed87bb3b55ebd5ed2303726aa78 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Tue, 5 Feb 2019 06:25:42 +0900
Subject: [PATCH 014/192] Fix authorized applications list page design (#9969)

---
 app/controllers/oauth/authorized_applications_controller.rb | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/app/controllers/oauth/authorized_applications_controller.rb b/app/controllers/oauth/authorized_applications_controller.rb
index 0c28d194bc..f3d2353669 100644
--- a/app/controllers/oauth/authorized_applications_controller.rb
+++ b/app/controllers/oauth/authorized_applications_controller.rb
@@ -5,6 +5,7 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
 
   before_action :store_current_location
   before_action :authenticate_resource_owner!
+  before_action :set_body_classes
 
   include Localized
 
@@ -15,6 +16,10 @@ class Oauth::AuthorizedApplicationsController < Doorkeeper::AuthorizedApplicatio
 
   private
 
+  def set_body_classes
+    @body_classes = 'admin'
+  end
+
   def store_current_location
     store_location_for(:user, request.url)
   end
-- 
GitLab


From e02a13f64e5c2c93fa73a67a4ce32a7d1df24760 Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Tue, 5 Feb 2019 07:14:57 +0900
Subject: [PATCH 015/192] Fix not showing custom emojis in share page emoji
 picker (#9970)

---
 app/javascript/mastodon/containers/compose_container.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/javascript/mastodon/containers/compose_container.js b/app/javascript/mastodon/containers/compose_container.js
index 5ee1d2f141..7bc7bbaa4d 100644
--- a/app/javascript/mastodon/containers/compose_container.js
+++ b/app/javascript/mastodon/containers/compose_container.js
@@ -7,6 +7,7 @@ import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from '../locales';
 import Compose from '../features/standalone/compose';
 import initialState from '../initial_state';
+import { fetchCustomEmojis } from '../actions/custom_emojis';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
@@ -17,6 +18,8 @@ if (initialState) {
   store.dispatch(hydrateStore(initialState));
 }
 
+store.dispatch(fetchCustomEmojis());
+
 export default class TimelineContainer extends React.PureComponent {
 
   static propTypes = {
-- 
GitLab


From 2557cb2f9550f7ab0cd6e6f392642b5249589ed8 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Tue, 5 Feb 2019 00:27:18 +0100
Subject: [PATCH 016/192] Fix pinned statuses being shown in a featured hashtag
 (#9971)

---
 app/controllers/accounts_controller.rb               | 2 +-
 app/controllers/settings/featured_tags_controller.rb | 2 +-
 app/views/accounts/show.html.haml                    | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index 6e3a23073b..cbf1a8287b 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -52,7 +52,7 @@ class AccountsController < ApplicationController
   private
 
   def show_pinned_statuses?
-    [replies_requested?, media_requested?, params[:max_id].present?, params[:min_id].present?].none?
+    [replies_requested?, media_requested?, tag_requested?, params[:max_id].present?, params[:min_id].present?].none?
   end
 
   def filtered_statuses
diff --git a/app/controllers/settings/featured_tags_controller.rb b/app/controllers/settings/featured_tags_controller.rb
index 19815e4168..3a3241425d 100644
--- a/app/controllers/settings/featured_tags_controller.rb
+++ b/app/controllers/settings/featured_tags_controller.rb
@@ -38,7 +38,7 @@ class Settings::FeaturedTagsController < Settings::BaseController
   end
 
   def set_featured_tags
-    @featured_tags = current_account.featured_tags.reject(&:new_record?)
+    @featured_tags = current_account.featured_tags.order(statuses_count: :desc).reject(&:new_record?)
   end
 
   def set_most_used_tags
diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml
index 23a595205c..0da69728f3 100644
--- a/app/views/accounts/show.html.haml
+++ b/app/views/accounts/show.html.haml
@@ -63,7 +63,7 @@
         - @endorsed_accounts.each do |account|
           = account_link_to account
 
-    - @account.featured_tags.each do |featured_tag|
+    - @account.featured_tags.order(statuses_count: :desc).each do |featured_tag|
       .directory__tag{ class: params[:tag] == featured_tag.name ? 'active' : nil }
         = link_to short_account_tag_path(@account, featured_tag.tag) do
           %h4
-- 
GitLab


From 76d41475a89ebdd19b08b9e8a81e5e3c7dbd4001 Mon Sep 17 00:00:00 2001
From: trwnh <a@trwnh.com>
Date: Mon, 4 Feb 2019 21:46:18 -0600
Subject: [PATCH 017/192] [UI] Fix whitespace being applied to div instead of p
 (#9968)

* fix large line breaks

* fix ascii art posts
---
 app/javascript/styles/mastodon/components.scss | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 10e0946481..32fd773859 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -638,7 +638,6 @@
   font-weight: 400;
   overflow: hidden;
   text-overflow: ellipsis;
-  white-space: pre-wrap;
   padding-top: 2px;
   color: $primary-text-color;
 
@@ -662,6 +661,7 @@
 
   p {
     margin-bottom: 20px;
+    white-space: pre-wrap;
 
     &:last-child {
       margin-bottom: 0;
-- 
GitLab


From 5c873a4ed7d4abb8c684e3a8ed3cdf9383e77be5 Mon Sep 17 00:00:00 2001
From: ashleyhull-versent <ashley.hull@versent.com.au>
Date: Tue, 5 Feb 2019 15:11:51 +1100
Subject: [PATCH 018/192] Update Dockerfile (#9965)

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 1909053375..1e60045c01 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 FROM node:8.15-alpine as node
-FROM ruby:2.6-alpine3.8
+FROM ruby:2.6-alpine3.9
 
 LABEL maintainer="https://github.com/tootsuite/mastodon" \
       description="Your self-hosted, globally interconnected microblogging community"
-- 
GitLab


From 5bffb53a763531f6ed1d8e87bacede3ff0938086 Mon Sep 17 00:00:00 2001
From: Takeshi Umeda <noel.yoshiba@gmail.com>
Date: Tue, 5 Feb 2019 23:11:11 +0900
Subject: [PATCH 019/192] Fix it as tagged_request of accounts_controller is
 not addressable_uri (#9976)

---
 app/controllers/accounts_controller.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index cbf1a8287b..cad2ecf3fe 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -116,7 +116,7 @@ class AccountsController < ApplicationController
   end
 
   def tag_requested?
-    request.path.ends_with?("/tagged/#{params[:tag]}")
+    request.path.ends_with?(Addressable::URI.parse("/tagged/#{params[:tag]}").normalize)
   end
 
   def filtered_status_page(params)
-- 
GitLab


From 1ac9a3f4bb8d1fb4bf521f9452ebc839d44315ba Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Tue, 5 Feb 2019 15:11:35 +0100
Subject: [PATCH 020/192] =?UTF-8?q?Hide=20misleading=20=E2=80=9CYou=20will?=
 =?UTF-8?q?=20be=20sent=20a=20confirmation=20e-mail=E2=80=9D=20hint=20from?=
 =?UTF-8?q?=20admin=20view=20(#9973)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Thanks @wryk for noticing this issue.
---
 app/views/admin/change_emails/show.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/admin/change_emails/show.html.haml b/app/views/admin/change_emails/show.html.haml
index 6febef9b1a..6ff0d785ed 100644
--- a/app/views/admin/change_emails/show.html.haml
+++ b/app/views/admin/change_emails/show.html.haml
@@ -3,7 +3,7 @@
 
 = simple_form_for @user, url: admin_account_change_email_path(@account.id) do |f|
   .fields-group
-    = f.input :email, wrapper: :with_label, disabled: true, label: t('admin.accounts.change_email.current_email')
+    = f.input :email, wrapper: :with_label, hint: false, disabled: true, label: t('admin.accounts.change_email.current_email')
 
   .fields-group
     = f.input :unconfirmed_email, wrapper: :with_label, label: t('admin.accounts.change_email.new_email')
-- 
GitLab


From 11d150285302211def8015d0bc1b825f9f7e0e23 Mon Sep 17 00:00:00 2001
From: J0WI <J0WI@users.noreply.github.com>
Date: Tue, 5 Feb 2019 15:12:45 +0100
Subject: [PATCH 021/192] Replace LibreSSL by OpenSSL (#9975)

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index 1e60045c01..184e25ca2c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -29,7 +29,7 @@ RUN apk -U upgrade \
     build-base \
     icu-dev \
     libidn-dev \
-    libressl \
+    openssl \
     libtool \
     libxml2-dev \
     libxslt-dev \
-- 
GitLab


From 26c1aba658d04617caf33783306b4504ca41f63c Mon Sep 17 00:00:00 2001
From: J0WI <J0WI@users.noreply.github.com>
Date: Tue, 5 Feb 2019 15:13:19 +0100
Subject: [PATCH 022/192] Do not use apk cache and upgrade (#9966)

---
 Dockerfile | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 184e25ca2c..2b15381ec5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -24,8 +24,7 @@ COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
 COPY --from=node /usr/local/bin/npm /usr/local/bin/npm
 COPY --from=node /opt/yarn-* /opt/yarn
 
-RUN apk -U upgrade \
- && apk add -t build-dependencies \
+RUN apk add --no-cache -t build-dependencies \
     build-base \
     icu-dev \
     libidn-dev \
@@ -36,7 +35,7 @@ RUN apk -U upgrade \
     postgresql-dev \
     protobuf-dev \
     python \
- && apk add \
+ && apk add --no-cache \
     ca-certificates \
     ffmpeg \
     file \
@@ -64,7 +63,7 @@ RUN apk -U upgrade \
  && make install \
  && libtool --finish /usr/local/lib \
  && cd /mastodon \
- && rm -rf /tmp/* /var/cache/apk/*
+ && rm -rf /tmp/*
 
 COPY Gemfile Gemfile.lock package.json yarn.lock .yarnclean /mastodon/
 
-- 
GitLab


From 3eb17a3beafbfa998f4d09f6d3310658195638d6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?marcin=20miko=C5=82ajczak?= <me@m4sk.in>
Date: Tue, 5 Feb 2019 15:13:34 +0100
Subject: [PATCH 023/192] =?UTF-8?q?i18n:=20Update=20Polish=20translation?=
 =?UTF-8?q?=20=F0=9F=87=B5=20(#9974)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Marcin Mikołajczak <me@m4sk.in>
---
 app/javascript/mastodon/locales/pl.json |  1 +
 config/locales/pl.yml                   | 11 +++++++++++
 config/locales/simple_form.pl.yml       |  6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 0d16f7cfc0..a1cda6c2d4 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -342,6 +342,7 @@
   "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.",
   "upload_area.title": "Przeciągnij i upuść aby wysłać",
   "upload_button.label": "Dodaj zawartość multimedialną (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "Przekroczono limit plików do wysłania.",
   "upload_form.description": "Wprowadź opis dla niewidomych i niedowidzących",
   "upload_form.focus": "Dopasuj podglÄ…d",
   "upload_form.undo": "Usuń",
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 188f5c22b9..e110db50de 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -602,6 +602,10 @@ pl:
     lists: Listy
     mutes: Wyciszeni
     storage: UrzÄ…dzenie przechowujÄ…ce dane
+  featured_tags:
+    add_new: Dodaj nowy
+    errors:
+      limit: Już przekroczyłeś(-aś) maksymalną liczbę wyróżnionych hashtagów
   filters:
     contexts:
       home: Strona główna
@@ -646,10 +650,16 @@ pl:
       one: Coś jest wciąż nie tak! Przyjrzyj się poniższemu błędowi
       other: Coś jest wciąż nie tak! Przejrzyj poniższe błędy (%{count})
   imports:
+    modes:
+      merge: Połącz
+      merge_long: Zachowaj obecne wpisy i dodaj nowe
+      overwrite: Nadpisz
+      overwrite_long: ZastÄ…p obecne wpisy nowymi
     preface: Możesz zaimportować pewne dane (np. lista kont, które śledzisz lub blokujesz) do swojego konta na tym serwerze, korzystając z danych wyeksportowanych z innego serwera.
     success: Twoje dane zostały załadowane i zostaną niebawem przetworzone
     types:
       blocking: Lista blokowanych
+      domain_blocking: Lista zablokowanych domen
       following: Lista śledzonych
       muting: Lista wyciszonych
     upload: Załaduj
@@ -825,6 +835,7 @@ pl:
     development: Tworzenie aplikacji
     edit_profile: Edytuj profil
     export: Eksportowanie danych
+    featured_tags: Wyróżnione hashtagi
     followers: Autoryzowani śledzący
     import: Importowanie danych
     migrate: Migracja konta
diff --git a/config/locales/simple_form.pl.yml b/config/locales/simple_form.pl.yml
index bbc55e8a91..0ab045068e 100644
--- a/config/locales/simple_form.pl.yml
+++ b/config/locales/simple_form.pl.yml
@@ -33,9 +33,12 @@ pl:
         setting_display_media_show_all: Zawsze pokazuj zawartość multimedialną jako wrażliwą
         setting_hide_network: Informacje o tym, kto Cię śledzi i kogo śledzisz nie będą widoczne
         setting_noindex: Wpływa na widoczność strony profilu i Twoich wpisów
+        setting_show_application: W informacjach o wpisie będzie widoczna informacja o aplikacji, z której został wysłany
         setting_theme: Zmienia wyglÄ…d Mastodona po zalogowaniu z dowolnego urzÄ…dzenia.
         username: Twoja nazwa użytkownika będzie niepowtarzalna na %{domain}
         whole_word: Jeśli słowo lub fraza składa się jedynie z liter lub cyfr, filtr będzie zastosowany tylko do pełnych wystąpień
+      featured_tag:
+        name: 'Sugerujemy użycie jednego z następujących:'
       imports:
         data: Plik CSV wyeksportowany z innej instancji Mastodona
       sessions:
@@ -101,6 +104,7 @@ pl:
         setting_hide_network: Ukryj swoją sieć
         setting_noindex: Nie indeksuj mojego profilu w wyszukiwarkach internetowych
         setting_reduce_motion: Ogranicz ruch w animacjach
+        setting_show_application: Informuj o aplikacji z której wysłano wpisy
         setting_system_font_ui: Używaj domyślnej czcionki systemu
         setting_theme: Motyw strony
         setting_unfollow_modal: Pytaj o potwierdzenie przed cofnięciem śledzenia
@@ -109,6 +113,8 @@ pl:
         username: Nazwa użytkownika
         username_or_email: Nazwa użytkownika lub adres e-mail
         whole_word: Całe słowo
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Nie wyświetlaj powiadomień od osób, które Cię nie śledzą
         must_be_following: Nie wyświetlaj powiadomień od osób, których nie śledzisz
-- 
GitLab


From 46e806cd2f14a5e45d66b4c23040855202818984 Mon Sep 17 00:00:00 2001
From: mayaeh <mayaeh@marimo-net.org>
Date: Wed, 6 Feb 2019 03:11:24 +0900
Subject: [PATCH 024/192] Rename from instance to server. (#9938)

---
 .../features/getting_started/index.js         |  2 +-
 .../features/public_timeline/index.js         |  2 +-
 .../features/ui/components/report_modal.js    |  2 +-
 .../mastodon/locales/defaultMessages.json     |  6 +--
 app/javascript/mastodon/locales/en.json       |  6 +--
 app/javascript/mastodon/locales/ja.json       |  8 ++--
 config/locales/devise.en.yml                  |  6 +--
 config/locales/devise.ja.yml                  |  6 +--
 config/locales/en.yml                         | 34 ++++++-------
 config/locales/ja.yml                         | 48 +++++++++----------
 config/locales/simple_form.en.yml             |  2 +-
 config/locales/simple_form.ja.yml             |  2 +-
 12 files changed, 62 insertions(+), 62 deletions(-)

diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index e277a73c7a..e1f84de276 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -160,7 +160,7 @@ class GettingStarted extends ImmutablePureComponent {
               {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
               {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>}
               <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>
-              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this instance' /></a> · </li>
+              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>
               <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>
               <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>
               <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>
diff --git a/app/javascript/mastodon/features/public_timeline/index.js b/app/javascript/mastodon/features/public_timeline/index.js
index d640033ebb..2b7d9c56f9 100644
--- a/app/javascript/mastodon/features/public_timeline/index.js
+++ b/app/javascript/mastodon/features/public_timeline/index.js
@@ -124,7 +124,7 @@ class PublicTimeline extends React.PureComponent {
           onLoadMore={this.handleLoadMore}
           trackScroll={!pinned}
           scrollKey={`public_timeline-${columnId}`}
-          emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other instances to fill it up' />}
+          emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />}
           shouldUpdateScroll={shouldUpdateScroll}
         />
       </Column>
diff --git a/app/javascript/mastodon/features/ui/components/report_modal.js b/app/javascript/mastodon/features/ui/components/report_modal.js
index bc6b18664a..2e41f784dd 100644
--- a/app/javascript/mastodon/features/ui/components/report_modal.js
+++ b/app/javascript/mastodon/features/ui/components/report_modal.js
@@ -97,7 +97,7 @@ class ReportModal extends ImmutablePureComponent {
 
         <div className='report-modal__container'>
           <div className='report-modal__comment'>
-            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:' /></p>
+            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p>
 
             <textarea
               className='setting-text light'
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 2dc755e0f5..5df071839a 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1284,7 +1284,7 @@
         "id": "getting_started.security"
       },
       {
-        "defaultMessage": "About this instance",
+        "defaultMessage": "About this server",
         "id": "navigation_bar.info"
       },
       {
@@ -1837,7 +1837,7 @@
         "id": "column.public"
       },
       {
-        "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
+        "defaultMessage": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
         "id": "empty_column.public"
       }
     ],
@@ -2184,7 +2184,7 @@
         "id": "report.target"
       },
       {
-        "defaultMessage": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+        "defaultMessage": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
         "id": "report.hint"
       },
       {
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index e840b17d84..03af57ba80 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
   "empty_column.mutes": "You haven't muted any users yet.",
   "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
   "follow_request.authorize": "Authorize",
   "follow_request.reject": "Reject",
   "getting_started.developers": "Developers",
@@ -224,7 +224,7 @@
   "navigation_bar.favourites": "Favourites",
   "navigation_bar.filters": "Muted words",
   "navigation_bar.follow_requests": "Follow requests",
-  "navigation_bar.info": "About this instance",
+  "navigation_bar.info": "About this server",
   "navigation_bar.keyboard_shortcuts": "Hotkeys",
   "navigation_bar.lists": "Lists",
   "navigation_bar.logout": "Logout",
@@ -276,7 +276,7 @@
   "reply_indicator.cancel": "Cancel",
   "report.forward": "Forward to {target}",
   "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.hint": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
   "report.placeholder": "Additional comments",
   "report.submit": "Submit",
   "report.target": "Reporting {target}",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index cd4addd686..81b21a94a4 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "まだリストがありません。リストを作るとここに表示されます。",
   "empty_column.mutes": "まだ誰もミュートしていません。",
   "empty_column.notifications": "まだ通知がありません。他の人とふれ合って会話を始めましょう。",
-  "empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のインスタンスのユーザーをフォローしたりしていっぱいにしましょう",
+  "empty_column.public": "ここにはまだ何もありません! 公開で何かを投稿したり、他のサーバーのユーザーをフォローしたりしていっぱいにしましょう",
   "follow_request.authorize": "許可",
   "follow_request.reject": "拒否",
   "getting_started.developers": "開発",
@@ -224,7 +224,7 @@
   "navigation_bar.favourites": "お気に入り",
   "navigation_bar.filters": "フィルター設定",
   "navigation_bar.follow_requests": "フォローリクエスト",
-  "navigation_bar.info": "このインスタンスについて",
+  "navigation_bar.info": "このサーバーについて",
   "navigation_bar.keyboard_shortcuts": "ホットキー",
   "navigation_bar.lists": "リスト",
   "navigation_bar.logout": "ログアウト",
@@ -275,8 +275,8 @@
   "relative_time.seconds": "{number}秒前",
   "reply_indicator.cancel": "キャンセル",
   "report.forward": "{target} に転送する",
-  "report.forward_hint": "このアカウントは別のインスタンスに所属しています。通報内容を匿名で転送しますか?",
-  "report.hint": "通報内容はあなたのインスタンスのモデレーターへ送信されます。通報理由を入力してください。:",
+  "report.forward_hint": "このアカウントは別のサーバーに所属しています。通報内容を匿名で転送しますか?",
+  "report.hint": "通報内容はあなたのサーバーのモデレーターへ送信されます。通報理由を入力してください。:",
   "report.placeholder": "追加コメント",
   "report.submit": "通報する",
   "report.target": "{target}さんを通報する",
diff --git a/config/locales/devise.en.yml b/config/locales/devise.en.yml
index bd0642b251..726c0504ef 100644
--- a/config/locales/devise.en.yml
+++ b/config/locales/devise.en.yml
@@ -20,17 +20,17 @@ en:
         action: Verify email address
         action_with_app: Confirm and return to %{app}
         explanation: You have created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email.
-        extra_html: Please also check out <a href="%{terms_path}">the rules of the instance</a> and <a href="%{policy_path}">our terms of service</a>.
+        extra_html: Please also check out <a href="%{terms_path}">the rules of the server</a> and <a href="%{policy_path}">our terms of service</a>.
         subject: 'Mastodon: Confirmation instructions for %{instance}'
         title: Verify email address
       email_changed:
         explanation: 'The email address for your account is being changed to:'
-        extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account.
+        extra: If you did not change your email, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account.
         subject: 'Mastodon: Email changed'
         title: New email address
       password_change:
         explanation: The password for your account has been changed.
-        extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the instance admin if you're locked out of your account.
+        extra: If you did not change your password, it is likely that someone has gained access to your account. Please change your password immediately or contact the server admin if you're locked out of your account.
         subject: 'Mastodon: Password changed'
         title: Password changed
       reconfirmation_instructions:
diff --git a/config/locales/devise.ja.yml b/config/locales/devise.ja.yml
index cae76d4938..bd2bb71bb3 100644
--- a/config/locales/devise.ja.yml
+++ b/config/locales/devise.ja.yml
@@ -20,17 +20,17 @@ ja:
         action: メールアドレスの確認
         action_with_app: 確認し %{app} に戻る
         explanation: このメールアドレスで%{host}にアカウントを作成しました。有効にするまであと一歩です。もし心当たりがない場合、申し訳ありませんがこのメールを無視してください。
-        extra_html: また <a href="%{terms_path}">インスタンスのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。
+        extra_html: また <a href="%{terms_path}">サーバーのルール</a> と <a href="%{policy_path}">利用規約</a> もお読みください。
         subject: 'Mastodon: メールアドレスの確認 %{instance}'
         title: メールアドレスの確認
       email_changed:
         explanation: 'アカウントのメールアドレスは以下のように変更されます:'
-        extra: メールアドレスの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はインスタンス管理者に連絡してください。
+        extra: メールアドレスの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はサーバー管理者に連絡してください。
         subject: 'Mastodon: メールアドレスの変更'
         title: 新しいメールアドレス
       password_change:
         explanation: パスワードが変更されました。
-        extra: パスワードの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はインスタンス管理者に連絡してください。
+        extra: パスワードの変更を行っていない場合、他の誰かがあなたのアカウントにアクセスした可能性があります。すぐにパスワードを変更するか、アカウントがロックされている場合はサーバー管理者に連絡してください。
         subject: 'Mastodon: パスワードが変更されました'
         title: パスワードの変更
       reconfirmation_instructions:
diff --git a/config/locales/en.yml b/config/locales/en.yml
index c92fc781c8..dacf16d563 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -7,7 +7,7 @@ en:
     administered_by: 'Administered by:'
     api: API
     apps: Mobile apps
-    closed_registrations: Registrations are currently closed on this instance. However! You can find a different instance to make an account on and get access to the very same network from there.
+    closed_registrations: Registrations are currently closed on this server. However! You can find a different server to make an account on and get access to the very same network from there.
     contact: Contact
     contact_missing: Not set
     contact_unavailable: N/A
@@ -27,7 +27,7 @@ en:
     generic_description: "%{domain} is one server in the network"
     hosted_on: Mastodon hosted on %{domain}
     learn_more: Learn more
-    other_instances: Instance list
+    other_instances: Server list
     privacy_policy: Privacy policy
     source_code: Source code
     status_count_after:
@@ -386,14 +386,14 @@ en:
         desc_html: Modify the look with CSS loaded on every page
         title: Custom CSS
       hero:
-        desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to instance thumbnail
+        desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail
         title: Hero image
       mascot:
         desc_html: Displayed on multiple pages. At least 293×205px recommended. When not set, falls back to default mascot
         title: Mascot image
       peers_api_enabled:
-        desc_html: Domain names this instance has encountered in the fediverse
-        title: Publish list of discovered instances
+        desc_html: Domain names this server has encountered in the fediverse
+        title: Publish list of discovered servers
       preview_sensitive_media:
         desc_html: Link previews on other websites will display a thumbnail even if the media is marked as sensitive
         title: Show sensitive media in OpenGraph previews
@@ -421,20 +421,20 @@ en:
         title: Show staff badge
       site_description:
         desc_html: Introductory paragraph on the frontpage. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
-        title: Instance description
+        title: Server description
       site_description_extended:
-        desc_html: A good place for your code of conduct, rules, guidelines and other things that set your instance apart. You can use HTML tags
+        desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML tags
         title: Custom extended information
       site_short_description:
-        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to instance description.
-        title: Short instance description
+        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to server description.
+        title: Short server description
       site_terms:
         desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML tags
         title: Custom terms of service
-      site_title: Instance name
+      site_title: Server name
       thumbnail:
         desc_html: Used for previews via OpenGraph and API. 1200x630px recommended
-        title: Instance thumbnail
+        title: Server thumbnail
       timeline_preview:
         desc_html: Display public timeline on landing page
         title: Timeline preview
@@ -495,7 +495,7 @@ en:
     warning: Be very careful with this data. Never share it with anyone!
     your_token: Your access token
   auth:
-    agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the instance</a> and <a href="%{terms_path}">our terms of service</a>.
+    agreement_html: By clicking "Sign up" below you agree to follow <a href="%{rules_path}">the rules of the server</a> and <a href="%{terms_path}">our terms of service</a>.
     change_password: Password
     confirm_email: Confirm email
     delete_account: Delete account
@@ -549,7 +549,7 @@ en:
     description_html: This will <strong>permanently, irreversibly</strong> remove content from your account and deactivate it. Your username will remain reserved to prevent future impersonations.
     proceed: Delete account
     success_msg: Your account was successfully deleted
-    warning_html: Only deletion of content from this particular instance is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases.
+    warning_html: Only deletion of content from this particular server is guaranteed. Content that has been widely shared is likely to leave traces. Offline servers and servers that have unsubscribed from your updates will not update their databases.
     warning_title: Disseminated content availability
   directories:
     directory: Profile directory
@@ -610,7 +610,7 @@ en:
       title: Add new filter
   followers:
     domain: Domain
-    explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. <strong>Your private statuses are delivered to all instances where you have followers</strong>. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those instances.
+    explanation_html: If you want to ensure the privacy of your statuses, you must be aware of who is following you. <strong>Your private statuses are delivered to all servers where you have followers</strong>. You may wish to review them, and remove followers if you do not trust your privacy to be respected by the staff or software of those servers.
     followers_count: Number of followers
     lock_link: Lock your account
     purge: Remove from followers
@@ -637,7 +637,7 @@ en:
       merge_long: Keep existing records and add new ones
       overwrite: Overwrite
       overwrite_long: Replace current records with the new ones
-    preface: You can import data that you have exported from another instance, such as a list of the people you are following or blocking.
+    preface: You can import data that you have exported from another server, such as a list of the people you are following or blocking.
     success: Your data was successfully uploaded and will now be processed in due time
     types:
       blocking: Blocking list
@@ -663,7 +663,7 @@ en:
       one: 1 use
       other: "%{count} uses"
     max_uses_prompt: No limit
-    prompt: Generate and share links with others to grant access to this instance
+    prompt: Generate and share links with others to grant access to this server
     table:
       expires_at: Expires
       uses: Uses
@@ -991,7 +991,7 @@ en:
       final_action: Start posting
       final_step: 'Start posting! Even without followers your public messages may be seen by others, for example on the local timeline and in hashtags. You may want to introduce yourself on the #introductions hashtag.'
       full_handle: Your full handle
-      full_handle_hint: This is what you would tell your friends so they can message or follow you from another instance.
+      full_handle_hint: This is what you would tell your friends so they can message or follow you from another server.
       review_preferences_action: Change preferences
       review_preferences_step: Make sure to set your preferences, such as which emails you'd like to receive, or what privacy level you’d like your posts to default to. If you don’t have motion sickness, you could choose to enable GIF autoplay.
       subject: Welcome to Mastodon
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 7ccb2f21c5..07458d07dd 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -7,7 +7,7 @@ ja:
     administered_by: '管理者:'
     api: API
     apps: アプリ
-    closed_registrations: 現在このインスタンスでの新規登録は受け付けていません。しかし、他のインスタンスにアカウントを作成しても全く同じネットワークに参加することができます。
+    closed_registrations: 現在このサーバーでの新規登録は受け付けていません。しかし、他のサーバーにアカウントを作成しても全く同じネットワークに参加することができます。
     contact: 連絡先
     contact_missing: 未設定
     contact_unavailable: N/A
@@ -24,10 +24,10 @@ ja:
       real_conversation_title: 本当のコミュニケーションのために
       within_reach_body: デベロッパーフレンドリーな API により実現された、iOS や Android、その他様々なプラットフォームのためのアプリでどこでも友人とやりとりできます。
       within_reach_title: いつでも身近に
-    generic_description: "%{domain} は、Mastodon インスタンスの一つです"
+    generic_description: "%{domain} は、Mastodon サーバーの一つです"
     hosted_on: Mastodon hosted on %{domain}
     learn_more: もっと詳しく
-    other_instances: 他のインスタンス
+    other_instances: 他のサーバー
     privacy_policy: プライバシーポリシー
     source_code: ソースコード
     status_count_after:
@@ -310,7 +310,7 @@ ja:
         all: すべて
         limited: 制限あり
         title: モデレーション
-      title: 既知のインスタンス
+      title: 既知のサーバー
       total_blocked_by_us: ブロック合計
       total_followed_by_them: 被フォロー合計
       total_followed_by_us: フォロー合計
@@ -392,8 +392,8 @@ ja:
         desc_html: 複数のページに表示されます。サイズは293x205px以上推奨です。未設定の場合、標準のマスコットが使用されます
         title: マスコットイメージ
       peers_api_enabled:
-        desc_html: 連合内でこのインスタンスが遭遇したドメインの名前
-        title: 接続しているインスタンスのリストを公開する
+        desc_html: 連合内でこのサーバーが遭遇したドメインの名前
+        title: 接続しているサーバーのリストを公開する
       preview_sensitive_media:
         desc_html: 他のウェブサイトにリンクを貼った際、メディアが閲覧注意としてマークされていてもサムネイルが表示されます
         title: OpenGraphによるプレビューで閲覧注意のメディアも表示する
@@ -420,21 +420,21 @@ ja:
         desc_html: ユーザーページにスタッフのバッジを表示します
         title: スタッフバッジを表示する
       site_description:
-        desc_html: フロントページへの表示に使用される紹介文です。このMastodonインスタンスを特徴付けることやその他重要なことを記述してください。HTMLタグ、特に<code>&lt;a&gt;</code> と <code>&lt;em&gt;</code>が使えます。
-        title: インスタンスの説明
+        desc_html: フロントページへの表示に使用される紹介文です。このMastodonサーバーを特徴付けることやその他重要なことを記述してください。HTMLタグ、特に<code>&lt;a&gt;</code> と <code>&lt;em&gt;</code>が使えます。
+        title: サーバーの説明
       site_description_extended:
-        desc_html: あなたのインスタンスにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます
+        desc_html: あなたのサーバーにおける行動規範やルール、ガイドライン、そのほかの記述をする際に最適な場所です。HTMLタグが使えます
         title: カスタム詳細説明
       site_short_description:
-        desc_html: サイドバーと meta タグに表示されます。Mastodon とは何か、そしてこのサーバーの特別な何かを1段落で記述してください。空欄の場合、インスタンスの説明が使用されます。
-        title: 短いインスタンスの説明
+        desc_html: サイドバーと meta タグに表示されます。Mastodon とは何か、そしてこのサーバーの特別な何かを1段落で記述してください。空欄の場合、サーバーの説明が使用されます。
+        title: 短いサーバーの説明
       site_terms:
         desc_html: あなたは独自のプライバシーポリシーや利用規約、そのほかの法的根拠を書くことができます。HTMLタグが使えます
         title: カスタム利用規約
-      site_title: インスタンスの名前
+      site_title: サーバーの名前
       thumbnail:
         desc_html: OpenGraphとAPIによるプレビューに使用されます。サイズは1200×630px推奨です
-        title: インスタンスのサムネイル
+        title: サーバーのサムネイル
       timeline_preview:
         desc_html: ランディングページに公開タイムラインを表示します
         title: タイムラインプレビュー
@@ -495,7 +495,7 @@ ja:
     warning: このデータは気をつけて取り扱ってください。他の人と共有しないでください!
     your_token: アクセストークン
   auth:
-    agreement_html: 登録するをクリックすると <a href="%{rules_path}">インスタンスのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。
+    agreement_html: 登録するをクリックすると <a href="%{rules_path}">サーバーのルール</a> と <a href="%{terms_path}">プライバシーポリシー</a> に従うことに同意したことになります。
     change_password: パスワード
     confirm_email: メールアドレスの確認
     delete_account: アカウントの削除
@@ -513,7 +513,7 @@ ja:
       cas: CAS
       saml: SAML
     register: 登録する
-    register_elsewhere: 他のインスタンスで新規登録
+    register_elsewhere: 他のサーバーで新規登録
     resend_confirmation: 確認メールを再送する
     reset_password: パスワードを再発行
     security: セキュリティ
@@ -549,7 +549,7 @@ ja:
     description_html: あなたのアカウントに含まれるコンテンツは全て削除され、アカウントは無効化されます。これは恒久的なもので、<strong>取り消すことはできません</strong>。なりすましを防ぐために、同じユーザー名で再度登録することはできなくなります。
     proceed: アカウントを削除する
     success_msg: アカウントは正常に削除されました
-    warning_html: 削除が保証されるのはこのインスタンス上のコンテンツのみです。他のインスタンス等、外部に広く共有されたコンテンツについては痕跡が残ることがあります。また、現在接続できないサーバーや、あなたの更新を受け取らなくなったサーバーに対しては、削除は反映されません。
+    warning_html: 削除が保証されるのはこのサーバー上のコンテンツのみです。他のサーバー等、外部に広く共有されたコンテンツについては痕跡が残ることがあります。また、現在接続できないサーバーや、あなたの更新を受け取らなくなったサーバーに対しては、削除は反映されません。
     warning_title: 共有されたコンテンツについて
   directories:
     directory: ディレクトリ
@@ -606,7 +606,7 @@ ja:
       title: 新規フィルターを追加
   followers:
     domain: ドメイン
-    explanation_html: あなたの投稿のプライバシーを確保したい場合、誰があなたをフォローしているのかを把握している必要があります。 <strong>プライベート投稿は、あなたのフォロワーがいる全てのインスタンスに配信されます</strong>。 フォロワーのインスタンスの管理者やソフトウェアがあなたのプライバシーを尊重してくれるかどうか怪しい場合は、そのフォロワーを削除した方がよいかもしれません。
+    explanation_html: あなたの投稿のプライバシーを確保したい場合、誰があなたをフォローしているのかを把握している必要があります。 <strong>プライベート投稿は、あなたのフォロワーがいる全てのサーバーに配信されます</strong>。 フォロワーのサーバーの管理者やソフトウェアがあなたのプライバシーを尊重してくれるかどうか怪しい場合は、そのフォロワーを削除した方がよいかもしれません。
     followers_count: フォロワー数
     lock_link: 承認制アカウントにする
     purge: フォロワーから削除する
@@ -628,7 +628,7 @@ ja:
       one: エラーが発生しました! 以下のエラーを確認してください
       other: エラーが発生しました! 以下の%{count}個のエラーを確認してください
   imports:
-    preface: 他のインスタンスでエクスポートされたファイルから、フォロー/ブロックした情報をこのインスタンス上のアカウントにインポートできます。
+    preface: 他のサーバーでエクスポートされたファイルから、フォロー/ブロックした情報をこのサーバー上のアカウントにインポートできます。
     success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください
     types:
       blocking: ブロックしたアカウントリスト
@@ -653,7 +653,7 @@ ja:
       one: '1'
       other: "%{count}"
     max_uses_prompt: 無制限
-    prompt: リンクを生成・共有してこのインスタンスへの新規登録を受け付けることができます
+    prompt: リンクを生成・共有してこのサーバーへの新規登録を受け付けることができます
     table:
       expires_at: 有効期限
       uses: 使用
@@ -800,7 +800,7 @@ ja:
     development: 開発
     edit_profile: プロフィールを編集
     export: データのエクスポート
-    followers: 信頼済みのインスタンス
+    followers: 信頼済みのサーバー
     import: データのインポート
     migrate: アカウントの引っ越し
     notifications: 通知
@@ -979,13 +979,13 @@ ja:
       final_action: 始めましょう
       final_step: 'さあ始めましょう! たとえフォロワーがいなくても、あなたの公開した投稿はローカルタイムラインやハッシュタグなどで誰かの目に止まるかもしれません。自己紹介をしたい時は #introductions ハッシュタグを使うといいかもしれません。'
       full_handle: あなたの正式なユーザー名
-      full_handle_hint: これは別のインスタンスからフォローしてもらったりメッセージのやり取りをする際に、友達に伝えるといいでしょう。
+      full_handle_hint: これは別のサーバーからフォローしてもらったりメッセージのやり取りをする際に、友達に伝えるといいでしょう。
       review_preferences_action: 設定の変更
       review_preferences_step: 受け取りたいメールや投稿の公開範囲などの設定を必ず行ってください。不快でないならアニメーション GIF の自動再生を有効にすることもできます。
       subject: Mastodon へようこそ
-      tip_federated_timeline: 連合タイムラインは Mastodon ネットワークの流れを見られるものです。ただしあなたと同じインスタンスの人がフォローしている人だけが含まれるので、それが全てではありません。
-      tip_following: 標準では自動でインスタンスの管理者をフォローしています。もっと興味のある人たちを見つけるには、ローカルタイムラインと連合タイムラインを確認してください。
-      tip_local_timeline: ローカルタイムラインは %{instance} にいる人々の流れを見られるものです。彼らはあなたと同じインスタンスにいる隣人のようなものです!
+      tip_federated_timeline: 連合タイムラインは Mastodon ネットワークの流れを見られるものです。ただしあなたと同じサーバーの人がフォローしている人だけが含まれるので、それが全てではありません。
+      tip_following: 標準では自動でサーバーの管理者をフォローしています。もっと興味のある人たちを見つけるには、ローカルタイムラインと連合タイムラインを確認してください。
+      tip_local_timeline: ローカルタイムラインは %{instance} にいる人々の流れを見られるものです。彼らはあなたと同じサーバーにいる隣人のようなものです!
       tip_mobile_webapp: もしモバイル端末のブラウザで Mastodon をホーム画面に追加できる場合、プッシュ通知を受け取ることができます。それはまるでネイティブアプリのように動作します!
       tips: 豆知識
       title: ようこそ、%{name} !
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 3a2746a539..3faaa6ac7b 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -40,7 +40,7 @@ en:
       featured_tag:
         name: 'You might want to use one of these:'
       imports:
-        data: CSV file exported from another Mastodon instance
+        data: CSV file exported from another Mastodon server
       sessions:
         otp: 'Enter the two-factor code generated by your phone app or use one of your recovery codes:'
       user:
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index f9beedb7e1..c22b67314a 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -37,7 +37,7 @@ ja:
         username: あなたのユーザー名は %{domain} の中で重複していない必要があります
         whole_word: キーワードまたはフレーズが英数字のみの場合、単語全体と一致する場合のみ適用されるようになります
       imports:
-        data: 他の Mastodon インスタンスからエクスポートしたCSVファイルを選択して下さい
+        data: 他の Mastodon サーバーからエクスポートしたCSVファイルを選択して下さい
       sessions:
         otp: '携帯電話のアプリで生成された二段階認証コードを入力するか、リカバリーコードを使用してください:'
       user:
-- 
GitLab


From e186bd2fb0d2d70c0c401d35cd9f6a63bd20eeac Mon Sep 17 00:00:00 2001
From: abcang <abcang1015@gmail.com>
Date: Wed, 6 Feb 2019 10:50:52 +0900
Subject: [PATCH 025/192] Fix Tombstone.delete_all ArgumentError (#9978)

---
 app/services/activitypub/process_account_service.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 487456f3af..5e33084282 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -212,7 +212,7 @@ class ActivityPub::ProcessAccountService < BaseService
   end
 
   def clear_tombstones!
-    Tombstone.delete_all(account_id: @account.id)
+    Tombstone.where(account_id: @account.id).delete_all
   end
 
   def protocol_changed?
-- 
GitLab


From 3ce34ce7a2795b8fbea618a8c869d9447f5a60b5 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 14:13:15 +0100
Subject: [PATCH 026/192] Fix unfolding CWs on public hashtag page

Fixes #909
---
 .../glitch/features/status/components/detailed_status.js  | 2 +-
 .../status/containers/detailed_status_container.js        | 8 --------
 2 files changed, 1 insertion(+), 9 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 02f02efea3..a114e2158b 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -26,7 +26,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
     settings: ImmutablePropTypes.map.isRequired,
     onOpenMedia: PropTypes.func.isRequired,
     onOpenVideo: PropTypes.func.isRequired,
-    onToggleHidden: PropTypes.func.isRequired,
+    onToggleHidden: PropTypes.func,
     expanded: PropTypes.bool,
     measureHeight: PropTypes.bool,
     onHeightChange: PropTypes.func,
diff --git a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
index e41b1dc88c..6d3909ea7c 100644
--- a/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
+++ b/app/javascript/flavours/glitch/features/status/containers/detailed_status_container.js
@@ -160,14 +160,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
     }
   },
 
-  onToggleHidden (status) {
-    if (status.get('hidden')) {
-      dispatch(revealStatus(status.get('id')));
-    } else {
-      dispatch(hideStatus(status.get('id')));
-    }
-  },
-
 });
 
 export default injectIntl(connect(makeMapStateToProps, mapDispatchToProps)(DetailedStatus));
-- 
GitLab


From 1a70fca168bec82e3521c2039bbdecc256f328af Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 15:11:46 +0100
Subject: [PATCH 027/192] Fix CW unfolding not triggering re-layout in public
 hashtag page

---
 app/javascript/flavours/glitch/components/status_content.js  | 2 ++
 .../glitch/features/status/components/detailed_status.js     | 5 +++++
 2 files changed, 7 insertions(+)

diff --git a/app/javascript/flavours/glitch/components/status_content.js b/app/javascript/flavours/glitch/components/status_content.js
index 6542df65b2..c60d63f9a1 100644
--- a/app/javascript/flavours/glitch/components/status_content.js
+++ b/app/javascript/flavours/glitch/components/status_content.js
@@ -17,6 +17,7 @@ export default class StatusContent extends React.PureComponent {
     mediaIcon: PropTypes.string,
     parseClick: PropTypes.func,
     disabled: PropTypes.bool,
+    onUpdate: PropTypes.func,
   };
 
   state = {
@@ -62,6 +63,7 @@ export default class StatusContent extends React.PureComponent {
 
   componentDidUpdate () {
     this._updateStatusLinks();
+    if (this.props.onUpdate) this.props.onUpdate();
   }
 
   onLinkClick = (e) => {
diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index a114e2158b..8f49a9a301 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -79,6 +79,10 @@ export default class DetailedStatus extends ImmutablePureComponent {
     this._measureHeight(prevState.height !== this.state.height);
   }
 
+  handleChildUpdate = () => {
+    this._measureHeight();
+  }
+
   handleModalLink = e => {
     e.preventDefault();
 
@@ -218,6 +222,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
             collapsed={false}
             onExpandedToggle={onToggleHidden}
             parseClick={this.parseClick}
+            onUpdate={this.handleChildUpdate}
           />
 
           <div className='detailed-status__meta'>
-- 
GitLab


From e28fe2ef2639d06c0df8717216052720f1c3543f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 6 Feb 2019 16:46:37 +0100
Subject: [PATCH 028/192] Bump microformats from 4.0.7 to 4.1.0 (#9980)

Bumps [microformats](https://github.com/microformats/microformats-ruby) from 4.0.7 to 4.1.0.
- [Release notes](https://github.com/microformats/microformats-ruby/releases)
- [Commits](https://github.com/microformats/microformats-ruby/compare/v4.0.7...v4.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Gemfile b/Gemfile
index 44cae11ff2..fc919af6ef 100644
--- a/Gemfile
+++ b/Gemfile
@@ -110,7 +110,7 @@ group :test do
   gem 'capybara', '~> 3.13'
   gem 'climate_control', '~> 0.2'
   gem 'faker', '~> 1.9'
-  gem 'microformats', '~> 4.0'
+  gem 'microformats', '~> 4.1'
   gem 'rails-controller-testing', '~> 1.0'
   gem 'rspec-sidekiq', '~> 3.0'
   gem 'simplecov', '~> 0.16', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 5bec39a01f..af76296906 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -335,9 +335,9 @@ GEM
       redis (>= 3.0.5)
     memory_profiler (0.9.12)
     method_source (0.9.2)
-    microformats (4.0.7)
-      json
-      nokogiri
+    microformats (4.1.0)
+      json (~> 2.1)
+      nokogiri (~> 1.8, >= 1.8.3)
     mime-types (3.2.2)
       mime-types-data (~> 3.2015)
     mime-types-data (3.2018.0812)
@@ -709,7 +709,7 @@ DEPENDENCIES
   makara (~> 0.4)
   mario-redis-lock (~> 1.2)
   memory_profiler
-  microformats (~> 4.0)
+  microformats (~> 4.1)
   mime-types (~> 3.2)
   net-ldap (~> 0.10)
   nokogiri (~> 1.10)
-- 
GitLab


From d09ce6d81b542705fcce8f5091d032471531c755 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 23:36:43 +0100
Subject: [PATCH 029/192] Fix IntersectionObserverArticle not hiding some
 out-of-view items (#9982)

IntersectionObserverArticle is made to save on RAM by avoiding fully rendering
items that are far out of view. However, it did not work for items spawned
outside the intersection observer.
---
 .../mastodon/components/intersection_observer_article.js        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/components/intersection_observer_article.js b/app/javascript/mastodon/components/intersection_observer_article.js
index de2203a4bc..e453730ba4 100644
--- a/app/javascript/mastodon/components/intersection_observer_article.js
+++ b/app/javascript/mastodon/components/intersection_observer_article.js
@@ -65,7 +65,7 @@ export default class IntersectionObserverArticle extends React.Component {
   }
 
   updateStateAfterIntersection = (prevState) => {
-    if (prevState.isIntersecting && !this.entry.isIntersecting) {
+    if (prevState.isIntersecting !== false && !this.entry.isIntersecting) {
       scheduleIdleTask(this.hideIfNotIntersecting);
     }
     return {
-- 
GitLab


From 157d3af46c1a94dd0365b6e33e82919dd3c15fde Mon Sep 17 00:00:00 2001
From: Hinaloe <hina@hinaloe.net>
Date: Sat, 9 Feb 2019 11:39:38 +0900
Subject: [PATCH 030/192]  Only URLs extract with pre-escaped text (#9991)

* [test] add japanese hashtag testcase

* Only URLs extract with pre-escaped text

( https://github.com/tootsuite/mastodon/issues/9989 )
---
 app/lib/formatter.rb       | 2 +-
 spec/lib/formatter_spec.rb | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 2e35871696..6603b8df17 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -210,7 +210,7 @@ class Formatter
 
     # Note: I couldn't obtain list_slug with @user/list-name format
     # for mention so this requires additional check
-    special = Extractor.extract_entities_with_indices(escaped, options).map do |extract|
+    special = Extractor.extract_urls_with_indices(escaped, options).map do |extract|
       # exactly one of :url, :hashtag, :screen_name, :cashtag keys is present
       key = (extract.keys & [:url, :hashtag, :screen_name, :cashtag]).first
 
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index 9872d37567..8fb6695a9b 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -194,6 +194,14 @@ RSpec.describe Formatter do
         is_expected.to include '/tags/hashtag" class="mention hashtag" rel="tag">#<span>hashtag</span></a>'
       end
     end
+
+    context 'given text containing a hashtag with Unicode chars' do
+      let(:text)  { '#hashtagã‚¿ã‚°' }
+
+      it 'creates a hashtag link' do
+        is_expected.to include '/tags/hashtag%E3%82%BF%E3%82%B0" class="mention hashtag" rel="tag">#<span>hashtagã‚¿ã‚°</span></a>'
+      end
+    end
   end
 
   describe '#format_spoiler' do
-- 
GitLab


From a666d1e7edaa8a3da61ce23f648321f7aa61d03b Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Sun, 10 Feb 2019 01:33:41 +0900
Subject: [PATCH 031/192] Enable "displaying application used to post" setting
 by default (#9994)

related: https://github.com/tootsuite/mastodon/pull/9897#issuecomment-461093615
---
 config/settings.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/config/settings.yml b/config/settings.yml
index 2cf286a9e4..33a03efccb 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -26,7 +26,7 @@ defaults: &defaults
   expand_spoilers: false
   preview_sensitive_media: false
   reduce_motion: false
-  show_application: false
+  show_application: true
   system_font_ui: false
   noindex: false
   theme: 'default'
-- 
GitLab


From 016ad37bc8c9ca8bf8f872b8fee704a0388f575e Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 9 Feb 2019 20:13:11 +0100
Subject: [PATCH 032/192] Fix URL linkifier grabbing full-width spaces and
 quotations (#9997)

Fix #9993
Fix #5654
---
 app/lib/formatter.rb                 | 12 +++++++-
 config/initializers/twitter_regex.rb |  4 +--
 spec/lib/formatter_spec.rb           | 44 ++++++++++++++++++++++++++--
 3 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/app/lib/formatter.rb b/app/lib/formatter.rb
index 6603b8df17..0653214f53 100644
--- a/app/lib/formatter.rb
+++ b/app/lib/formatter.rb
@@ -199,12 +199,22 @@ class Formatter
     result.flatten.join
   end
 
+  UNICODE_ESCAPE_BLACKLIST_RE = /\p{Z}|\p{P}/
+
   def utf8_friendly_extractor(text, options = {})
     old_to_new_index = [0]
 
     escaped = text.chars.map do |c|
-      output = c.ord.to_s(16).length > 2 ? CGI.escape(c) : c
+      output = begin
+        if c.ord.to_s(16).length > 2 && UNICODE_ESCAPE_BLACKLIST_RE.match(c).nil?
+          CGI.escape(c)
+        else
+          c
+        end
+      end
+
       old_to_new_index << old_to_new_index.last + output.length
+
       output
     end.join
 
diff --git a/config/initializers/twitter_regex.rb b/config/initializers/twitter_regex.rb
index 0e8f5bfeb4..0ddbbee982 100644
--- a/config/initializers/twitter_regex.rb
+++ b/config/initializers/twitter_regex.rb
@@ -1,7 +1,7 @@
 module Twitter
   class Regex
-    REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}\(\)\?]/iou
-    REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*';:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou
+    REGEXEN[:valid_general_url_path_chars] = /[^\p{White_Space}<>\(\)\?]/iou
+    REGEXEN[:valid_url_path_ending_chars] = /[^\p{White_Space}\(\)\?!\*"'「」<>;:=\,\.\$%\[\]~&\|@]|(?:#{REGEXEN[:valid_url_balanced_parens]})/iou
     REGEXEN[:valid_url_balanced_parens] = /
       \(
         (?:
diff --git a/spec/lib/formatter_spec.rb b/spec/lib/formatter_spec.rb
index 8fb6695a9b..96d2fc7e06 100644
--- a/spec/lib/formatter_spec.rb
+++ b/spec/lib/formatter_spec.rb
@@ -115,6 +115,22 @@ RSpec.describe Formatter do
       end
     end
 
+    context 'given a URL in quotation marks' do
+      let(:text) { '"https://example.com/"' }
+
+      it 'does not match the quotation marks' do
+        is_expected.to include 'href="https://example.com/"'
+      end
+    end
+
+    context 'given a URL in angle brackets' do
+      let(:text) { '<https://example.com/>' }
+
+      it 'does not match the angle brackets' do
+        is_expected.to include 'href="https://example.com/"'
+      end
+    end
+
     context 'given a URL with Japanese path string' do
       let(:text) { 'https://ja.wikipedia.org/wiki/日本' }
 
@@ -131,6 +147,22 @@ RSpec.describe Formatter do
       end
     end
 
+    context 'given a URL with a full-width space' do
+      let(:text) { 'https://example.com/ abc123' }
+
+      it 'does not match the full-width space' do
+        is_expected.to include 'href="https://example.com/"'
+      end
+    end
+
+    context 'given a URL in Japanese quotation marks' do
+      let(:text) { '「[https://example.org/」' }
+
+      it 'does not match the quotation marks' do
+        is_expected.to include 'href="https://example.org/"'
+      end
+    end
+
     context 'given a URL with Simplified Chinese path string' do
       let(:text) { 'https://baike.baidu.com/item/中华人民共和国' }
 
@@ -150,7 +182,11 @@ RSpec.describe Formatter do
     context 'given a URL containing unsafe code (XSS attack, visible part)' do
       let(:text) { %q{http://example.com/b<del>b</del>} }
 
-      it 'escapes the HTML in the URL' do
+      it 'does not include the HTML in the URL' do
+        is_expected.to include '"http://example.com/b"'
+      end
+
+      it 'escapes the HTML' do
         is_expected.to include '&lt;del&gt;b&lt;/del&gt;'
       end
     end
@@ -158,7 +194,11 @@ RSpec.describe Formatter do
     context 'given a URL containing unsafe code (XSS attack, invisible part)' do
       let(:text) { %q{http://example.com/blahblahblahblah/a<script>alert("Hello")</script>} }
 
-      it 'escapes the HTML in the URL' do
+      it 'does not include the HTML in the URL' do
+        is_expected.to include '"http://example.com/blahblahblahblah/a"'
+      end
+
+      it 'escapes the HTML' do
         is_expected.to include '&lt;script&gt;alert(&quot;Hello&quot;)&lt;/script&gt;'
       end
     end
-- 
GitLab


From fb90ec894ed3ebaf31b860991bd2a79d21c45e13 Mon Sep 17 00:00:00 2001
From: mayaeh <mayaeh@marimo-net.org>
Date: Sun, 10 Feb 2019 21:04:59 +0900
Subject: [PATCH 033/192] i18n: add Japanese translations (#10000)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Add Japanese translations.

* Probably change to more general "統合" than "マージ" .
---
 app/javascript/mastodon/locales/ja.json |  1 +
 config/locales/ja.yml                   | 11 +++++++++++
 config/locales/simple_form.ja.yml       |  6 ++++++
 3 files changed, 18 insertions(+)

diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 81b21a94a4..92f9b0effe 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -342,6 +342,7 @@
   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
   "upload_area.title": "ドラッグ&ドロップでアップロード",
   "upload_button.label": "メディアを追加 (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "アップロードできる上限を超えています。",
   "upload_form.description": "視覚障害者のための説明",
   "upload_form.focus": "焦点",
   "upload_form.undo": "削除",
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 07458d07dd..1a2591cb4e 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -588,6 +588,10 @@ ja:
     lists: リスト
     mutes: ミュート
     storage: メディア
+  featured_tags:
+    add_new: 追加
+    errors:
+      limit: 注目のハッシュタグの上限に達しました
   filters:
     contexts:
       home: ホームタイムライン
@@ -628,10 +632,16 @@ ja:
       one: エラーが発生しました! 以下のエラーを確認してください
       other: エラーが発生しました! 以下の%{count}個のエラーを確認してください
   imports:
+    modes:
+      merge: 統合
+      merge_long: 現在のレコードを保持したまま新しいものを追加します
+      overwrite: 上書き
+      overwrite_long: 現在のレコードを新しいもので置き換えます
     preface: 他のサーバーでエクスポートされたファイルから、フォロー/ブロックした情報をこのサーバー上のアカウントにインポートできます。
     success: ファイルは正常にアップロードされ、現在処理中です。しばらくしてから確認してください
     types:
       blocking: ブロックしたアカウントリスト
+      domain_blocking: 非表示にしたドメインリスト
       following: フォロー中のアカウントリスト
       muting: ミュートしたアカウントリスト
     upload: アップロード
@@ -800,6 +810,7 @@ ja:
     development: 開発
     edit_profile: プロフィールを編集
     export: データのエクスポート
+    featured_tags: 注目のハッシュタグ
     followers: 信頼済みのサーバー
     import: データのインポート
     migrate: アカウントの引っ越し
diff --git a/config/locales/simple_form.ja.yml b/config/locales/simple_form.ja.yml
index c22b67314a..87ffe9d143 100644
--- a/config/locales/simple_form.ja.yml
+++ b/config/locales/simple_form.ja.yml
@@ -33,9 +33,12 @@ ja:
         setting_display_media_show_all: 閲覧注意としてマークされたメディアも常に表示する
         setting_hide_network: フォローとフォロワーの情報がプロフィールページで見られないようにします
         setting_noindex: 公開プロフィールおよび各投稿ページに影響します
+        setting_show_application: トゥートするのに使用したアプリがトゥートの詳細ビューに表示されるようになります
         setting_theme: ログインしている全てのデバイスで適用されるデザインです。
         username: あなたのユーザー名は %{domain} の中で重複していない必要があります
         whole_word: キーワードまたはフレーズが英数字のみの場合、単語全体と一致する場合のみ適用されるようになります
+      featured_tag:
+        name: 'これらを使うといいかもしれません:'
       imports:
         data: 他の Mastodon サーバーからエクスポートしたCSVファイルを選択して下さい
       sessions:
@@ -100,6 +103,7 @@ ja:
         setting_hide_network: 繋がりを隠す
         setting_noindex: 検索エンジンによるインデックスを拒否する
         setting_reduce_motion: アニメーションの動きを減らす
+        setting_show_application: トゥートの送信に使用したアプリを開示する
         setting_system_font_ui: システムのデフォルトフォントを使う
         setting_theme: サイトテーマ
         setting_unfollow_modal: フォローを解除する前に確認ダイアログを表示する
@@ -108,6 +112,8 @@ ja:
         username: ユーザー名
         username_or_email: ユーザー名またはメールアドレス
         whole_word: 単語全体にマッチ
+      featured_tag:
+        name: ハッシュタグ
       interactions:
         must_be_follower: フォロワー以外からの通知をブロック
         must_be_following: フォローしていないユーザーからの通知をブロック
-- 
GitLab


From 3031b8a8f22a74a1b691cfe8a31a816ae9cc480d Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Sun, 10 Feb 2019 18:17:34 +0100
Subject: [PATCH 034/192] Bump parallel_tests from 2.27.1 to 2.28.0 (#9985)

Bumps [parallel_tests](https://github.com/grosser/parallel_tests) from 2.27.1 to 2.28.0.
- [Release notes](https://github.com/grosser/parallel_tests/releases)
- [Commits](https://github.com/grosser/parallel_tests/compare/v2.27.1...v2.28.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index fc919af6ef..53c8b4602f 100644
--- a/Gemfile
+++ b/Gemfile
@@ -115,7 +115,7 @@ group :test do
   gem 'rspec-sidekiq', '~> 3.0'
   gem 'simplecov', '~> 0.16', require: false
   gem 'webmock', '~> 3.5'
-  gem 'parallel_tests', '~> 2.27'
+  gem 'parallel_tests', '~> 2.28'
 end
 
 group :development do
diff --git a/Gemfile.lock b/Gemfile.lock
index af76296906..0c342064fc 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -390,7 +390,7 @@ GEM
       av (~> 0.9.0)
       paperclip (>= 2.5.2)
     parallel (1.13.0)
-    parallel_tests (2.27.1)
+    parallel_tests (2.28.0)
       parallel
     parser (2.6.0.0)
       ast (~> 2.4.0)
@@ -722,7 +722,7 @@ DEPENDENCIES
   ox (~> 2.10)
   paperclip (~> 6.0)
   paperclip-av-transcoder (~> 0.6)
-  parallel_tests (~> 2.27)
+  parallel_tests (~> 2.28)
   pg (~> 1.1)
   pghero (~> 2.2)
   pkg-config (~> 1.3)
-- 
GitLab


From 6b2eefc7bf8cf1bb58da165d9594d9b17bf97e11 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 21:13:17 +0100
Subject: [PATCH 035/192] [Glitch] Add WebP support

Port 5092d17f2936146fa26e5d8a9b9e391f77010f28  to glitch-soc
---
 app/javascript/flavours/glitch/util/resize_image.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/util/resize_image.js b/app/javascript/flavours/glitch/util/resize_image.js
index d1608094f7..bbdbc865e9 100644
--- a/app/javascript/flavours/glitch/util/resize_image.js
+++ b/app/javascript/flavours/glitch/util/resize_image.js
@@ -31,7 +31,7 @@ const loadImage = inputFile => new Promise((resolve, reject) => {
 });
 
 const getOrientation = (img, type = 'image/png') => new Promise(resolve => {
-  if (type !== 'image/jpeg') {
+  if (!['image/jpeg', 'image/webp'].includes(type)) {
     resolve(1);
     return;
   }
-- 
GitLab


From a963ea67dda17f69ed783b3fbcc91e5ce3858ad3 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 21:28:29 +0100
Subject: [PATCH 036/192] [Glitch] Add missing rejection handling for Promises

Port missing parts from 2c51bc0ca5a4c3a4bb140b4b40dabdda859ebb94 to glitch-soc
---
 .../flavours/glitch/actions/alerts.js         | 25 +++++++++++++++++++
 .../flavours/glitch/actions/compose.js        |  7 +++++-
 .../flavours/glitch/actions/lists.js          |  4 ++-
 .../actions/push_notifications/registerer.js  | 15 +++++------
 .../flavours/glitch/actions/settings.js       |  5 +++-
 .../glitch/containers/status_container.js     |  6 ++++-
 .../features/ui/components/embed_modal.js     |  3 +++
 .../flavours/glitch/middleware/errors.js      | 18 ++-----------
 8 files changed, 54 insertions(+), 29 deletions(-)

diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js
index f37fdeeb6a..3f5d7ef46b 100644
--- a/app/javascript/flavours/glitch/actions/alerts.js
+++ b/app/javascript/flavours/glitch/actions/alerts.js
@@ -1,3 +1,10 @@
+import { defineMessages } from 'react-intl';
+
+const messages = defineMessages({
+  unexpectedTitle: { id: 'alert.unexpected.title', defaultMessage: 'Oops!' },
+  unexpectedMessage: { id: 'alert.unexpected.message', defaultMessage: 'An unexpected error occurred.' },
+});
+
 export const ALERT_SHOW    = 'ALERT_SHOW';
 export const ALERT_DISMISS = 'ALERT_DISMISS';
 export const ALERT_CLEAR   = 'ALERT_CLEAR';
@@ -22,3 +29,21 @@ export function showAlert(title, message) {
     message,
   };
 };
+
+export function showAlertForError(error) {
+  if (error.response) {
+    const { data, status, statusText } = error.response;
+
+    let message = statusText;
+    let title   = `${status}`;
+
+    if (data.error) {
+      message = data.error;
+    }
+
+    return showAlert(title, message);
+  } else {
+    console.error(error);
+    return showAlert(messages.unexpectedTitle, messages.unexpectedMessage);
+  }
+}
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 04e8577132..204d609b0d 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -1,5 +1,5 @@
 import api from 'flavours/glitch/util/api';
-import { CancelToken } from 'axios';
+import { CancelToken, isCancel } from 'axios';
 import { throttle } from 'lodash';
 import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_search_light';
 import { useEmoji } from './emojis';
@@ -8,6 +8,7 @@ import { recoverHashtags } from 'flavours/glitch/util/hashtag';
 import resizeImage from 'flavours/glitch/util/resize_image';
 
 import { updateTimeline } from './timelines';
+import { showAlertForError } from './alerts';
 
 let cancelFetchComposeSuggestionsAccounts;
 
@@ -320,6 +321,10 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) =>
     },
   }).then(response => {
     dispatch(readyComposeSuggestionsAccounts(token, response.data));
+  }).catch(error => {
+    if (!isCancel(error)) {
+      dispatch(showAlertForError(error));
+    }
   });
 }, 200, { leading: true, trailing: true });
 
diff --git a/app/javascript/flavours/glitch/actions/lists.js b/app/javascript/flavours/glitch/actions/lists.js
index 7d94ee950e..f29ca1e010 100644
--- a/app/javascript/flavours/glitch/actions/lists.js
+++ b/app/javascript/flavours/glitch/actions/lists.js
@@ -1,4 +1,5 @@
 import api from 'flavours/glitch/util/api';
+import { showAlertForError } from './alerts';
 
 export const LIST_FETCH_REQUEST = 'LIST_FETCH_REQUEST';
 export const LIST_FETCH_SUCCESS = 'LIST_FETCH_SUCCESS';
@@ -239,7 +240,8 @@ export const fetchListSuggestions = q => (dispatch, getState) => {
   };
 
   api(getState).get('/api/v1/accounts/search', { params })
-    .then(({ data }) => dispatch(fetchListSuggestionsReady(q, data)));
+    .then(({ data }) => dispatch(fetchListSuggestionsReady(q, data)))
+    .catch(error => dispatch(showAlertForError(error)));
 };
 
 export const fetchListSuggestionsReady = (query, accounts) => ({
diff --git a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
index 91f442415a..8fdb239f72 100644
--- a/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
+++ b/app/javascript/flavours/glitch/actions/push_notifications/registerer.js
@@ -109,14 +109,11 @@ export function register () {
             pushNotificationsSetting.remove(me);
           }
 
-          try {
-            getRegistration()
-              .then(getPushSubscription)
-              .then(unsubscribe);
-          } catch (e) {
-
-          }
-        });
+          return getRegistration()
+            .then(getPushSubscription)
+            .then(unsubscribe);
+        })
+        .catch(console.warn);
     } else {
       console.warn('Your browser does not support Web Push Notifications.');
     }
@@ -137,6 +134,6 @@ export function saveSettings() {
       if (me) {
         pushNotificationsSetting.set(me, data);
       }
-    });
+    }).catch(console.warn);
   };
 }
diff --git a/app/javascript/flavours/glitch/actions/settings.js b/app/javascript/flavours/glitch/actions/settings.js
index 87b2ae76d9..fb0bcc09ce 100644
--- a/app/javascript/flavours/glitch/actions/settings.js
+++ b/app/javascript/flavours/glitch/actions/settings.js
@@ -1,5 +1,6 @@
 import api from 'flavours/glitch/util/api';
 import { debounce } from 'lodash';
+import { showAlertForError } from './alerts';
 
 export const SETTING_CHANGE = 'SETTING_CHANGE';
 export const SETTING_SAVE   = 'SETTING_SAVE';
@@ -23,7 +24,9 @@ const debouncedSave = debounce((dispatch, getState) => {
 
   const data = getState().get('settings').filter((_, path) => path !== 'saved').toJS();
 
-  api(getState).put('/api/web/settings', { data }).then(() => dispatch({ type: SETTING_SAVE }));
+  api(getState).put('/api/web/settings', { data })
+    .then(() => dispatch({ type: SETTING_SAVE }))
+    .catch(error => dispatch(showAlertForError(error)));
 }, 5000, { trailing: true });
 
 export function saveSettings() {
diff --git a/app/javascript/flavours/glitch/containers/status_container.js b/app/javascript/flavours/glitch/containers/status_container.js
index f28dce609e..f783878b00 100644
--- a/app/javascript/flavours/glitch/containers/status_container.js
+++ b/app/javascript/flavours/glitch/containers/status_container.js
@@ -25,6 +25,7 @@ import { openModal } from 'flavours/glitch/actions/modal';
 import { changeLocalSetting } from 'flavours/glitch/actions/local_settings';
 import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/util/initial_state';
+import { showAlertForError } from '../actions/alerts';
 
 const messages = defineMessages({
   deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },
@@ -134,7 +135,10 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
   },
 
   onEmbed (status) {
-    dispatch(openModal('EMBED', { url: status.get('url') }));
+    dispatch(openModal('EMBED', {
+      url: status.get('url'),
+      onError: error => dispatch(showAlertForError(error)),
+    }));
   },
 
   onDelete (status, history, withRedraft = false) {
diff --git a/app/javascript/flavours/glitch/features/ui/components/embed_modal.js b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js
index bf29b0da5d..b1643df1cb 100644
--- a/app/javascript/flavours/glitch/features/ui/components/embed_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/embed_modal.js
@@ -10,6 +10,7 @@ export default class EmbedModal extends ImmutablePureComponent {
   static propTypes = {
     url: PropTypes.string.isRequired,
     onClose: PropTypes.func.isRequired,
+    onError: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
   }
 
@@ -35,6 +36,8 @@ export default class EmbedModal extends ImmutablePureComponent {
       iframeDocument.body.style.margin = 0;
       this.iframe.width  = iframeDocument.body.scrollWidth;
       this.iframe.height = iframeDocument.body.scrollHeight;
+    }).catch(error => {
+      this.props.onError(error);
     });
   }
 
diff --git a/app/javascript/flavours/glitch/middleware/errors.js b/app/javascript/flavours/glitch/middleware/errors.js
index f3dfc8b069..212c1f4ad2 100644
--- a/app/javascript/flavours/glitch/middleware/errors.js
+++ b/app/javascript/flavours/glitch/middleware/errors.js
@@ -1,4 +1,4 @@
-import { showAlert } from 'flavours/glitch/actions/alerts';
+import { showAlertForError } from 'flavours/glitch/actions/alerts';
 
 const defaultFailSuffix = 'FAIL';
 
@@ -8,21 +8,7 @@ export default function errorsMiddleware() {
       const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
 
       if (action.type.match(isFail)) {
-        if (action.error.response) {
-          const { data, status, statusText } = action.error.response;
-
-          let message = statusText;
-          let title   = `${status}`;
-
-          if (data.error) {
-            message = data.error;
-          }
-
-          dispatch(showAlert(title, message));
-        } else {
-          console.error(action.error);
-          dispatch(showAlert('Oops!', 'An unexpected error occurred.'));
-        }
+        dispatch(showAlertForError(action.error));
       }
     }
 
-- 
GitLab


From 7ed2aeb6e9b0fe4fc7fbe7c76003d1e044c682eb Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 21:35:04 +0100
Subject: [PATCH 037/192] [Glitch] Allow multiple files upload through web UI,
 including drag & drop

Port 750c67660de753065ec160b4e389ba0dda2f81cc to glitch-soc
---
 .../flavours/glitch/actions/alerts.js         |  4 +-
 .../flavours/glitch/actions/compose.js        | 38 ++++++++++++++-----
 .../glitch/features/composer/options/index.js |  1 +
 .../flavours/glitch/features/ui/index.js      |  2 +-
 4 files changed, 32 insertions(+), 13 deletions(-)

diff --git a/app/javascript/flavours/glitch/actions/alerts.js b/app/javascript/flavours/glitch/actions/alerts.js
index 3f5d7ef46b..50cd48a9ed 100644
--- a/app/javascript/flavours/glitch/actions/alerts.js
+++ b/app/javascript/flavours/glitch/actions/alerts.js
@@ -22,7 +22,7 @@ export function clearAlert() {
   };
 };
 
-export function showAlert(title, message) {
+export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage) {
   return {
     type: ALERT_SHOW,
     title,
@@ -44,6 +44,6 @@ export function showAlertForError(error) {
     return showAlert(title, message);
   } else {
     console.error(error);
-    return showAlert(messages.unexpectedTitle, messages.unexpectedMessage);
+    return showAlert();
   }
 }
diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 204d609b0d..0dd1766bc7 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -9,6 +9,8 @@ import resizeImage from 'flavours/glitch/util/resize_image';
 
 import { updateTimeline } from './timelines';
 import { showAlertForError } from './alerts';
+import { showAlert } from './alerts';
+import { defineMessages } from 'react-intl';
 
 let cancelFetchComposeSuggestionsAccounts;
 
@@ -53,6 +55,10 @@ export const COMPOSE_UPLOAD_CHANGE_FAIL        = 'COMPOSE_UPLOAD_UPDATE_FAIL';
 
 export const COMPOSE_DOODLE_SET        = 'COMPOSE_DOODLE_SET';
 
+const messages = defineMessages({
+  uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
+});
+
 export function changeCompose(text) {
   return {
     type: COMPOSE_CHANGE,
@@ -208,20 +214,32 @@ export function doodleSet(options) {
 
 export function uploadCompose(files) {
   return function (dispatch, getState) {
-    if (getState().getIn(['compose', 'media_attachments']).size > 3) {
+    const uploadLimit = 4;
+    const media  = getState().getIn(['compose', 'media_attachments']);
+    const total = Array.from(files).reduce((a, v) => a + v.size, 0);
+    const progress = new Array(files.length).fill(0);
+
+    if (files.length + media.size > uploadLimit) {
+      dispatch(showAlert(undefined, messages.uploadErrorLimit));
       return;
     }
-
     dispatch(uploadComposeRequest());
 
-    resizeImage(files[0]).then(file => {
-      const data = new FormData();
-      data.append('file', file);
-
-      return api(getState).post('/api/v1/media', data, {
-        onUploadProgress: ({ loaded, total }) => dispatch(uploadComposeProgress(loaded, total)),
-      }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
-    }).catch(error => dispatch(uploadComposeFail(error)));
+    for (const [i, f] of Array.from(files).entries()) {
+      if (media.size + i > 3) break;
+
+      resizeImage(f).then(file => {
+        const data = new FormData();
+        data.append('file', file);
+
+        return api(getState).post('/api/v1/media', data, {
+          onUploadProgress: function({ loaded }){
+            progress[i] = loaded;
+            dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
+          },
+        }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
+      }).catch(error => dispatch(uploadComposeFail(error)));
+    };
   };
 };
 
diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js
index 9fe3abc03e..5b4a7444c0 100644
--- a/app/javascript/flavours/glitch/features/composer/options/index.js
+++ b/app/javascript/flavours/glitch/features/composer/options/index.js
@@ -214,6 +214,7 @@ export default class ComposerOptions extends React.PureComponent {
           onChange={handleChangeFiles}
           ref={handleRefFileElement}
           type='file'
+          multiple
           {...hiddenComponent}
         />
         <Dropdown
diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index 602d93832f..a19b3abf19 100644
--- a/app/javascript/flavours/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -186,7 +186,7 @@ export default class UI extends React.Component {
     this.setState({ draggingOver: false });
     this.dragTargets = [];
 
-    if (e.dataTransfer && e.dataTransfer.files.length === 1) {
+    if (e.dataTransfer && e.dataTransfer.files.length >= 1) {
       this.props.dispatch(uploadCompose(e.dataTransfer.files));
     }
   }
-- 
GitLab


From b7fbcb21b3ca7f7ee560785fa1249bf689fbaff3 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 21:50:42 +0100
Subject: [PATCH 038/192] [Glitch] Add featured hashtags to profiles

Port SCSS changes from 364f2ff9aa2b4bf601d68a12bce758aeb5530467
---
 app/javascript/flavours/glitch/styles/accounts.scss | 4 ++++
 app/javascript/flavours/glitch/styles/admin.scss    | 7 ++++++-
 app/javascript/flavours/glitch/styles/widgets.scss  | 7 +++++--
 3 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/app/javascript/flavours/glitch/styles/accounts.scss b/app/javascript/flavours/glitch/styles/accounts.scss
index 9c6518bea6..d2ae83b2e0 100644
--- a/app/javascript/flavours/glitch/styles/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/accounts.scss
@@ -290,3 +290,7 @@
     border-bottom: 0;
   }
 }
+
+.directory__tag .trends__item__current {
+  width: auto;
+}
diff --git a/app/javascript/flavours/glitch/styles/admin.scss b/app/javascript/flavours/glitch/styles/admin.scss
index 4e969601b1..4dbbaa1e83 100644
--- a/app/javascript/flavours/glitch/styles/admin.scss
+++ b/app/javascript/flavours/glitch/styles/admin.scss
@@ -153,10 +153,15 @@ $content-width: 840px;
       font-weight: 500;
     }
 
-    .directory__tag a {
+    .directory__tag > a,
+    .directory__tag > div {
       box-shadow: none;
     }
 
+    .directory__tag .table-action-link .fa {
+      color: inherit;
+    }
+
     .directory__tag h4 {
       font-size: 18px;
       font-weight: 700;
diff --git a/app/javascript/flavours/glitch/styles/widgets.scss b/app/javascript/flavours/glitch/styles/widgets.scss
index c97337e4e3..1eaf30c5b3 100644
--- a/app/javascript/flavours/glitch/styles/widgets.scss
+++ b/app/javascript/flavours/glitch/styles/widgets.scss
@@ -269,7 +269,8 @@
     box-sizing: border-box;
     margin-bottom: 10px;
 
-    a {
+    & > a,
+    & > div {
       display: flex;
       align-items: center;
       justify-content: space-between;
@@ -279,7 +280,9 @@
       text-decoration: none;
       color: inherit;
       box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
+    }
 
+    & > a {
       &:hover,
       &:active,
       &:focus {
@@ -287,7 +290,7 @@
       }
     }
 
-    &.active a {
+    &.active > a {
       background: $ui-highlight-color;
       cursor: default;
     }
-- 
GitLab


From 14a1bb703a98282349cc95ac9a561c795c6881a0 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 21:54:43 +0100
Subject: [PATCH 039/192] [Glitch] Fix not showing custom emojis in share page
 emoji picker

Port e02a13f64e5c2c93fa73a67a4ce32a7d1df24760 to glitch-soc
---
 app/javascript/flavours/glitch/containers/compose_container.js | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/javascript/flavours/glitch/containers/compose_container.js b/app/javascript/flavours/glitch/containers/compose_container.js
index 60f6a9c9f2..74c411b7c1 100644
--- a/app/javascript/flavours/glitch/containers/compose_container.js
+++ b/app/javascript/flavours/glitch/containers/compose_container.js
@@ -7,6 +7,7 @@ import { IntlProvider, addLocaleData } from 'react-intl';
 import { getLocale } from 'mastodon/locales';
 import Compose from 'flavours/glitch/features/standalone/compose';
 import initialState from 'flavours/glitch/util/initial_state';
+import { fetchCustomEmojis } from 'flavours/glitch/actions/custom_emojis';
 
 const { localeData, messages } = getLocale();
 addLocaleData(localeData);
@@ -17,6 +18,8 @@ if (initialState) {
   store.dispatch(hydrateStore(initialState));
 }
 
+store.dispatch(fetchCustomEmojis());
+
 export default class TimelineContainer extends React.PureComponent {
 
   static propTypes = {
-- 
GitLab


From b47a53f90299a1fb52423aacbc0c23427e2eb132 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 22:19:26 +0100
Subject: [PATCH 040/192] [Glitch] Rename from instance to server.

Port 46e806cd2f14a5e45d66b4c23040855202818984 to glitch-soc
---
 .../flavours/glitch/features/getting_started/index.js           | 2 +-
 .../flavours/glitch/features/public_timeline/index.js           | 2 +-
 .../flavours/glitch/features/ui/components/report_modal.js      | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js
index fe0dd506ed..7b645c9d09 100644
--- a/app/javascript/flavours/glitch/features/getting_started/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started/index.js
@@ -166,7 +166,7 @@ export default class GettingStarted extends ImmutablePureComponent {
           <div className='getting-started__footer'>
             <ul>
               {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
-              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this instance' /></a> · </li>
+              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>
               <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>
               <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>
               <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a></li>
diff --git a/app/javascript/flavours/glitch/features/public_timeline/index.js b/app/javascript/flavours/glitch/features/public_timeline/index.js
index 477d3b8c78..7fe4722028 100644
--- a/app/javascript/flavours/glitch/features/public_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/public_timeline/index.js
@@ -127,7 +127,7 @@ export default class PublicTimeline extends React.PureComponent {
           onLoadMore={this.handleLoadMore}
           trackScroll={!pinned}
           scrollKey={`public_timeline-${columnId}`}
-          emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other instances to fill it up' />}
+          emptyMessage={<FormattedMessage id='empty_column.public' defaultMessage='There is nothing here! Write something publicly, or manually follow users from other servers to fill it up' />}
         />
       </Column>
     );
diff --git a/app/javascript/flavours/glitch/features/ui/components/report_modal.js b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
index a139394ac2..8be1d5856d 100644
--- a/app/javascript/flavours/glitch/features/ui/components/report_modal.js
+++ b/app/javascript/flavours/glitch/features/ui/components/report_modal.js
@@ -97,7 +97,7 @@ export default class ReportModal extends ImmutablePureComponent {
 
         <div className='report-modal__container'>
           <div className='report-modal__comment'>
-            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:' /></p>
+            <p><FormattedMessage id='report.hint' defaultMessage='The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:' /></p>
 
             <textarea
               className='setting-text light'
-- 
GitLab


From 405ef5ad3763ebf948dff61fff8af59a3937a9f9 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 18:59:28 +0100
Subject: [PATCH 041/192] Hide items rendered out-of-frame (once they have been
 rendered at least once)

---
 .../glitch/components/intersection_observer_article.js        | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js
index 6eeca5598e..03d8f17c6b 100644
--- a/app/javascript/flavours/glitch/components/intersection_observer_article.js
+++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js
@@ -63,7 +63,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent
   }
 
   updateStateAfterIntersection = (prevState) => {
-    if (prevState.isIntersecting && !this.entry.isIntersecting) {
+    if (prevState.isIntersecting !== false && !this.entry.isIntersecting) {
       scheduleIdleTask(this.hideIfNotIntersecting);
     }
     return {
@@ -109,7 +109,7 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent
           ref={this.handleRef}
           aria-posinset={index + 1}
           aria-setsize={listLength}
-          style={{ height: `${this.height || cachedHeight}px`, opacity: 0, overflow: 'hidden' }}
+          style={{ height: `${this.height || cachedHeight || 150}px`, opacity: 0, overflow: 'hidden' }}
           data-id={id}
           tabIndex='0'
         >
-- 
GitLab


From e49e54a5ffb3c5304a42c12be9dba6cc47384250 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 19:48:28 +0100
Subject: [PATCH 042/192] Cleanup redundant markup for hidden statuses

---
 app/javascript/flavours/glitch/components/status.js | 10 +---------
 1 file changed, 1 insertion(+), 9 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 9ff53485e8..80cd0f42e6 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -384,15 +384,7 @@ export default class Status extends ImmutablePureComponent {
 
     if (hidden) {
       return (
-        <div
-          ref={this.handleRef}
-          data-id={status.get('id')}
-          style={{
-            height: `${this.height}px`,
-            opacity: 0,
-            overflow: 'hidden',
-          }}
-        >
+        <div ref={this.handleRef}>
           {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}
           {' '}
           {status.get('content')}
-- 
GitLab


From 68f3d003d6e841c864330fd5e7bcecadcc9b9178 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 6 Feb 2019 20:04:39 +0100
Subject: [PATCH 043/192] Refactor intersection observer article code

---
 .../intersection_observer_article.js          | 27 +++++++++----------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/intersection_observer_article.js b/app/javascript/flavours/glitch/components/intersection_observer_article.js
index 03d8f17c6b..900c986380 100644
--- a/app/javascript/flavours/glitch/components/intersection_observer_article.js
+++ b/app/javascript/flavours/glitch/components/intersection_observer_article.js
@@ -103,24 +103,23 @@ export default class IntersectionObserverArticle extends ImmutablePureComponent
     const { children, id, index, listLength, cachedHeight } = this.props;
     const { isIntersecting, isHidden } = this.state;
 
+    const style = {};
+
     if (!isIntersecting && (isHidden || cachedHeight)) {
-      return (
-        <article
-          ref={this.handleRef}
-          aria-posinset={index + 1}
-          aria-setsize={listLength}
-          style={{ height: `${this.height || cachedHeight || 150}px`, opacity: 0, overflow: 'hidden' }}
-          data-id={id}
-          tabIndex='0'
-        >
-          {children && React.cloneElement(children, { hidden: true })}
-        </article>
-      );
+      style.height = `${this.height || cachedHeight || 150}px`;
+      style.opacity = 0;
+      style.overflow = 'hidden';
     }
 
     return (
-      <article ref={this.handleRef} aria-posinset={index + 1} aria-setsize={listLength} data-id={id} tabIndex='0'>
-        {children && React.cloneElement(children, { hidden: false })}
+      <article
+        ref={this.handleRef}
+        aria-posinset={index + 1}
+        aria-setsize={listLength}
+        data-id={id}
+        tabIndex='0'
+        style={style}>
+          {children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || cachedHeight) })}
       </article>
     );
   }
-- 
GitLab


From 049c9a3b9711ed203855d18a9a549e65e164ec59 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sat, 9 Feb 2019 20:54:11 +0100
Subject: [PATCH 044/192] Avoid two-step rendering of statuses as much as
 possible

Cache width shared by Video player, MediaGallery and Cards at the
ScrollableList level, pass it down through StatusList and Notifications.
---
 .../flavours/glitch/components/media_gallery.js      | 10 ++++++++--
 .../flavours/glitch/components/scrollable_list.js    | 12 +++++++++++-
 app/javascript/flavours/glitch/components/status.js  |  8 ++++++++
 .../notifications/components/notification.js         | 12 ++++++++++++
 .../glitch/features/status/components/card.js        |  7 +++++--
 .../flavours/glitch/features/video/index.js          |  5 ++++-
 6 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index d0226bbbbc..1fa25ee4ec 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -224,6 +224,8 @@ export default class MediaGallery extends React.PureComponent {
     size: PropTypes.object,
     onOpenMedia: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    defaultWidth: PropTypes.number,
+    cacheWidth: PropTypes.func,
   };
 
   static defaultProps = {
@@ -232,6 +234,7 @@ export default class MediaGallery extends React.PureComponent {
 
   state = {
     visible: this.props.revealed === undefined ? (displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all') : this.props.revealed,
+    width: this.props.defaultWidth,
   };
 
   componentWillReceiveProps (nextProps) {
@@ -259,6 +262,7 @@ export default class MediaGallery extends React.PureComponent {
   handleRef = (node) => {
     this.node = node;
     if (node && node.offsetWidth && node.offsetWidth != this.state.width) {
+      if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth);
       this.setState({
         width: node.offsetWidth,
       });
@@ -271,10 +275,12 @@ export default class MediaGallery extends React.PureComponent {
   }
 
   render () {
-    const { media, intl, sensitive, letterbox, fullwidth } = this.props;
-    const { width, visible } = this.state;
+    const { media, intl, sensitive, letterbox, fullwidth, defaultWidth } = this.props;
+    const { visible } = this.state;
     const size = media.take(4).size;
 
+    const width = this.state.width || defaultWidth;
+
     let children;
 
     const style = {};
diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js
index 7cd0774a93..2e7c9fd6eb 100644
--- a/app/javascript/flavours/glitch/components/scrollable_list.js
+++ b/app/javascript/flavours/glitch/components/scrollable_list.js
@@ -40,6 +40,7 @@ export default class ScrollableList extends PureComponent {
 
   state = {
     fullscreen: null,
+    cachedMediaWidth: 300,
   };
 
   intersectionObserverWrapper = new IntersectionObserverWrapper();
@@ -141,6 +142,10 @@ export default class ScrollableList extends PureComponent {
     this.setScrollTop(newScrollTop);
   }
 
+  cacheMediaWidth = (width) => {
+    if (width && this.state.cachedMediaWidth != width) this.setState({ cachedMediaWidth: width });
+  }
+
   getSnapshotBeforeUpdate (prevProps, prevState) {
     const someItemInserted = React.Children.count(prevProps.children) > 0 &&
       React.Children.count(prevProps.children) < React.Children.count(this.props.children) &&
@@ -252,7 +257,12 @@ export default class ScrollableList extends PureComponent {
                 intersectionObserverWrapper={this.intersectionObserverWrapper}
                 saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null}
               >
-                {React.cloneElement(child, {getScrollPosition: this.getScrollPosition, updateScrollBottom: this.updateScrollBottom})}
+                {React.cloneElement(child, {
+                  getScrollPosition: this.getScrollPosition,
+                  updateScrollBottom: this.updateScrollBottom,
+                  cachedMediaWidth: this.state.cachedMediaWidth,
+                  cacheMediaWidth: this.cacheMediaWidth,
+                })}
               </IntersectionObserverArticleContainer>
             ))}
 
diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 80cd0f42e6..68788451b0 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -72,6 +72,8 @@ export default class Status extends ImmutablePureComponent {
     updateScrollBottom: PropTypes.func,
     expanded: PropTypes.bool,
     intl: PropTypes.object.isRequired,
+    cacheMediaWidth: PropTypes.func,
+    cachedMediaWidth: PropTypes.number,
   };
 
   state = {
@@ -445,6 +447,8 @@ export default class Status extends ImmutablePureComponent {
               fullwidth={settings.getIn(['media', 'fullwidth'])}
               preventPlayback={isCollapsed || !isExpanded}
               onOpenVideo={this.handleOpenVideo}
+              width={this.props.cachedMediaWidth}
+              cacheWidth={this.props.cacheMediaWidth}
             />)}
           </Bundle>
         );
@@ -460,6 +464,8 @@ export default class Status extends ImmutablePureComponent {
                 fullwidth={settings.getIn(['media', 'fullwidth'])}
                 hidden={isCollapsed || !isExpanded}
                 onOpenMedia={this.props.onOpenMedia}
+                cacheWidth={this.props.cacheMediaWidth}
+                defaultWidth={this.props.cachedMediaWidth}
               />
             )}
           </Bundle>
@@ -476,6 +482,8 @@ export default class Status extends ImmutablePureComponent {
           onOpenMedia={this.props.onOpenMedia}
           card={status.get('card')}
           compact
+          cacheWidth={this.props.cacheMediaWidth}
+          defaultWidth={this.props.cachedMediaWidth}
         />
       );
       mediaIcon = 'link';
diff --git a/app/javascript/flavours/glitch/features/notifications/components/notification.js b/app/javascript/flavours/glitch/features/notifications/components/notification.js
index 21c55acccb..daafe3507f 100644
--- a/app/javascript/flavours/glitch/features/notifications/components/notification.js
+++ b/app/javascript/flavours/glitch/features/notifications/components/notification.js
@@ -18,6 +18,9 @@ export default class Notification extends ImmutablePureComponent {
     onMention: PropTypes.func.isRequired,
     getScrollPosition: PropTypes.func,
     updateScrollBottom: PropTypes.func,
+    cacheMediaWidth: PropTypes.func,
+    cachedMediaWidth: PropTypes.number,
+    onUnmount: PropTypes.func,
   };
 
   render () {
@@ -57,6 +60,9 @@ export default class Notification extends ImmutablePureComponent {
           contextType='notifications'
           getScrollPosition={getScrollPosition}
           updateScrollBottom={updateScrollBottom}
+          cachedMediaWidth={this.props.cachedMediaWidth}
+          cacheMediaWidth={this.props.cacheMediaWidth}
+          onUnmount={this.props.onUnmount}
           withDismiss
         />
       );
@@ -75,6 +81,9 @@ export default class Notification extends ImmutablePureComponent {
           onMention={onMention}
           getScrollPosition={getScrollPosition}
           updateScrollBottom={updateScrollBottom}
+          cachedMediaWidth={this.props.cachedMediaWidth}
+          cacheMediaWidth={this.props.cacheMediaWidth}
+          onUnmount={this.props.onUnmount}
           withDismiss
         />
       );
@@ -93,6 +102,9 @@ export default class Notification extends ImmutablePureComponent {
           onMention={onMention}
           getScrollPosition={getScrollPosition}
           updateScrollBottom={updateScrollBottom}
+          cachedMediaWidth={this.props.cachedMediaWidth}
+          cacheMediaWidth={this.props.cacheMediaWidth}
+          onUnmount={this.props.onUnmount}
           withDismiss
         />
       );
diff --git a/app/javascript/flavours/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js
index 1e1604d5cd..e405a5ef00 100644
--- a/app/javascript/flavours/glitch/features/status/components/card.js
+++ b/app/javascript/flavours/glitch/features/status/components/card.js
@@ -60,6 +60,8 @@ export default class Card extends React.PureComponent {
     maxDescription: PropTypes.number,
     onOpenMedia: PropTypes.func.isRequired,
     compact: PropTypes.bool,
+    defaultWidth: PropTypes.number,
+    cacheWidth: PropTypes.func,
   };
 
   static defaultProps = {
@@ -68,7 +70,7 @@ export default class Card extends React.PureComponent {
   };
 
   state = {
-    width: 280,
+    width: this.props.defaultWidth || 280,
     embedded: false,
   };
 
@@ -111,6 +113,7 @@ export default class Card extends React.PureComponent {
 
   setRef = c => {
     if (c) {
+      if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth);
       this.setState({ width: c.offsetWidth });
     }
   }
@@ -133,7 +136,7 @@ export default class Card extends React.PureComponent {
   }
 
   render () {
-    const { card, maxDescription, compact } = this.props;
+    const { card, maxDescription, compact, defaultWidth } = this.props;
     const { width, embedded } = this.state;
 
     if (card === null) {
diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index d8e8791a74..a6f651db65 100644
--- a/app/javascript/flavours/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -103,6 +103,7 @@ export default class Video extends React.PureComponent {
     inline: PropTypes.bool,
     preventPlayback: PropTypes.bool,
     intl: PropTypes.object.isRequired,
+    cacheWidth: PropTypes.func,
   };
 
   state = {
@@ -111,7 +112,7 @@ export default class Video extends React.PureComponent {
     volume: 0.5,
     paused: true,
     dragging: false,
-    containerWidth: false,
+    containerWidth: this.props.width,
     fullscreen: false,
     hovered: false,
     muted: false,
@@ -131,6 +132,7 @@ export default class Video extends React.PureComponent {
     this.player = c;
 
     if (c && c.offsetWidth && c.offsetWidth != this.state.containerWidth) {
+      if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth);
       this.setState({
         containerWidth: c.offsetWidth,
       });
@@ -275,6 +277,7 @@ export default class Video extends React.PureComponent {
 
   componentDidUpdate (prevProps) {
     if (this.player && this.player.offsetWidth && this.player.offsetWidth != this.state.containerWidth && !this.state.fullscreen) {
+      if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth);
       this.setState({
         containerWidth: this.player.offsetWidth,
       });
-- 
GitLab


From 0b91322762e845acc76966da448eeccd1ad78047 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sat, 9 Feb 2019 21:24:43 +0100
Subject: [PATCH 045/192] Adjust scroll if previewCard appeared

---
 app/javascript/flavours/glitch/components/status.js | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 68788451b0..1a5cb4a975 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -216,6 +216,8 @@ export default class Status extends ImmutablePureComponent {
       // Hack to fix timeline jumps on second rendering when auto-collapsing
       this.setState({ autoCollapsed: true });
     }
+
+    this.didShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
   }
 
   getSnapshotBeforeUpdate (prevProps, prevState) {
@@ -228,8 +230,10 @@ export default class Status extends ImmutablePureComponent {
 
   //  Hack to fix timeline jumps on second rendering when auto-collapsing
   componentDidUpdate (prevProps, prevState, snapshot) {
-    if (this.state.autoCollapsed) {
-      this.setState({ autoCollapsed: false });
+    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
+    if (this.state.autoCollapsed || (doShowCard && !this.didShowCard)) {
+      if (doShowCard) this.didShowCard = true;
+      if (this.state.autoCollapsed) this.setState({ autoCollapsed: false });
       if (snapshot !== null && this.props.updateScrollBottom) {
         if (this.node.offsetTop < snapshot.top) {
           this.props.updateScrollBottom(snapshot.height - snapshot.top);
-- 
GitLab


From dfe1d548a58154c988b98cab313496292bdc62e2 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sat, 9 Feb 2019 22:08:57 +0100
Subject: [PATCH 046/192] Adjust scroll when statuses above the current scroll
 position are deleted

---
 app/javascript/flavours/glitch/components/status.js | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 1a5cb4a975..9d987dc9c3 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -242,6 +242,15 @@ export default class Status extends ImmutablePureComponent {
     }
   }
 
+  componentWillUnmount() {
+    if (this.node && this.props.getScrollPosition) {
+      const position = this.props.getScrollPosition();
+      if (position !== null && this.node.offsetTop < position.top) {
+         requestAnimationFrame(() => { this.props.updateScrollBottom(position.height - position.top); });
+      }
+    }
+  }
+
   //  `setCollapsed()` sets the value of `isCollapsed` in our state, that is,
   //  whether the toot is collapsed or not.
 
-- 
GitLab


From 7c0728c7764e1e851eb0174b37767029c1061f2d Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sat, 9 Feb 2019 22:32:09 +0100
Subject: [PATCH 047/192] Minor fix to timeline jump avoiding behavior

---
 app/javascript/flavours/glitch/components/scrollable_list.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js
index 2e7c9fd6eb..462185bbcc 100644
--- a/app/javascript/flavours/glitch/components/scrollable_list.js
+++ b/app/javascript/flavours/glitch/components/scrollable_list.js
@@ -129,7 +129,7 @@ export default class ScrollableList extends PureComponent {
   }
 
   getScrollPosition = () => {
-    if (this.node && this.node.scrollTop > 0) {
+    if (this.node && (this.node.scrollTop > 0 || this.mouseMovedRecently)) {
       return {height: this.node.scrollHeight, top: this.node.scrollTop};
     } else {
       return null;
-- 
GitLab


From b89e003c4d049d64d2d4015357b8b931370bc5f0 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 10 Feb 2019 11:50:31 +0100
Subject: [PATCH 048/192] Handle deletion of filtered toots

---
 app/javascript/flavours/glitch/components/status.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 9d987dc9c3..51fee0eec5 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -415,7 +415,7 @@ export default class Status extends ImmutablePureComponent {
 
       return (
         <HotKeys handlers={minHandlers}>
-          <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0'>
+          <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}>
             <FormattedMessage id='status.filtered' defaultMessage='Filtered' />
           </div>
         </HotKeys>
-- 
GitLab


From 3cfadd875cc91b3fb893681ed7c2ef86148b3f85 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 11 Feb 2019 04:19:49 +0100
Subject: [PATCH 049/192] Add "copy link" item to status action bars (#9983)

Fix #6848
---
 .../mastodon/components/status_action_bar.js  | 22 +++++++++++++++++++
 .../features/status/components/action_bar.js  | 21 ++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 0995a14904..16c7caf1c1 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -32,6 +32,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
 });
 
 const obfuscatedCount = count => {
@@ -141,6 +142,25 @@ class StatusActionBar extends ImmutablePureComponent {
     this.props.onMuteConversation(this.props.status);
   }
 
+  handleCopy = () => {
+    const url      = this.props.status.get('url');
+    const textarea = document.createElement('textarea');
+
+    textarea.textContent    = url;
+    textarea.style.position = 'fixed';
+
+    document.body.appendChild(textarea);
+
+    try {
+      textarea.select();
+      document.execCommand('copy');
+    } catch (e) {
+
+    } finally {
+      document.body.removeChild(textarea);
+    }
+  }
+
   render () {
     const { status, intl, withDismiss } = this.props;
 
@@ -156,6 +176,7 @@ class StatusActionBar extends ImmutablePureComponent {
     menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
 
     if (publicStatus) {
+      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
     }
 
@@ -184,6 +205,7 @@ class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+
       if (isStaff) {
         menu.push(null);
         menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
diff --git a/app/javascript/mastodon/features/status/components/action_bar.js b/app/javascript/mastodon/features/status/components/action_bar.js
index d3b725283a..73be1fc5f8 100644
--- a/app/javascript/mastodon/features/status/components/action_bar.js
+++ b/app/javascript/mastodon/features/status/components/action_bar.js
@@ -28,6 +28,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
 });
 
 export default @injectIntl
@@ -113,6 +114,25 @@ class ActionBar extends React.PureComponent {
     this.props.onEmbed(this.props.status);
   }
 
+  handleCopy = () => {
+    const url      = this.props.status.get('url');
+    const textarea = document.createElement('textarea');
+
+    textarea.textContent    = url;
+    textarea.style.position = 'fixed';
+
+    document.body.appendChild(textarea);
+
+    try {
+      textarea.select();
+      document.execCommand('copy');
+    } catch (e) {
+
+    } finally {
+      document.body.removeChild(textarea);
+    }
+  }
+
   render () {
     const { status, intl } = this.props;
 
@@ -122,6 +142,7 @@ class ActionBar extends React.PureComponent {
     let menu = [];
 
     if (publicStatus) {
+      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
       menu.push(null);
     }
-- 
GitLab


From a3e10f44c6483dd83d3b7e7eeb9176a4338d7925 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 11 Feb 2019 07:41:35 +0100
Subject: [PATCH 050/192] Weblate translations (2019-02-11) (#10007)

* Translated using Weblate (Galician)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/

* Translated using Weblate (Basque)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/

* Translated using Weblate (Basque)

Currently translated at 100.0% (755 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/

* Translated using Weblate (Arabic)

Currently translated at 94.8% (716 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ar/

* Translated using Weblate (Basque)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (German)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/

* Translated using Weblate (Slovenian)

Currently translated at 21.7% (164 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/

* Translated using Weblate (Corsican)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/

* Translated using Weblate (Welsh)

Currently translated at 86.9% (93 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cy/

* Translated using Weblate (Welsh)

Currently translated at 94.6% (714 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/

* Translated using Weblate (Welsh)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cy/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Czech)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Added translation using Weblate (Irish)

* Translated using Weblate (Irish)

Currently translated at 0.1% (1 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ga/

* Translated using Weblate (Telugu)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/te/

* Translated using Weblate (Indonesian)

Currently translated at 38.4% (290 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/id/

* Translated using Weblate (Welsh)

Currently translated at 94.6% (714 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/

* Translated using Weblate (Czech)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

* Translated using Weblate (Korean)

Currently translated at 100.0% (755 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/

* Translated using Weblate (Welsh)

Currently translated at 93.5% (100 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cy/

* Translated using Weblate (Welsh)

Currently translated at 98.0% (349 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cy/

* Translated using Weblate (Serbian)

Currently translated at 95.8% (723 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sr/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Czech)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Greek)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/

* Translated using Weblate (Greek)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/

* Translated using Weblate (Occitan)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/oc/

* Translated using Weblate (Welsh)

Currently translated at 98.0% (740 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cy/

* Translated using Weblate (Italian)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/it/

* Translated using Weblate (Italian)

Currently translated at 84.0% (634 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/it/

* Translated using Weblate (Slovenian)

Currently translated at 29.0% (219 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Slovenian)

Currently translated at 34.4% (260 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/

* Translated using Weblate (Latvian)

Currently translated at 40.7% (145 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/lv/

* Translated using Weblate (Japanese)

Currently translated at 91.0% (687 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/

* Translated using Weblate (Serbian)

Currently translated at 95.8% (723 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sr/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Latvian)

Currently translated at 48.3% (172 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/lv/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Czech)

Currently translated at 100.0% (98 of 98 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/cs/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Czech)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Translated using Weblate (Greek)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/

* Translated using Weblate (Greek)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/

* Translated using Weblate (Czech)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

* Translated using Weblate (Czech)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

Rename "instance" to "server"

* Translated using Weblate (Czech)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/cs/

rename from "instance" to "server"

* Translated using Weblate (Czech)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

rename from "instance" to "server"

* Translated using Weblate (Czech)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

* Translated using Weblate (Czech)

Currently translated at 99.9% (754 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

rename from "instance" to "server"

* Translated using Weblate (Slovak)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sk/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Korean)

Currently translated at 100.0% (755 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/

* Added translation using Weblate (Lithuanian)

* Translated using Weblate (Japanese)

Currently translated at 99.2% (353 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Lithuanian)

Currently translated at 20.1% (152 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

* Added translation using Weblate (Albanian)

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (356 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (107 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Added translation using Weblate (Albanian)

* Added translation using Weblate (Albanian)

* Added translation using Weblate (Albanian)

* Added translation using Weblate (Albanian)

* Added translation using Weblate (Albanian)

* Translated using Weblate (Albanian)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sq/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (2 of 2 strings)

Translation: Mastodon/Activerecord
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/sq/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (98 of 98 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/sq/

* Translated using Weblate (Albanian)

Currently translated at 64.5% (487 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (753 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovenian)

Currently translated at 40.0% (302 of 755 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sl/

* Translated using Weblate (Slovenian)

Currently translated at 74.8% (80 of 107 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sl/

* Translated using Weblate (Slovenian)

Currently translated at 45.2% (161 of 356 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sl/

* i18n-tasks normalize

* yarn manage:translations

* Fix inconsistent interpolations and unused keys

* Fix missing plural forms
---
 app/javascript/mastodon/locales/ar.json       |   2 +
 app/javascript/mastodon/locales/ast.json      |   2 +
 app/javascript/mastodon/locales/bg.json       |   2 +
 app/javascript/mastodon/locales/ca.json       |   2 +
 app/javascript/mastodon/locales/co.json       |   2 +
 app/javascript/mastodon/locales/cs.json       |  26 +-
 app/javascript/mastodon/locales/cy.json       |  26 +-
 app/javascript/mastodon/locales/da.json       |   2 +
 app/javascript/mastodon/locales/de.json       |  20 +-
 .../mastodon/locales/defaultMessages.json     |  10 +-
 app/javascript/mastodon/locales/el.json       |  18 +-
 app/javascript/mastodon/locales/en.json       |   1 +
 app/javascript/mastodon/locales/eo.json       |   2 +
 app/javascript/mastodon/locales/es.json       |   2 +
 app/javascript/mastodon/locales/eu.json       |   6 +-
 app/javascript/mastodon/locales/fa.json       |   2 +
 app/javascript/mastodon/locales/fi.json       |   2 +
 app/javascript/mastodon/locales/fr.json       |   2 +
 app/javascript/mastodon/locales/gl.json       |   2 +
 app/javascript/mastodon/locales/he.json       |   2 +
 app/javascript/mastodon/locales/hr.json       |   2 +
 app/javascript/mastodon/locales/hu.json       |   2 +
 app/javascript/mastodon/locales/hy.json       |   2 +
 app/javascript/mastodon/locales/id.json       |   2 +
 app/javascript/mastodon/locales/io.json       |   2 +
 app/javascript/mastodon/locales/it.json       |   6 +-
 app/javascript/mastodon/locales/ja.json       |   1 +
 app/javascript/mastodon/locales/ka.json       |   2 +
 app/javascript/mastodon/locales/ko.json       |   2 +
 app/javascript/mastodon/locales/lv.json       | 264 ++++----
 app/javascript/mastodon/locales/ms.json       |   2 +
 app/javascript/mastodon/locales/nl.json       |   2 +
 app/javascript/mastodon/locales/no.json       |   2 +
 app/javascript/mastodon/locales/oc.json       |   4 +-
 app/javascript/mastodon/locales/pl.json       |   1 +
 app/javascript/mastodon/locales/pt-BR.json    |   2 +
 app/javascript/mastodon/locales/pt.json       |   2 +
 app/javascript/mastodon/locales/ro.json       |   2 +
 app/javascript/mastodon/locales/ru.json       |   2 +
 app/javascript/mastodon/locales/sk.json       |  44 +-
 app/javascript/mastodon/locales/sl.json       |   4 +-
 app/javascript/mastodon/locales/sq.json       | 360 +++++++++++
 app/javascript/mastodon/locales/sr-Latn.json  |   2 +
 app/javascript/mastodon/locales/sr.json       |   2 +
 app/javascript/mastodon/locales/sv.json       |   2 +
 app/javascript/mastodon/locales/ta.json       |   2 +
 app/javascript/mastodon/locales/te.json       |   8 +-
 app/javascript/mastodon/locales/th.json       |   2 +
 app/javascript/mastodon/locales/tr.json       |   2 +
 app/javascript/mastodon/locales/uk.json       |   2 +
 .../mastodon/locales/whitelist_sq.json        |   2 +
 app/javascript/mastodon/locales/zh-CN.json    |   2 +
 app/javascript/mastodon/locales/zh-HK.json    |   2 +
 app/javascript/mastodon/locales/zh-TW.json    |   2 +
 config/locales/activerecord.sq.yml            |  13 +
 config/locales/ar.yml                         |   1 +
 config/locales/co.yml                         |   3 +
 config/locales/cs.yml                         | 102 +--
 config/locales/cy.yml                         | 133 +++-
 config/locales/devise.cs.yml                  |  10 +-
 config/locales/devise.cy.yml                  |   9 +-
 config/locales/devise.sk.yml                  |  14 +-
 config/locales/devise.sq.yml                  |  83 +++
 config/locales/doorkeeper.cs.yml              |   2 +-
 config/locales/doorkeeper.sq.yml              | 142 ++++
 config/locales/el.yml                         |   6 +-
 config/locales/eu.yml                         |  61 +-
 config/locales/ga.yml                         |   4 +
 config/locales/id.yml                         |  53 ++
 config/locales/it.yml                         |   2 +-
 config/locales/ja.yml                         |   4 +-
 config/locales/ko.yml                         |   6 +-
 config/locales/lt.yml                         | 182 ++++++
 config/locales/simple_form.cs.yml             |   6 +-
 config/locales/simple_form.cy.yml             |  14 +
 config/locales/simple_form.eu.yml             |   1 +
 config/locales/simple_form.gl.yml             |   2 +-
 config/locales/simple_form.sk.yml             |  16 +-
 config/locales/simple_form.sl.yml             |   2 +-
 config/locales/simple_form.sq.yml             |   1 +
 config/locales/sk.yml                         |  42 +-
 config/locales/sl.yml                         | 269 +++++++-
 config/locales/sq.yml                         | 612 ++++++++++++++++++
 config/locales/sr.yml                         |  10 +-
 84 files changed, 2346 insertions(+), 334 deletions(-)
 create mode 100644 app/javascript/mastodon/locales/sq.json
 create mode 100644 app/javascript/mastodon/locales/whitelist_sq.json
 create mode 100644 config/locales/activerecord.sq.yml
 create mode 100644 config/locales/devise.sq.yml
 create mode 100644 config/locales/doorkeeper.sq.yml
 create mode 100644 config/locales/ga.yml
 create mode 100644 config/locales/lt.yml
 create mode 100644 config/locales/simple_form.sq.yml
 create mode 100644 config/locales/sq.yml

diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 1486272e22..78e63e5e68 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "إلغاء الترقية",
   "status.cannot_reblog": "تعذرت ترقية هذا المنشور",
+  "status.copy": "Copy link to status",
   "status.delete": "إحذف",
   "status.detailed_status": "تفاصيل المحادثة",
   "status.direct": "رسالة خاصة إلى @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
   "upload_area.title": "إسحب ثم أفلت للرفع",
   "upload_button.label": "إضافة وسائط (JPEG، PNG، GIF، WebM، MP4، MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "وصف للمعاقين بصريا",
   "upload_form.focus": "قص",
   "upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index a9407e82dd..a94e235722 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -297,6 +297,7 @@
   "status.block": "Bloquiar a @{name}",
   "status.cancel_reblog_private": "Dexar de compartir",
   "status.cannot_reblog": "Esti artículu nun pue compartise",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Unviar un mensaxe direutu a @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descripción pa discapacitaos visuales",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Desaniciar",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index a812f5cb1a..a5ab165b75 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Изтриване",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Добави медия",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Отмяна",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 07a4f01746..8519590b75 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfer l'impuls",
   "status.cannot_reblog": "Aquesta publicació no pot ser retootejada",
+  "status.copy": "Copy link to status",
   "status.delete": "Esborrar",
   "status.detailed_status": "Visualització detallada de la conversa",
   "status.direct": "Missatge directe @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "El vostre esborrany es perdrà si sortiu de Mastodon.",
   "upload_area.title": "Arrossega i deixa anar per carregar",
   "upload_button.label": "Afegir multimèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descriure els problemes visuals",
   "upload_form.focus": "Modificar la previsualització",
   "upload_form.undo": "Esborra",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 496f13e7d5..b4d8f9781f 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -297,6 +297,7 @@
   "status.block": "Bluccà @{name}",
   "status.cancel_reblog_private": "Ùn sparte più",
   "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu",
+  "status.copy": "Copy link to status",
   "status.delete": "Toglie",
   "status.detailed_status": "Vista in ditagliu di a cunversazione",
   "status.direct": "Mandà un missaghju @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.",
   "upload_area.title": "Drag & drop per caricà un fugliale",
   "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Discrive per i malvistosi",
   "upload_form.focus": "Cambià a vista",
   "upload_form.undo": "Sguassà",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index e11e0be93e..508b5debeb 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -10,7 +10,7 @@
   "account.edit_profile": "Upravit profil",
   "account.endorse": "Představit na profilu",
   "account.follow": "Sledovat",
-  "account.followers": "Sledovatelé",
+  "account.followers": "Sledující",
   "account.followers.empty": "Tohoto uživatele ještě nikdo nesleduje.",
   "account.follows": "Sledovaní",
   "account.follows.empty": "Tento uživatel ještě nikoho nesleduje.",
@@ -70,8 +70,8 @@
   "compose_form.direct_message_warning": "Tento toot bude odeslán pouze zmíněným uživatelům.",
   "compose_form.direct_message_warning_learn_more": "Zjistit více",
   "compose_form.hashtag_warning": "Tento toot nebude zobrazen pod žádným hashtagem, neboť je neuvedený. Pouze veřejné tooty mohou být vyhledány podle hashtagu.",
-  "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky pouze pro sledovatele.",
-  "compose_form.lock_disclaimer.lock": "zamčený",
+  "compose_form.lock_disclaimer": "Váš účet není {locked}. Kdokoliv vás může sledovat a vidět vaše příspěvky pouze pro sledující.",
+  "compose_form.lock_disclaimer.lock": "uzamčen",
   "compose_form.placeholder": "Co máte na mysli?",
   "compose_form.publish": "Tootnout",
   "compose_form.publish_loud": "{publish}!",
@@ -88,7 +88,7 @@
   "confirmations.delete_list.confirm": "Smazat",
   "confirmations.delete_list.message": "Jste si jistý/á, že chcete tento seznam navždy vymazat?",
   "confirmations.domain_block.confirm": "Skrýt celou doménu",
-  "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou {domain}? Ve většině případů stačí zablokovat nebo ignorovat pár konkrétních uživatelů, což se doporučuje. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledovatelé z této domény budou odstraněni.",
+  "confirmations.domain_block.message": "Jste si opravdu, opravdu jistý/á, že chcete blokovat celou doménu {domain}? Ve většině případů stačí zablokovat nebo ignorovat pár konkrétních uživatelů, což se doporučuje. Z této domény neuvidíte obsah v žádné veřejné časové ose ani v oznámeních. Vaši sledující z této domény budou odstraněni.",
   "confirmations.mute.confirm": "Ignorovat",
   "confirmations.mute.message": "Jste si jistý/á, že chcete ignorovat uživatele {name}?",
   "confirmations.redraft.confirm": "Vymazat a přepsat",
@@ -128,7 +128,7 @@
   "empty_column.lists": "Ještě nemáte žádný seznam. Pokud nějaký vytvoříte, zobrazí se zde.",
   "empty_column.mutes": "Ještě neignorujete žádné uživatele.",
   "empty_column.notifications": "Ještě nemáte žádná oznámení. Začněte konverzaci komunikováním s ostatními.",
-  "empty_column.public": "Tady nic není! Napište něco veřejně, nebo manuálně začněte sledovat uživatele z jiných instancí, aby tu něco přibylo",
+  "empty_column.public": "Tady nic není! Napište něco veřejně, nebo začněte ručně sledovat uživatele z jiných serverů, aby tu něco přibylo",
   "follow_request.authorize": "Autorizovat",
   "follow_request.reject": "Odmítnout",
   "getting_started.developers": "Vývojáři",
@@ -160,7 +160,7 @@
   "introduction.interactions.favourite.headline": "Oblíbení",
   "introduction.interactions.favourite.text": "Oblíbením si můžete uložit toot na později a dát jeho autorovi vědět, že se vám líbí.",
   "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "Boostnutím můžete sdílet tooty jiných lidí s vašimi sledovately.",
+  "introduction.interactions.reblog.text": "Boostnutím můžete sdílet tooty jiných lidí s vašimi sledujícími.",
   "introduction.interactions.reply.headline": "Odpověď",
   "introduction.interactions.reply.text": "Můžete odpovídat na tooty jiných lidí i vaše vlastní, což je propojí do konverzace.",
   "introduction.welcome.action": "Jdeme na to!",
@@ -224,10 +224,10 @@
   "navigation_bar.favourites": "Oblíbené",
   "navigation_bar.filters": "Skrytá slova",
   "navigation_bar.follow_requests": "Požadavky o sledování",
-  "navigation_bar.info": "O této instanci",
+  "navigation_bar.info": "O tomto serveru",
   "navigation_bar.keyboard_shortcuts": "Klávesové zkratky",
   "navigation_bar.lists": "Seznamy",
-  "navigation_bar.logout": "Odhlásit se",
+  "navigation_bar.logout": "Odhlásit",
   "navigation_bar.mutes": "Ignorovaní uživatelé",
   "navigation_bar.personal": "Osobní",
   "navigation_bar.pins": "Připnuté tooty",
@@ -245,7 +245,7 @@
   "notifications.column_settings.filter_bar.advanced": "Zobrazit všechny kategorie",
   "notifications.column_settings.filter_bar.category": "Panel rychlého filtrování",
   "notifications.column_settings.filter_bar.show": "Zobrazit",
-  "notifications.column_settings.follow": "Noví sledovatelé:",
+  "notifications.column_settings.follow": "Noví sledující:",
   "notifications.column_settings.mention": "Zmínky:",
   "notifications.column_settings.push": "Push oznámení",
   "notifications.column_settings.reblog": "Boosty:",
@@ -260,8 +260,8 @@
   "privacy.change": "Změnit soukromí příspěvku",
   "privacy.direct.long": "Odeslat pouze zmíněným uživatelům",
   "privacy.direct.short": "Přímý",
-  "privacy.private.long": "Odeslat pouze sledovatelům",
-  "privacy.private.short": "Pouze pro sledovatele",
+  "privacy.private.long": "Odeslat pouze sledujícím",
+  "privacy.private.short": "Pouze pro sledující",
   "privacy.public.long": "Odeslat na veřejné časové osy",
   "privacy.public.short": "Veřejný",
   "privacy.unlisted.long": "Neodeslat na veřejné časové osy",
@@ -276,7 +276,7 @@
   "reply_indicator.cancel": "Zrušit",
   "report.forward": "Přeposlat na {target}",
   "report.forward_hint": "Tento účet je z jiného serveru. Chcete na něj také poslat anonymizovanou kopii?",
-  "report.hint": "Toto nahlášení bude zasláno moderátorům vaší instance. Níže můžete uvést, proč tento účet nahlašujete:",
+  "report.hint": "Toto nahlášení bude zasláno moderátorům vašeho serveru. Níže můžete uvést, proč tento účet nahlašujete:",
   "report.placeholder": "Dodatečné komentáře",
   "report.submit": "Odeslat",
   "report.target": "Nahlášení uživatele {target}",
@@ -297,6 +297,7 @@
   "status.block": "Zablokovat uživatele @{name}",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
+  "status.copy": "Copy link to status",
   "status.delete": "Smazat",
   "status.detailed_status": "Detailní zobrazení konverzace",
   "status.direct": "Poslat přímou zprávu uživateli @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Váš koncept se ztratí, pokud Mastodon opustíte.",
   "upload_area.title": "Přetažením nahrajete",
   "upload_button.label": "Přidat média (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Popis pro zrakově postižené",
   "upload_form.focus": "Změnit náhled",
   "upload_form.undo": "Smazat",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index f35b96244e..df08b907c1 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Ychwanegu neu Dileu o'r rhestrau",
   "account.badges.bot": "Bot",
   "account.block": "Blocio @{name}",
   "account.block_domain": "Cuddio popeth rhag {domain}",
@@ -17,7 +17,7 @@
   "account.follows_you": "Yn eich dilyn chi",
   "account.hide_reblogs": "Cuddio bwstiau o @{name}",
   "account.link_verified_on": "Gwiriwyd perchnogaeth y ddolen yma ar {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "Mae'r statws preifatrwydd cyfrif hwn wedi'i osod i gloi. Mae'r perchennog yn adolygu'r sawl sy'n gallu eu dilyn.",
   "account.media": "Cyfryngau",
   "account.mention": "Crybwyll @{name}",
   "account.moved_to": "Mae @{name} wedi symud i:",
@@ -132,7 +132,7 @@
   "follow_request.authorize": "Caniatau",
   "follow_request.reject": "Gwrthod",
   "getting_started.developers": "Datblygwyr",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Cyfeiriadur proffil",
   "getting_started.documentation": "Dogfennaeth",
   "getting_started.heading": "Dechrau",
   "getting_started.invite": "Gwahodd pobl",
@@ -156,15 +156,15 @@
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
   "introduction.federation.local.headline": "Local",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
+  "introduction.interactions.action": "Gorffen tiwtorial!",
   "introduction.interactions.favourite.headline": "Ffefryn",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
   "introduction.interactions.reblog.headline": "Hwb",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
   "introduction.interactions.reply.headline": "Ateb",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "Awn ni!",
+  "introduction.welcome.headline": "Camau cyntaf",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
   "keyboard_shortcuts.back": "i lywio nôl",
   "keyboard_shortcuts.blocked": "i agor rhestr defnyddwyr a flociwyd",
@@ -242,8 +242,8 @@
   "notifications.clear_confirmation": "Ydych chi'n sicr eich bod am glirio'ch holl hysbysiadau am byth?",
   "notifications.column_settings.alert": "Hysbysiadau bwrdd gwaith",
   "notifications.column_settings.favourite": "Ffefrynnau:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.advanced": "Dangos pob categori",
+  "notifications.column_settings.filter_bar.category": "Bar hidlo",
   "notifications.column_settings.filter_bar.show": "Dangos",
   "notifications.column_settings.follow": "Dilynwyr newydd:",
   "notifications.column_settings.mention": "Crybwylliadau:",
@@ -255,7 +255,7 @@
   "notifications.filter.boosts": "Hybiadau",
   "notifications.filter.favourites": "Ffefrynnau",
   "notifications.filter.follows": "Yn dilyn",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.mentions": "Crybwylliadau",
   "notifications.group": "{count} o hysbysiadau",
   "privacy.change": "Addasu preifatrwdd y tŵt",
   "privacy.direct.long": "Cyhoeddi i'r defnyddwyr sy'n cael eu crybwyll yn unig",
@@ -290,13 +290,14 @@
   "search_results.accounts": "Pobl",
   "search_results.hashtags": "Hanshnodau",
   "search_results.statuses": "Tŵtiau",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "search_results.total": "{count, number} {count, plural, one {result} arall {results}}",
   "standalone.public_title": "Golwg tu fewn...",
   "status.admin_account": "Open moderation interface for @{name}",
   "status.admin_status": "Open this tŵt in the moderation interface",
   "status.block": "Blocio @{name}",
   "status.cancel_reblog_private": "Dadfŵstio",
   "status.cannot_reblog": "Ni ellir sbarduno'r tŵt hwn",
+  "status.copy": "Copy link to status",
   "status.delete": "Dileu",
   "status.detailed_status": "Golwg manwl o'r sgwrs",
   "status.direct": "Neges breifat @{name}",
@@ -331,8 +332,8 @@
   "status.show_thread": "Dangos edefyn",
   "status.unmute_conversation": "Dad-dawelu sgwrs",
   "status.unpin": "Dadbinio o'r proffil",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "Diswyddo",
+  "suggestions.header": "Efallai y bydd gennych ddiddordeb mewn…",
   "tabs_bar.federated_timeline": "Ffederasiwn",
   "tabs_bar.home": "Hafan",
   "tabs_bar.local_timeline": "Lleol",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
   "upload_area.title": "Llusgwch & gollwing i uwchlwytho",
   "upload_button.label": "Ychwanegwch gyfryngau (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Disgrifio i'r rheini a nam ar ei golwg",
   "upload_form.focus": "Newid rhagolwg",
   "upload_form.undo": "Dileu",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index 60315211ad..f418d26f79 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -297,6 +297,7 @@
   "status.block": "Bloker @{name}",
   "status.cancel_reblog_private": "Fremhæv ikke længere",
   "status.cannot_reblog": "Denne post kan ikke fremhæves",
+  "status.copy": "Copy link to status",
   "status.delete": "Slet",
   "status.detailed_status": "Detaljeret visning af samtale",
   "status.direct": "Send direkte besked til @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.",
   "upload_area.title": "Træk og slip for at uploade",
   "upload_button.label": "Tilføj medie (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Beskriv for de svagtseende",
   "upload_form.focus": "Beskær",
   "upload_form.undo": "Slet",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 3a55f26a75..e7cfd48b72 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -150,20 +150,20 @@
   "home.column_settings.show_reblogs": "Geteilte Beiträge anzeigen",
   "home.column_settings.show_replies": "Antworten anzeigen",
   "introduction.federation.action": "Weiter",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Öffentliche Beiträge von anderen Servern im Fediverse werden in der föderierten Zeitleiste erscheinen.",
+  "introduction.federation.federated.headline": "Föderiert",
+  "introduction.federation.federated.text": "Öffentliche Beiträge von anderen Servern im Fediverse erscheinen in der föderierten Zeitleiste.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Beiträge von Leuten, denen du folgst werden in deiner Startseite erscheinen. Du kannst jedem auf irgendeinen Server folgen!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Öffentliche Beiträge von Leuten auf demselben Server wie du werden in der lokalen Zeitleiste erscheinen.",
+  "introduction.federation.home.text": "Beiträge von Leuten, denen du folgst, erscheinen in deiner Start-Zeitleiste. Du kannst Menschen auf beliebigen Servern folgen!",
+  "introduction.federation.local.headline": "Lokal",
+  "introduction.federation.local.text": "Öffentliche Beiträge von Leuten auf demselben Server wie du erscheinen in der lokalen Zeitleiste.",
   "introduction.interactions.action": "Tutorial beenden!",
   "introduction.interactions.favourite.headline": "Favorisieren",
-  "introduction.interactions.favourite.text": "Du kannst einen Beitrag für später speichern und dem Autor wissen lassen, dass du ihn magst, indem du ihn favorisierst.",
+  "introduction.interactions.favourite.text": "Du kannst Beitrage für später speichern und ihre AutorInnen wissen lassen, dass sie dir gefallen haben, indem du sie favorisierst.",
   "introduction.interactions.reblog.headline": "Teilen",
-  "introduction.interactions.reblog.text": "Du kannst Beiträge von anderen Leuten an deine Follower teilen.",
+  "introduction.interactions.reblog.text": "Du kannst Beiträge anderer mit deinen Followern teilen, indem du sie boostest.",
   "introduction.interactions.reply.headline": "Antworten",
-  "introduction.interactions.reply.text": "Du kannst auf die Beiträge von anderen Leuten antworten und die Beiträge werden dann in eine Konversation zusammengebunden.",
-  "introduction.welcome.action": "Lasst uns loslegen!",
+  "introduction.interactions.reply.text": "Du kannst auf die Beiträge anderer antworten und die Beiträge werden dann in einer Unterhaltung zusammengefasst.",
+  "introduction.welcome.action": "Lass uns loslegen!",
   "introduction.welcome.headline": "Erste Schritte",
   "introduction.welcome.text": "Willkommen im Fediverse! In wenigen Momenten wirst du in der Lage sein Nachrichten zu versenden und mit deinen Freunden über Server hinweg in Kontakt zu treten. Aber dieser Server, {domain}, ist sehr speziell — er hostet dein Profil, also merke dir den Namen.",
   "keyboard_shortcuts.back": "zurück navigieren",
@@ -297,6 +297,7 @@
   "status.block": "Blockiere @{name}",
   "status.cancel_reblog_private": "Nicht mehr teilen",
   "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
+  "status.copy": "Copy link to status",
   "status.delete": "Löschen",
   "status.detailed_status": "Detaillierte Ansicht der Konversation",
   "status.direct": "Direktnachricht @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.",
   "upload_area.title": "Zum Hochladen hereinziehen",
   "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
   "upload_form.focus": "Thumbnail bearbeiten",
   "upload_form.undo": "Löschen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 5df071839a..86b2a4a1d6 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -319,6 +319,10 @@
       {
         "defaultMessage": "Open this status in the moderation interface",
         "id": "status.admin_status"
+      },
+      {
+        "defaultMessage": "Copy link to status",
+        "id": "status.copy"
       }
     ],
     "path": "app/javascript/mastodon/components/status_action_bar.json"
@@ -1955,6 +1959,10 @@
       {
         "defaultMessage": "Open this status in the moderation interface",
         "id": "status.admin_status"
+      },
+      {
+        "defaultMessage": "Copy link to status",
+        "id": "status.copy"
       }
     ],
     "path": "app/javascript/mastodon/features/status/components/action_bar.json"
@@ -2294,4 +2302,4 @@
     ],
     "path": "app/javascript/mastodon/features/video/index.json"
   }
-]
+]
\ No newline at end of file
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 7b4852271b..165f90f0cb 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -7,7 +7,7 @@
   "account.direct": "Προσωπικό μήνυμα προς @{name}",
   "account.disclaimer_full": "Οι παρακάτω πληροφορίες μπορει να μην αντανακλούν το προφίλ του χρήστη επαρκως.",
   "account.domain_blocked": "Κρυμμένος τομέας",
-  "account.edit_profile": "Επεξεργάσου το προφίλ",
+  "account.edit_profile": "Επεξεργασία προφίλ",
   "account.endorse": "Προβολή στο προφίλ",
   "account.follow": "Ακολούθησε",
   "account.followers": "Ακόλουθοι",
@@ -145,16 +145,16 @@
   "hashtag.column_settings.tag_mode.all": "Όλα αυτα",
   "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά",
   "hashtag.column_settings.tag_mode.none": "Κανένα από αυτά",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_settings.tag_toggle": "Προσθήκη επιπλέον ταμπελών για την κολώνα",
   "home.column_settings.basic": "Βασικά",
   "home.column_settings.show_reblogs": "Εμφάνιση προωθήσεων",
   "home.column_settings.show_replies": "Εμφάνιση απαντήσεων",
   "introduction.federation.action": "Επόμενο",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.headline": "Ομοσπονδιακή",
   "introduction.federation.federated.text": "Οι δημόσιες αναρτήσεις από άλλους κόμβους του fediverse θα εμφανίζονται στην ομοσπονδιακή ροή.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "Αρχική",
   "introduction.federation.home.text": "Οι αναρτήσεις όσων ακολουθείς θα εμφανίζονται στην αρχική ροή. Μπορείς να ακολουθήσεις όποιον θέλεις σε οποιονδήποτε κόμβο!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "Τοπική",
   "introduction.federation.local.text": "Οι δημόσιες αναρτήσεις από άτομα στον ίδιο κόμβο με εσένα θα εμφανίζονται στην τοπική ροή.",
   "introduction.interactions.action": "Τέλος μαθήματος!",
   "introduction.interactions.favourite.headline": "Αγαπημένο",
@@ -165,7 +165,7 @@
   "introduction.interactions.reply.text": "Μπορείς να απαντήσεις στα τουτ άλλων αλλά ακόμα και στα δικά σου, δένοντας τα όλα μαζί σε μια συζήτηση.",
   "introduction.welcome.action": "Ας ξεκινήσουμε!",
   "introduction.welcome.headline": "Πρώτα βήματα",
-  "introduction.welcome.text": "Καλώς ήρθες στο fediverse! Σε πολύ λίγο θα μπορείς να στέλνεις δημοσιεύσεις και να μιλάς με τους φίλους σου σε πολλούς, διαφορετικούς κόμβους. Ο κόμβος {domain} όμως είναι ξεχωριστός — φιλοξενεί τον λογαριασμό σου, για αυτό μα θυμάσαι το όνομά του.",
+  "introduction.welcome.text": "Καλώς ήρθες στο fediverse! Σε πολύ λίγο θα μπορείς να στέλνεις δημοσιεύσεις και να μιλάς με τους φίλους σου σε πολλούς, διαφορετικούς κόμβους. Ο κόμβος {domain} όμως είναι ξεχωριστός — φιλοξενεί τον λογαριασμό σου, για αυτό να θυμάσαι το όνομά του.",
   "keyboard_shortcuts.back": "επιστροφή",
   "keyboard_shortcuts.blocked": "άνοιγμα λίστας αποκλεισμένων χρηστών",
   "keyboard_shortcuts.boost": "προώθηση",
@@ -292,11 +292,12 @@
   "search_results.statuses": "Τουτ",
   "search_results.total": "{count, number} {count, plural, ένα {result} υπόλοιπα {results}}",
   "standalone.public_title": "Μια πρώτη γεύση...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Άνοιγμα λειτουργίας διαμεσολάβησης για τον/την @{name}",
+  "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουργία διαμεσολάβησης",
   "status.block": "Αποκλεισμός @{name}",
   "status.cancel_reblog_private": "Ακύρωσε την προώθηση",
   "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί",
+  "status.copy": "Copy link to status",
   "status.delete": "Διαγραφή",
   "status.detailed_status": "Προβολή λεπτομερειών συζήτησης",
   "status.direct": "Προσωπικό μήνυμα προς @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
   "upload_area.title": "Drag & drop για να ανεβάσεις",
   "upload_button.label": "Πρόσθεσε πολυμέσα (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
   "upload_form.focus": "Αλλαγή προεπισκόπησης",
   "upload_form.undo": "Διαγραφή",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 03af57ba80..58e672aa53 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 8be964a52a..759eed46a0 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -297,6 +297,7 @@
   "status.block": "Bloki @{name}",
   "status.cancel_reblog_private": "Eksdiskonigi",
   "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
+  "status.copy": "Copy link to status",
   "status.delete": "Forigi",
   "status.detailed_status": "Detala konversacia vido",
   "status.direct": "Rekte mesaĝi @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
   "upload_area.title": "Altreni kaj lasi por alŝuti",
   "upload_button.label": "Aldoni aŭdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Priskribi por misvidantaj homoj",
   "upload_form.focus": "Stuci",
   "upload_form.undo": "Forigi",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 4f73dbba24..43bfe039ca 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Des-impulsar",
   "status.cannot_reblog": "Este toot no puede retootearse",
+  "status.copy": "Copy link to status",
   "status.delete": "Borrar",
   "status.detailed_status": "Vista de conversación detallada",
   "status.direct": "Mensaje directo a @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
   "upload_area.title": "Arrastra y suelta para subir",
   "upload_button.label": "Subir multimedia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describir para los usuarios con dificultad visual",
   "upload_form.focus": "Recortar",
   "upload_form.undo": "Borrar",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 0602fbf9e9..747348e718 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -292,11 +292,12 @@
   "search_results.statuses": "Toot-ak",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "Begiradatxo bat...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Ireki @{name} erabiltzailearen moderazio interfazea",
+  "status.admin_status": "Ireki mezu hau moderazio interfazean",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Kendu bultzada",
   "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman",
+  "status.copy": "Copy link to status",
   "status.delete": "Ezabatu",
   "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
   "status.direct": "Mezu zuzena @{name}(r)i",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
   "upload_area.title": "Arrastatu eta jaregin igotzeko",
   "upload_button.label": "Gehitu multimedia  (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
   "upload_form.focus": "Aldatu aurrebista",
   "upload_form.undo": "Ezabatu",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index b11d88d875..44c39802a1 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -297,6 +297,7 @@
   "status.block": "مسدودسازی @{name}",
   "status.cancel_reblog_private": "حذف بازبوق",
   "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید",
+  "status.copy": "Copy link to status",
   "status.delete": "پاک‌کردن",
   "status.detailed_status": "نمایش کامل گفتگو",
   "status.direct": "پیغام مستقیم به @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
   "upload_button.label": "افزودن عکس و ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان",
   "upload_form.focus": "بریدن لبه‌ها",
   "upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index c8d2586723..6e878d7ff6 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -297,6 +297,7 @@
   "status.block": "Estä @{name}",
   "status.cancel_reblog_private": "Peru buustaus",
   "status.cannot_reblog": "Tätä julkaisua ei voi buustata",
+  "status.copy": "Copy link to status",
   "status.delete": "Poista",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Viesti käyttäjälle @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.",
   "upload_area.title": "Lataa raahaamalla ja pudottamalla tähän",
   "upload_button.label": "Lisää mediaa",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Anna kuvaus näkörajoitteisia varten",
   "upload_form.focus": "Rajaa",
   "upload_form.undo": "Peru",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 7628968879..24182c00b9 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Dé-booster",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
+  "status.copy": "Copy link to status",
   "status.delete": "Effacer",
   "status.detailed_status": "Vue détaillée de la conversation",
   "status.direct": "Envoyer un message direct à @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
   "upload_area.title": "Glissez et déposez pour envoyer",
   "upload_button.label": "Joindre un média (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Décrire pour les malvoyant·e·s",
   "upload_form.focus": "Modifier l’aperçu",
   "upload_form.undo": "Supprimer",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index c1ece163d7..45bc2d36c5 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Non promover",
   "status.cannot_reblog": "Esta mensaxe non pode ser promovida",
+  "status.copy": "Copy link to status",
   "status.delete": "Eliminar",
   "status.detailed_status": "Vista detallada da conversa",
   "status.direct": "Mensaxe directa @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "O borrador perderase se sae de Mastodon.",
   "upload_area.title": "Arrastre e solte para subir",
   "upload_button.label": "Engadir medios (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describa para deficientes visuais",
   "upload_form.focus": "Cambiar vista previa",
   "upload_form.undo": "Eliminar",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index e27e7f09e6..13278382fd 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "לא ניתן להדהד הודעה זו",
+  "status.copy": "Copy link to status",
   "status.delete": "מחיקה",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
   "upload_area.title": "ניתן להעלות על ידי Drag & drop",
   "upload_button.label": "הוספת מדיה",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "תיאור לכבדי ראיה",
   "upload_form.focus": "Crop",
   "upload_form.undo": "ביטול",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 71dd5319e7..a4aafd8fbe 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ovaj post ne može biti boostan",
+  "status.copy": "Copy link to status",
   "status.delete": "Obriši",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Povuci i spusti kako bi uploadao",
   "upload_button.label": "Dodaj media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Poništi",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index c2842aea7b..41734b58da 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ezen státusz nem rebloggolható",
+  "status.copy": "Copy link to status",
   "status.delete": "Törlés",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "A piszkozata el fog vesztődni ha elhagyja Mastodon-t.",
   "upload_area.title": "Húzza ide a feltöltéshez",
   "upload_button.label": "Média hozzáadása",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Mégsem",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 6919948874..2169bb9908 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -297,6 +297,7 @@
   "status.block": "Ô±Ö€Õ£Õ¥Õ¬Õ¡ÖƒÕ¡Õ¯Õ¥Õ¬ @{name}ÖŠÕ«Õ¶",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ô±ÕµÕ½ Õ©Õ¸Ö‚Õ©Õ¨ Õ¹Õ« Õ¯Õ¡Ö€Õ¸Õ² Õ¿Õ¡Ö€Õ¡Õ®Õ¾Õ¥Õ¬",
+  "status.copy": "Copy link to status",
   "status.delete": "Õ‹Õ¶Õ»Õ¥Õ¬",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Õ”Õ¸ Õ½Õ¥Ö‚Õ¡Õ£Õ«Ö€Õ¨ Õ¯Õ¯Õ¸Ö€Õ«, Õ¥Õ©Õ¥ Õ¬Ö„Õ¥Õ½ Õ„Õ¡Õ½Õ¿Õ¸Õ¤Õ¸Õ¶Õ¨Ö‰",
   "upload_area.title": "Քաշիր ու նետիր՝ վերբեռնելու համար",
   "upload_button.label": "Ավելացնել մեդիա",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Նկարագրություն ավելացրու տեսողական խնդիրներ ունեցողների համար",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Õ€Õ¥Õ¿Õ¡Ö€Õ¯Õ¥Õ¬",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index eed61af707..c8cd2b3d29 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Hapus",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.",
   "upload_area.title": "Seret & lepaskan untuk mengunggah",
   "upload_button.label": "Tambahkan media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Deskripsikan untuk mereka yang tidak bisa melihat dengan jelas",
   "upload_form.focus": "Potong",
   "upload_form.undo": "Undo",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index b26fa6c4ab..17f74cbabc 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Efacar",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Tranar faligar por kargar",
   "upload_button.label": "Adjuntar kontenajo",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Desfacar",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 1f52d37248..423efdbc3c 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -292,11 +292,12 @@
   "search_results.statuses": "Toot",
   "search_results.total": "{count} {count, plural, one {risultato} other {risultati}}",
   "standalone.public_title": "Un'occhiata all'interno...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Apri interfaccia di moderazione per @{name}",
+  "status.admin_status": "Apri questo status nell'interfaccia di moderazione",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Annulla condivisione",
   "status.cannot_reblog": "Questo post non può essere condiviso",
+  "status.copy": "Copy link to status",
   "status.delete": "Elimina",
   "status.detailed_status": "Vista conversazione dettagliata",
   "status.direct": "Messaggio diretto @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
   "upload_area.title": "Trascina per caricare",
   "upload_button.label": "Aggiungi file multimediale",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descrizione per utenti con disabilità visive",
   "upload_form.focus": "Modifica anteprima",
   "upload_form.undo": "Cancella",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 92f9b0effe..13364066fa 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -297,6 +297,7 @@
   "status.block": "@{name}さんをブロック",
   "status.cancel_reblog_private": "ブースト解除",
   "status.cannot_reblog": "この投稿はブーストできません",
+  "status.copy": "Copy link to status",
   "status.delete": "削除",
   "status.detailed_status": "詳細な会話ビュー",
   "status.direct": "@{name}さんにダイレクトメッセージ",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 93a11027a6..e2e7306fd0 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -297,6 +297,7 @@
   "status.block": "დაბლოკე @{name}",
   "status.cancel_reblog_private": "ბუსტის მოშორება",
   "status.cannot_reblog": "ეს პოსტი ვერ დაიბუსტება",
+  "status.copy": "Copy link to status",
   "status.delete": "წაშლა",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "პირდაპირი წერილი @{name}-ს",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "თქვენი დრაფტი გაუქმდება თუ დატოვებთ მასტოდონს.",
   "upload_area.title": "გადმოწიეთ და ჩააგდეთ ასატვირთათ",
   "upload_button.label": "მედიის დამატება",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "აღწერილობა ვიზუალურად უფასურისთვის",
   "upload_form.focus": "კროპი",
   "upload_form.undo": "გაუქმება",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index ceb474a3e5..6d607068e2 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -297,6 +297,7 @@
   "status.block": "@{name} 차단",
   "status.cancel_reblog_private": "부스트 취소",
   "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
+  "status.copy": "Copy link to status",
   "status.delete": "삭제",
   "status.detailed_status": "대화 자세히 보기",
   "status.direct": "@{name}에게 다이렉트 메시지",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
   "upload_area.title": "드래그 & 드롭으로 업로드",
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "시각장애인을 위한 설명",
   "upload_form.focus": "미리보기 변경",
   "upload_form.undo": "삭제",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 0d510d011f..dbea1d6dc9 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -1,136 +1,136 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
-  "account.badges.bot": "Bot",
-  "account.block": "Block @{name}",
-  "account.block_domain": "Hide everything from {domain}",
-  "account.blocked": "Blocked",
-  "account.direct": "Direct message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
-  "account.domain_blocked": "Domain hidden",
-  "account.edit_profile": "Edit profile",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Follow",
-  "account.followers": "Followers",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.follows": "Follows",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "Follows you",
-  "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-  "account.media": "Media",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
-  "account.mute": "Mute @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots and replies",
-  "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval. Click to cancel follow request",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
-  "column.blocks": "Blocked users",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media Only",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.publish": "Toot",
+  "account.add_or_remove_from_list": "Pievienot vai noņemt no saraksta",
+  "account.badges.bot": "Bots",
+  "account.block": "BloÄ·Ä“t @{name}",
+  "account.block_domain": "Slēpt visu no {domain}",
+  "account.blocked": "BloÄ·Ä“ts",
+  "account.direct": "Privātā ziņa @{name}",
+  "account.disclaimer_full": "Informācija zemāk var nepilnīgi atspoguļot lietotāja profilu.",
+  "account.domain_blocked": "Domēns ir paslēpts",
+  "account.edit_profile": "Labot profilu",
+  "account.endorse": "Izcelts profilā",
+  "account.follow": "Sekot",
+  "account.followers": "Sekotāji",
+  "account.followers.empty": "Šim lietotājam nav sekotāju.",
+  "account.follows": "Seko",
+  "account.follows.empty": "Šis lietotājs pagaidām nevienam neseko.",
+  "account.follows_you": "Seko tev",
+  "account.hide_reblogs": "Paslēpt paceltos ierakstus no lietotāja @{name}",
+  "account.link_verified_on": "Šīs saites piederība ir pārbaudīta {date}",
+  "account.locked_info": "Šī konta privātuma status ir iestatīts slēgts. Īpašnieks izskatīs un izvēlēsies kas viņam drīkst sekot.",
+  "account.media": "MÄ“diji",
+  "account.mention": "Piemin @{name}",
+  "account.moved_to": "{name} ir pārvācies uz:",
+  "account.mute": "Apklusināt @{name}",
+  "account.mute_notifications": "Nerādīt paziņojumus no @{name}",
+  "account.muted": "Apklusināts",
+  "account.posts": "Ieraksti",
+  "account.posts_with_replies": "Ieraksti un atbildes",
+  "account.report": "Ziņot par lietotāju @{name}",
+  "account.requested": "Gaidām apstiprinājumu. Nospied lai atceltu sekošanas pieparasījumu",
+  "account.share": "Dalīties ar lietotāja @{name}'s profilu",
+  "account.show_reblogs": "Parādīt lietotāja @{name} paceltos ierakstus",
+  "account.unblock": "Atbloķēt lietotāju @{name}",
+  "account.unblock_domain": "Atbloķēt domēnu {domain}",
+  "account.unendorse": "Neizcelt profilā",
+  "account.unfollow": "Nesekot",
+  "account.unmute": "Noņemt apklusinājumu no lietotāja @{name}",
+  "account.unmute_notifications": "Rādīt paziņojumus no lietotāja @{name}",
+  "account.view_full_profile": "Apskatīt pilnu profilu",
+  "alert.unexpected.message": "Negaidīta kļūda.",
+  "alert.unexpected.title": "Ups!",
+  "boost_modal.combo": "Nospied {combo} lai izlaistu šo nākamreiz",
+  "bundle_column_error.body": "Kaut kas nogāja greizi ielādējot šo komponenti.",
+  "bundle_column_error.retry": "Mēģini vēlreiz",
+  "bundle_column_error.title": "Tīkla kļūda",
+  "bundle_modal_error.close": "Aizvērt",
+  "bundle_modal_error.message": "Kaut kas nogāja greizi ielādējot šo komponenti.",
+  "bundle_modal_error.retry": "Mēģini vēlreiz",
+  "column.blocks": "Bloķētie lietotāji",
+  "column.community": "Lokālā laika līnija",
+  "column.direct": "Privātās ziņas",
+  "column.domain_blocks": "Paslēptie domēni",
+  "column.favourites": "Favorīti",
+  "column.follow_requests": "Sekotāju pieprasījumi",
+  "column.home": "Sākums",
+  "column.lists": "Saraksti",
+  "column.mutes": "Apklusinātie lietotāji",
+  "column.notifications": "Paziņojumi",
+  "column.pins": "Piespraustie ziņojumi",
+  "column.public": "Federatīvā laika līnija",
+  "column_back_button.label": "Atpakaļ",
+  "column_header.hide_settings": "Paslēpt iestatījumus",
+  "column_header.moveLeft_settings": "Pārvietot kolonu pa kreisi",
+  "column_header.moveRight_settings": "Pārvietot kolonu pa labi",
+  "column_header.pin": "Piespraust",
+  "column_header.show_settings": "Rādīt iestatījumus",
+  "column_header.unpin": "Atspraust",
+  "column_subheading.settings": "Iestatījumi",
+  "community.column_settings.media_only": "Tikai mēdiji",
+  "compose_form.direct_message_warning": "Šis ziņojums tiks nosūtīts tikai pieminētajiem lietotājiem.",
+  "compose_form.direct_message_warning_learn_more": "Papildus informācija",
+  "compose_form.hashtag_warning": "Ziņojumu nebūs iespējams atrast zem haštagiem jo tas nav publisks. Tikai publiskos ziņojumus ir iespējams meklēt pēc tiem.",
+  "compose_form.lock_disclaimer": "Tavs konts nav {locked}. Ikviens var Tev sekot lai apskatītu tikai sekotājiem paredzētos ziņojumus.",
+  "compose_form.lock_disclaimer.lock": "slēgts",
+  "compose_form.placeholder": "Ko vēlies publicēt?",
+  "compose_form.publish": "Publicēt",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
-  "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
-  "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
-  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
-  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
-  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other instances to fill it up",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
+  "compose_form.sensitive.marked": "Mēdijs ir atzīmēts kā sensitīvs",
+  "compose_form.sensitive.unmarked": "Mēdijs nav atzīmēts kā sensitīvs",
+  "compose_form.spoiler.marked": "Teksts ir paslēpts aiz brīdinājuma",
+  "compose_form.spoiler.unmarked": "Teksts nav paslēpts",
+  "compose_form.spoiler_placeholder": "Ieraksti Savu brīdinājuma tekstu šeit",
+  "confirmation_modal.cancel": "Atcelt",
+  "confirmations.block.confirm": "BloÄ·Ä“t",
+  "confirmations.block.message": "Vai tiešām vēlies bloķēt lietotāju {name}?",
+  "confirmations.delete.confirm": "Dzēst",
+  "confirmations.delete.message": "Vai tiešām vēlies dzēst šo ierakstu?",
+  "confirmations.delete_list.confirm": "Dzēst",
+  "confirmations.delete_list.message": "Vai tiešam vēlies neatgriezeniski dzēst šo sarakstu?",
+  "confirmations.domain_block.confirm": "Paslēpt visu domēnu",
+  "confirmations.domain_block.message": "Vai tu tiešām, tiešam vēlies bloķēt visu domēnu {domain}? Lielākajā daļā gadījumu pietiek ja nobloķē vai apklusini kādu. Tu neredzēsi saturu vai paziņojumus no šī domēna nevienā laika līnijā. Tavi sekotāji no šī domēna tiks noņemti.",
+  "confirmations.mute.confirm": "Apklusināt",
+  "confirmations.mute.message": "Vai Tu tiešām velies apklusināt {name}?",
+  "confirmations.redraft.confirm": "Dzēst un pārrakstīt",
+  "confirmations.redraft.message": "Vai tiešām vēlies dzēst un pārrakstīt šo ierakstu? Favorīti un paceltie ieraksti tiks dzēsti, kā arī atbildes tiks atsaistītas no šī ieraksta.",
+  "confirmations.reply.confirm": "Atbildēt",
+  "confirmations.reply.message": "Atbildot tagad tava ziņa ko šobrīd raksti tiks pārrakstīta. Vai tiešām vēlies turpināt?",
+  "confirmations.unfollow.confirm": "Nesekot",
+  "confirmations.unfollow.message": "Vai tiešam vairs nevēlies sekot lietotājam {name}?",
+  "embed.instructions": "Iegul šo ziņojumu savā mājaslapā kopējot kodu zemāk.",
+  "embed.preview": "Tas izskatīsies šādi:",
+  "emoji_button.activity": "Aktivitāte",
+  "emoji_button.custom": "Pielāgots",
+  "emoji_button.flags": "Karogi",
+  "emoji_button.food": "Ēdieni un dzērieni",
+  "emoji_button.label": "Ielikt emoji smaidiņu",
+  "emoji_button.nature": "Daba",
+  "emoji_button.not_found": "Nekādu emodžīšu!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objekti",
+  "emoji_button.people": "Cilvēki",
+  "emoji_button.recent": "Biežāk lietotie",
+  "emoji_button.search": "Meklēt...",
+  "emoji_button.search_results": "Meklēšanas rezultāti",
+  "emoji_button.symbols": "Simboli",
+  "emoji_button.travel": "Ceļošana & Vietas",
+  "empty_column.account_timeline": "Šeit ziņojumu nav!",
+  "empty_column.blocks": "Tu neesi vēl nevienu bloķējis.",
+  "empty_column.community": "Lokālā laika līnija ir tukša. :/ Ieraksti kaut ko lai sākas rosība!",
+  "empty_column.direct": "Tev nav privāto ziņu. Tiklīdz saņemsi tās šeit parādīsies.",
+  "empty_column.domain_blocks": "Slēpto domēnu vēl nav.",
+  "empty_column.favourited_statuses": "Tev vēl nav iemīļoto ziņojumu. Kad Tev tādu būs tie šeit parādīsies.",
+  "empty_column.favourites": "Neviens šo ziņojumu nav pievienojis favorītiem. Kad tādu būs tie šeit parādīsies.",
+  "empty_column.follow_requests": "Šobrīd neviens nav pieteicies tev sekot. Kad kāds pieteiksies tas parādīsies šeit.",
+  "empty_column.hashtag": "Ar šo haštagu nekas nav atrodams.",
+  "empty_column.home": "Tava laika līnija ir tukša! Apmeklē federatīvo laika līniju vai uzmeklē kādu meklētājā lai satiktu citus.",
+  "empty_column.home.public_timeline": "publiskā laika līnija",
+  "empty_column.list": "Šis saraksts ir tukšs. Kad šī saraksta dalībnieki atjaunos statusu tas parādīsies šeit.",
+  "empty_column.lists": "Tev nav neviena saraksta. Kad tādu būs tie parādīsies šeit.",
+  "empty_column.mutes": "Tu neesi nevienu apklusinājis.",
+  "empty_column.notifications": "Tev nav paziņojumu. Iesaisties sarunās ar citiem.",
+  "empty_column.public": "Šeit nekā nav, tukšums! Ieraksti kaut ko publiski, vai uzmeklē un seko kādam no citas instances",
+  "follow_request.authorize": "Autorizēt",
+  "follow_request.reject": "Noraidīt",
   "getting_started.developers": "Developers",
   "getting_started.directory": "Profile directory",
   "getting_started.documentation": "Documentation",
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 0d510d011f..602a59ca08 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 871142195d..92f94ddc06 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -297,6 +297,7 @@
   "status.block": "Blokkeer @{name}",
   "status.cancel_reblog_private": "Niet langer boosten",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
+  "status.copy": "Copy link to status",
   "status.delete": "Verwijderen",
   "status.detailed_status": "Uitgebreide gespreksweergave",
   "status.direct": "Directe toot @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.",
   "upload_area.title": "Hierin slepen om te uploaden",
   "upload_button.label": "Media toevoegen (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
   "upload_form.focus": "Voorvertoning aanpassen",
   "upload_form.undo": "Verwijderen",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index fa08e8d73b..f6910f0e66 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Denne posten kan ikke fremheves",
+  "status.copy": "Copy link to status",
   "status.delete": "Slett",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
   "upload_area.title": "Dra og slipp for å laste opp",
   "upload_button.label": "Legg til media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Beskriv for synshemmede",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Angre",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index c28e9f5b83..8250d59bdc 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -251,7 +251,7 @@
   "notifications.column_settings.reblog": "Partatges :",
   "notifications.column_settings.show": "Mostrar dins la colomna",
   "notifications.column_settings.sound": "Emetre un son",
-  "notifications.filter.all": "Totes",
+  "notifications.filter.all": "Totas",
   "notifications.filter.boosts": "Partages",
   "notifications.filter.favourites": "Favorits",
   "notifications.filter.follows": "Seguiments",
@@ -297,6 +297,7 @@
   "status.block": "Blocar @{name}",
   "status.cancel_reblog_private": "Quitar de partejar",
   "status.cannot_reblog": "Aqueste estatut pòt pas èsser partejat",
+  "status.copy": "Copy link to status",
   "status.delete": "Escafar",
   "status.detailed_status": "Vista detalhada de la convèrsa",
   "status.direct": "Messatge per @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.",
   "upload_area.title": "Lisatz e depausatz per mandar",
   "upload_button.label": "Ajustar un mèdia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descripcion pels mal vesents",
   "upload_form.focus": "Modificar l’apercebut",
   "upload_form.undo": "Suprimir",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index a1cda6c2d4..2af261251d 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -297,6 +297,7 @@
   "status.block": "Zablokuj @{name}",
   "status.cancel_reblog_private": "Cofnij podbicie",
   "status.cannot_reblog": "Ten wpis nie może zostać podbity",
+  "status.copy": "Copy link to status",
   "status.delete": "Usuń",
   "status.detailed_status": "Szczegółowy widok konwersacji",
   "status.direct": "Wyślij wiadomość bezpośrednią do @{name}",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 392e7f485d..bc36829210 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Desfazer compartilhamento",
   "status.cannot_reblog": "Esta postagem não pode ser compartilhada",
+  "status.copy": "Copy link to status",
   "status.delete": "Excluir",
   "status.detailed_status": "Visão detalhada da conversa",
   "status.direct": "Enviar mensagem direta a @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Seu rascunho será perdido se você sair do Mastodon.",
   "upload_area.title": "Arraste e solte para enviar",
   "upload_button.label": "Adicionar mídia (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descreva a imagem para deficientes visuais",
   "upload_form.focus": "Ajustar foco",
   "upload_form.undo": "Remover",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index d4126704a2..edcfd2fa29 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Este post não pode ser partilhado",
+  "status.copy": "Copy link to status",
   "status.delete": "Eliminar",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "O teu rascunho vai ser perdido se abandonares o Mastodon.",
   "upload_area.title": "Arraste e solte para enviar",
   "upload_button.label": "Adicionar media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Descrição da imagem para pessoas com dificuldades visuais",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Anular",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index a1a514f494..3be3214ee9 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -297,6 +297,7 @@
   "status.block": "Blochează @{name}",
   "status.cancel_reblog_private": "Nedistribuit",
   "status.cannot_reblog": "Această postare nu poate fi redistribuită",
+  "status.copy": "Copy link to status",
   "status.delete": "Șterge",
   "status.detailed_status": "Conversația detailată",
   "status.direct": "Mesaj direct @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Postarea se va pierde dacă părăsești pagina.",
   "upload_area.title": "Trage și eliberează pentru a încărca",
   "upload_button.label": "Adaugă media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Adaugă o descriere pentru persoanele cu deficiențe de vedere",
   "upload_form.focus": "Schimbă previzualizarea",
   "upload_form.undo": "Șterge",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index cb60108986..db9e732c09 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -297,6 +297,7 @@
   "status.block": "Заблокировать @{name}",
   "status.cancel_reblog_private": "Не продвигать",
   "status.cannot_reblog": "Этот статус не может быть продвинут",
+  "status.copy": "Copy link to status",
   "status.delete": "Удалить",
   "status.detailed_status": "Подробный просмотр обсуждения",
   "status.direct": "Написать @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
   "upload_area.title": "Перетащите сюда, чтобы загрузить",
   "upload_button.label": "Добавить медиаконтент",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Описать для людей с нарушениями зрения",
   "upload_form.focus": "Обрезать",
   "upload_form.undo": "Отменить",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index a3467785a4..8ca9132454 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -13,7 +13,7 @@
   "account.followers": "Sledujúci",
   "account.followers.empty": "Tohto užívateľa ešte nikto nenásleduje.",
   "account.follows": "Následuje",
-  "account.follows.empty": "Tento užívateľ tu ešte nikoho nenásleduje.",
+  "account.follows.empty": "Tento užívateľ ešte nikoho nenásleduje.",
   "account.follows_you": "Následuje ťa",
   "account.hide_reblogs": "Skryť povýšenia od @{name}",
   "account.link_verified_on": "Vlastníctvo tohto odkazu bolo skontrolované {date}",
@@ -35,7 +35,7 @@
   "account.unendorse": "Nezobrazuj na profile",
   "account.unfollow": "Prestaň následovať",
   "account.unmute": "Prestaň ignorovať @{name}",
-  "account.unmute_notifications": "Odtĺm oboznámenia od @{name}",
+  "account.unmute_notifications": "Zrušiť stlmenie oznámení od @{name}",
   "account.view_full_profile": "Pozri celý profil",
   "alert.unexpected.message": "Vyskytla sa nečakaná chyba.",
   "alert.unexpected.title": "Oops!",
@@ -60,9 +60,9 @@
   "column.public": "Federovaná časová os",
   "column_back_button.label": "Späť",
   "column_header.hide_settings": "Skryť nastavenia",
-  "column_header.moveLeft_settings": "Presunúť stĺpec doľava",
-  "column_header.moveRight_settings": "Presunúť stĺpec doprava",
-  "column_header.pin": "Pripnúť",
+  "column_header.moveLeft_settings": "Presuň stĺpec doľava",
+  "column_header.moveRight_settings": "Presuň stĺpec doprava",
+  "column_header.pin": "Pripni",
   "column_header.show_settings": "Ukáž nastavenia",
   "column_header.unpin": "Odopnúť",
   "column_subheading.settings": "Nastavenia",
@@ -79,14 +79,14 @@
   "compose_form.sensitive.unmarked": "Médiálny obsah nieje označený ako chúlostivý",
   "compose_form.spoiler.marked": "Text je ukrytý za varovaním",
   "compose_form.spoiler.unmarked": "Text nieje ukrytý",
-  "compose_form.spoiler_placeholder": "Sem napíšte vaše varovanie",
-  "confirmation_modal.cancel": "Zrušiť",
-  "confirmations.block.confirm": "Blokovať",
-  "confirmations.block.message": "Si si istý, že chcete blokovať {name}?",
-  "confirmations.delete.confirm": "Zmazať",
-  "confirmations.delete.message": "Si si naozaj istá/ý, že chceš vymazať túto správu?",
-  "confirmations.delete_list.confirm": "Vymazať",
-  "confirmations.delete_list.message": "Si si istý/á, že chceš navždy vymazať tento zoznam?",
+  "compose_form.spoiler_placeholder": "Sem napíš tvoje varovanie",
+  "confirmation_modal.cancel": "Zruš",
+  "confirmations.block.confirm": "Blokuj",
+  "confirmations.block.message": "Si si istý/á, že chceš blokovať {name}?",
+  "confirmations.delete.confirm": "Vymaž",
+  "confirmations.delete.message": "Si si istý/á, že chceš vymazať túto správu?",
+  "confirmations.delete_list.confirm": "Vymaž",
+  "confirmations.delete_list.message": "Si si istý/á, že chceš natrvalo vymazať tento zoznam?",
   "confirmations.domain_block.confirm": "Skryť celú doménu",
   "confirmations.domain_block.message": "Si si naozaj istý, že chceš blokovať celú {domain}? Vo väčšine prípadov stačí blokovať alebo ignorovať pár konkrétnych užívateľov, čo sa doporučuje. Neuvidíš obsah z tejto domény v žiadnej verejnej časovej osi, ani v oznámeniach. Tvoji následovníci pochádzajúci z tejto domény budú odstránení.",
   "confirmations.mute.confirm": "Ignoruj",
@@ -162,7 +162,7 @@
   "introduction.interactions.reblog.headline": "Povýš",
   "introduction.interactions.reblog.text": "Môžeš zdieľať príspevky iných ľudí s vašimi následovateľmi tým, že ich povýšiš.",
   "introduction.interactions.reply.headline": "Odpovedz",
-  "introduction.interactions.reply.text": "Odpovedať môžeš na príspevky iných ľudí, aj na svoje vlastné, čím sa sspolu prepoja do konverzácie.",
+  "introduction.interactions.reply.text": "Odpovedať môžeš na príspevky iných ľudí, aj na svoje vlastné, čím sa spolu prepoja do konverzácie.",
   "introduction.welcome.action": "Poďme do toho!",
   "introduction.welcome.headline": "Prvé kroky",
   "introduction.welcome.text": "Vitaj vo fediverse! Za malú chvíľu budeš môcť posielať správy a rozpovedať sa so svojími priateľmi cez širokú škálu rôznorodých serverov. Ale tento server, {domain}, je špeciálny v tom, že ukladá tvoj profil, takže si jeho názov zapametaj.",
@@ -212,7 +212,7 @@
   "media_gallery.toggle_visible": "Zapnúť/Vypnúť viditeľnosť",
   "missing_indicator.label": "Nenájdené",
   "missing_indicator.sublabel": "Tento zdroj sa ešte nepodarilo nájsť",
-  "mute_modal.hide_notifications": "Skryť oboznámenia od tohoto užívateľa?",
+  "mute_modal.hide_notifications": "Skryť oznámenia od tohto používateľa?",
   "navigation_bar.apps": "Mobilné aplikácie",
   "navigation_bar.blocks": "Blokovaní užívatelia",
   "navigation_bar.community_timeline": "Lokálna časová os",
@@ -220,11 +220,11 @@
   "navigation_bar.direct": "Súkromné správy",
   "navigation_bar.discover": "Objavuj",
   "navigation_bar.domain_blocks": "Skryté domény",
-  "navigation_bar.edit_profile": "Uprav profil",
+  "navigation_bar.edit_profile": "Upraviť profil",
   "navigation_bar.favourites": "Obľúbené",
   "navigation_bar.filters": "Utĺmené slová",
   "navigation_bar.follow_requests": "Žiadosti o sledovanie",
-  "navigation_bar.info": "O tomto Mastodon serveri",
+  "navigation_bar.info": "O tomto serveri",
   "navigation_bar.keyboard_shortcuts": "Klávesové skratky",
   "navigation_bar.lists": "Zoznamy",
   "navigation_bar.logout": "Odhlás sa",
@@ -255,10 +255,10 @@
   "notifications.filter.boosts": "Vyzdvihnutia",
   "notifications.filter.favourites": "Obľúbené",
   "notifications.filter.follows": "Sledovania",
-  "notifications.filter.mentions": "Spomenutia",
-  "notifications.group": "{count} oznámenia",
-  "privacy.change": "Zmeňiť viditeľnosť statusu",
-  "privacy.direct.long": "Poslať priamo iba spomenutým používateľom",
+  "notifications.filter.mentions": "Iba spomenutia",
+  "notifications.group": "{count} oboznámení",
+  "privacy.change": "Uprav súkromie príspevku",
+  "privacy.direct.long": "Pošli iba spomenutým používateľom",
   "privacy.direct.short": "Súkromne",
   "privacy.private.long": "Poslať iba následovateľom",
   "privacy.private.short": "Iba pre sledujúcich",
@@ -297,6 +297,7 @@
   "status.block": "Blokovať @{name}",
   "status.cancel_reblog_private": "Nezdieľaj",
   "status.cannot_reblog": "Tento príspevok nemôže byť re-tootnutý",
+  "status.copy": "Copy link to status",
   "status.delete": "Zmazať",
   "status.detailed_status": "Podrobný náhľad celej konverzácie",
   "status.direct": "Súkromná správa @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.",
   "upload_area.title": "Pretiahni a pusť pre nahratie",
   "upload_button.label": "Pridať médiálny súbor (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Opis pre slabo vidiacich",
   "upload_form.focus": "Pozmeň náhľad",
   "upload_form.undo": "Vymaž",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index cabad737d6..8e5e3deb98 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Dodaj ali odstrani iz seznama",
   "account.badges.bot": "Robot",
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Skrij vse iz {domain}",
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.",
   "upload_area.title": "Povlecite in spustite za pošiljanje",
   "upload_button.label": "Dodaj medij",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Opišite za slabovidne",
   "upload_form.focus": "Obreži",
   "upload_form.undo": "Izbriši",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
new file mode 100644
index 0000000000..3dd7fb4435
--- /dev/null
+++ b/app/javascript/mastodon/locales/sq.json
@@ -0,0 +1,360 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Hide everything from {domain}",
+  "account.blocked": "Blocked",
+  "account.direct": "Direct message @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.view_full_profile": "View full profile",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Close",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Try again",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media Only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.group": "{count} notifications",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_toggle": "Click to view",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.focus": "Crop",
+  "upload_form.undo": "Delete",
+  "upload_progress.label": "Uploading...",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index c8513dbe18..484e2690dc 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Ovaj status ne može da se podrži",
+  "status.copy": "Copy link to status",
   "status.delete": "Obriši",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.",
   "upload_area.title": "Prevucite ovde da otpremite",
   "upload_button.label": "Dodaj multimediju",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Opiši za slabovide osobe",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Opozovi",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 6e0ac6eca7..284ceab47a 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -297,6 +297,7 @@
   "status.block": "Блокирај @{name}",
   "status.cancel_reblog_private": "Уклони подршку",
   "status.cannot_reblog": "Овај статус не може да се подржи",
+  "status.copy": "Copy link to status",
   "status.delete": "Обриши",
   "status.detailed_status": "Детаљни преглед разговора",
   "status.direct": "Директна порука @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.",
   "upload_area.title": "Превуците овде да отпремите",
   "upload_button.label": "Додај мултимедију (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Опишите за особе са оштећеним видом",
   "upload_form.focus": "Подесите",
   "upload_form.undo": "Обриши",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 47ce8497a6..9acf2428ee 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Ta bort knuff",
   "status.cannot_reblog": "Detta inlägg kan inte knuffas",
+  "status.copy": "Copy link to status",
   "status.delete": "Ta bort",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direktmeddela @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.",
   "upload_area.title": "Dra & släpp för att ladda upp",
   "upload_button.label": "Lägg till media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Beskriv för synskadade",
   "upload_form.focus": "Beskär",
   "upload_form.undo": "Ta bort",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 0d510d011f..602a59ca08 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Delete",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 7306ec0019..b118c189f6 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -132,7 +132,7 @@
   "follow_request.authorize": "అనుమతించు",
   "follow_request.reject": "తిరస్కరించు",
   "getting_started.developers": "డెవలపర్లు",
-  "getting_started.directory": "ప్రొఫైల్ డైరెక్టరీProfile directory",
+  "getting_started.directory": "ప్రొఫైల్ డైరెక్టరీ",
   "getting_started.documentation": "డాక్యుమెంటేషన్",
   "getting_started.heading": "మొదలుపెడదాం",
   "getting_started.invite": "వ్యక్తులను ఆహ్వానించండి",
@@ -292,11 +292,12 @@
   "search_results.statuses": "టూట్లు",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "standalone.public_title": "లోపలికి ఒక చూపు...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "@{name} కొరకు సమన్వయ వినిమయసీమను తెరువు",
+  "status.admin_status": "సమన్వయ వినిమయసీమలో ఈ స్టేటస్ ను తెరవండి",
   "status.block": "@{name} ను బ్లాక్ చేయి",
   "status.cancel_reblog_private": "బూస్ట్ను తొలగించు",
   "status.cannot_reblog": "ఈ పోస్ట్ను బూస్ట్ చేయడం సాధ్యం కాదు",
+  "status.copy": "Copy link to status",
   "status.delete": "తొలగించు",
   "status.detailed_status": "వివరణాత్మక సంభాషణ వీక్షణ",
   "status.direct": "@{name}కు నేరుగా సందేశం పంపు",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.",
   "upload_area.title": "అప్లోడ్ చేయడానికి డ్రాగ్ & డ్రాప్ చేయండి",
   "upload_button.label": "మీడియాను జోడించండి (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "దృష్టి లోపమున్న వారి కోసం వివరించండి",
   "upload_form.focus": "ప్రివ్యూను మార్చు",
   "upload_form.undo": "తొలగించు",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 2683284f42..2b0fc40e2d 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Drag & drop to upload",
   "upload_button.label": "Add media",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Undo",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 5d8fc229e6..30dc06d8c4 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Bu gönderi boost edilemez",
+  "status.copy": "Copy link to status",
   "status.delete": "Sil",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Upload için sürükle bırak yapınız",
   "upload_button.label": "Görsel ekle",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Geri al",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 606dda89fc..5dfda49335 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -297,6 +297,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Цей допис не може бути передмухнутий",
+  "status.copy": "Copy link to status",
   "status.delete": "Видалити",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.",
   "upload_area.title": "Перетягніть сюди, щоб завантажити",
   "upload_button.label": "Додати медіаконтент",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "Опишіть для людей з вадами зору",
   "upload_form.focus": "Обрізати",
   "upload_form.undo": "Видалити",
diff --git a/app/javascript/mastodon/locales/whitelist_sq.json b/app/javascript/mastodon/locales/whitelist_sq.json
new file mode 100644
index 0000000000..0d4f101c7a
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_sq.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index dfa261d6e4..0cfa3f7129 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -297,6 +297,7 @@
   "status.block": "屏蔽 @{name}",
   "status.cancel_reblog_private": "取消转嘟",
   "status.cannot_reblog": "无法转嘟这条嘟文",
+  "status.copy": "Copy link to status",
   "status.delete": "删除",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "发送私信给 @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会被丢弃。",
   "upload_area.title": "将文件拖放到此处开始上传",
   "upload_button.label": "上传媒体文件",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "为视觉障碍人士添加文字说明",
   "upload_form.focus": "剪裁",
   "upload_form.undo": "取消上传",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index e57aa6d96d..999ca32168 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -297,6 +297,7 @@
   "status.block": "封鎖 @{name}",
   "status.cancel_reblog_private": "取消轉推",
   "status.cannot_reblog": "這篇文章無法被轉推",
+  "status.copy": "Copy link to status",
   "status.delete": "刪除",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "私訊 @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。",
   "upload_area.title": "將檔案拖放至此上載",
   "upload_button.label": "上載媒體檔案",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "為視覺障礙人士添加文字說明",
   "upload_form.focus": "裁切",
   "upload_form.undo": "刪除",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 0cbe5da5aa..26328e12e3 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -297,6 +297,7 @@
   "status.block": "封鎖 @{name}",
   "status.cancel_reblog_private": "取消轉嘟",
   "status.cannot_reblog": "這篇嘟文無法被轉嘟",
+  "status.copy": "Copy link to status",
   "status.delete": "刪除",
   "status.detailed_status": "對話的詳細內容",
   "status.direct": "發送私訊給 @{name}",
@@ -342,6 +343,7 @@
   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。",
   "upload_area.title": "拖放來上傳",
   "upload_button.label": "上傳媒體檔案 (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
   "upload_form.description": "為視障人士增加文字說明",
   "upload_form.focus": "裁切",
   "upload_form.undo": "刪除",
diff --git a/config/locales/activerecord.sq.yml b/config/locales/activerecord.sq.yml
new file mode 100644
index 0000000000..e52345978e
--- /dev/null
+++ b/config/locales/activerecord.sq.yml
@@ -0,0 +1,13 @@
+---
+sq:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: vetëm shkronja, numra dhe nënvija
+        status:
+          attributes:
+            reblog:
+              taken: e gjendjes ekziston tashmë
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 08f5578ba5..ec8b15cbae 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -195,6 +195,7 @@ ar:
         assigned_to_self_report: قام %{name} بتعيين التقرير %{target} لأنفسهم
         change_email_user: غيّر %{name} عنوان البريد الإلكتروني للمستخدم %{target}
         confirm_user: "%{name} قد قام بتأكيد عنوان البريد الإلكتروني لـ %{target}"
+        create_account_warning: قام %{name} بإرسال تحذير إلى %{target}
         create_custom_emoji: "%{name} قام برفع إيموجي جديد %{target}"
         create_domain_block: "%{name} قام بحجب نطاق %{target}"
         create_email_domain_block: "%{name} قد قام بحظر نطاق البريد الإلكتروني %{target}"
diff --git a/config/locales/co.yml b/config/locales/co.yml
index a7264e754a..5f961b4663 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -553,8 +553,11 @@ co:
     warning_title: Dispunibilità di i cuntenuti sparsi
   directories:
     directory: Annuariu di i prufili
+    enabled: Site inscrittu·a indè l'annuariu.
+    enabled_but_waiting: Avete sceltu d'esse inscrittu·a indè l'annuariu, mà ùn avete micca ancu u numeru minimale d'abbunati (%{min_followers}) per esse listatu·a.
     explanation: Scopre utilizatori à partesi di i so centri d'interessu
     explore_mastodon: Scopre à %{title}
+    how_to_enable: Ùn site micca ancu inscrittu·a indè l'annuariu. Pudete inscrive vi quì sottu. Utilizate qualchi hashtag indè a vostra biugrafia per esse listatu·a indè tag specifichi!
     people:
       one: "%{count} persona"
       other: "%{count} persone"
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 424ec3dab6..d1f11261cc 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -3,11 +3,11 @@ cs:
   about:
     about_hashtag_html: Tohle jsou veřejné tooty označené hashtagem <strong>#%{hashtag}</strong>. Pokud máte účet kdekoliv na fediverse, můžete s nimi interagovat.
     about_mastodon_html: Mastodon je sociální síť založená na otevřených webových protokolech a svobodném, otevřeném softwaru. Je decentralizovaná jako e-mail.
-    about_this: O této instanci
-    administered_by: 'Instanci spravuje:'
+    about_this: O tomto serveru
+    administered_by: 'Server spravuje:'
     api: API
     apps: Mobilní aplikace
-    closed_registrations: Registrace na této instanci jsou momentálně uzavřené. Ale pozor! Můžete si najít jinou instanci, vytvořit si na ní účet a získat z ní přístup do naprosto stejné sítě.
+    closed_registrations: Registrace na tomto serveru jsou momentálně uzavřené. Ale pozor! Můžete si najít jiný server, vytvořit si na něm účet a získat z něj přístup do naprosto stejné sítě.
     contact: Kontakt
     contact_missing: Nenastaveno
     contact_unavailable: Neuvedeno
@@ -25,9 +25,9 @@ cs:
       within_reach_body: Několik aplikací pro iOS, Android a jiné platformy vám díky jednoduchému API ekosystému dovolují držet krok s vašimi přáteli, ať už jste kdekoliv.
       within_reach_title: Vždy v dosahu
     generic_description: "%{domain} je jedním ze serverů v síti"
-    hosted_on: Instance Mastodon na adrese %{domain}
+    hosted_on: Server Mastodon na adrese %{domain}
     learn_more: Zjistit více
-    other_instances: Seznam instancí
+    other_instances: Seznam serverů
     privacy_policy: Zásady soukromí
     source_code: Zdrojový kód
     status_count_after:
@@ -47,8 +47,8 @@ cs:
     follow: Sledovat
     followers:
       few: Sledovatelé
-      one: Sledovatel
-      other: Sledovatelů
+      one: Sledující
+      other: Sledujících
     following: Sledovaných
     joined: Připojil/a se v %{date}
     last_active: naposledy aktivní
@@ -109,8 +109,8 @@ cs:
       enable: Povolit
       enabled: Povoleno
       feed_url: URL proudu
-      followers: Sledovatelé
-      followers_url: URL sledovatelů
+      followers: Sledující
+      followers_url: URL sledujících
       follows: Sledovaní
       header: Hlavička
       inbox_url: URL přijatých zpráv
@@ -157,7 +157,7 @@ cs:
       roles:
         admin: Administrátor
         moderator: Moderátor
-        staff: Personál
+        staff: Člen personálu
         user: Uživatel
       salmon_url: URL Salmon
       search: Hledat
@@ -305,7 +305,7 @@ cs:
       title: Černá listina e-mailů
     followers:
       back_to_account: Zpět na účet
-      title: Sledovatelé uživatele %{acct}
+      title: Sledující uživatele %{acct}
     instances:
       delivery_available: Doručení je k dispozici
       known_accounts:
@@ -318,9 +318,9 @@ cs:
         title: Moderace
       title: Federace
       total_blocked_by_us: Blokované námi
-      total_followed_by_them: Sledované jím
+      total_followed_by_them: Sledované jimi
       total_followed_by_us: Sledované námi
-      total_reported: Nahlášení o něm
+      total_reported: Nahlášení o nich
       total_storage: Mediální přílohy
     invites:
       deactivate_all: Deaktivovat vše
@@ -392,14 +392,14 @@ cs:
         desc_html: Pozměnit vzhled pomocí šablony CSS načtené na každé stránce
         title: Vlastní CSS
       hero:
-        desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura instance
+        desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 600x100 px. Pokud toto není nastaveno, bude zobrazena miniatura serveru
         title: Hlavní obrázek
       mascot:
         desc_html: Zobrazuje se na hlavní stránce. Doporučuje se rozlišení alespoň 293x205 px. Pokud toto není nastaveno, bude zobrazen výchozí maskot
         title: Obrázek maskota
       peers_api_enabled:
-        desc_html: Domény, na které tato instance narazila ve fediverse
-        title: Zveřejnit seznam objevených instancí
+        desc_html: Domény, na které tento server narazil ve fediverse
+        title: Zveřejnit seznam objevených serverů
       preview_sensitive_media:
         desc_html: Náhledy odkazů na jiných stránkách budou zobrazeny i pokud jsou media označena jako citlivá
         title: Zobrazovat v náhledech OpenGraph i citlivá média
@@ -427,20 +427,20 @@ cs:
         title: Zobrazit odznak personálu
       site_description:
         desc_html: Úvodní odstavec na hlavní straně. Popište, díky čemu je tento server Mastodon zvláštní, a cokoliv jiného, co je důležité. Můžete zde používat HTML značky, hlavně <code>&lt;a&gt;</code> a <code>&lt;em&gt;</code>.
-        title: Popis instance
+        title: Popis serveru
       site_description_extended:
-        desc_html: Dobré místo pro vaše pravidla, pokyny a jiné věci, které vaši instanci odlišují od ostatních. Lze použít HTML značky
+        desc_html: Dobré místo pro vaše pravidla, pokyny a jiné věci, které váš server odlišují od ostatních. Lze použít HTML značky
         title: Vlastní doplňující informace
       site_short_description:
-        desc_html: Zobrazen v postranním panelu a meta značkách. Popište, co je Mastodon a díky čemu je tento server zvláštní v jediném odstavci. Je-li tohle prázdné, zobrazí se popis instance.
-        title: Krátký popis instance
+        desc_html: Zobrazen v postranním panelu a meta značkách. Popište, co je Mastodon a díky čemu je tento server zvláštní v jediném odstavci. Je-li tohle prázdné, zobrazí se popis serveru.
+        title: Krátký popis serveru
       site_terms:
         desc_html: Můžete si napsat vlastní zásady soukromí, podmínky používání či jiné legality. Můžete použít HTML značky
         title: Vlastní podmínky používání
-      site_title: Název instance
+      site_title: Název serveru
       thumbnail:
         desc_html: Používáno pro náhledy přes OpenGraph a API. Doporučuje se rozlišení 1200x630px
-        title: Miniatura instance
+        title: Miniatura serveru
       timeline_preview:
         desc_html: Zobrazit na hlavní straně veřejnou časovou osu
         title: Náhled časové osy
@@ -501,7 +501,7 @@ cs:
     warning: Buďte s těmito daty velmi opatrní. Nikdy je s nikým nesdílejte!
     your_token: Váš přístupový token
   auth:
-    agreement_html: Kliknutím na tlačítko „Registrovat“ souhlasíte s následováním <a href="%{rules_path}">pravidel této instance</a> a <a href="%{terms_path}">našich podmínek používání</a>.
+    agreement_html: Kliknutím na tlačítko „Registrovat“ souhlasíte s následováním <a href="%{rules_path}">pravidel tohoto serveru</a> a <a href="%{terms_path}">našich podmínek používání</a>.
     change_password: Heslo
     confirm_email: Potvrdit e-mail
     delete_account: Odstranit účet
@@ -555,12 +555,12 @@ cs:
     description_html: Tímto <strong>trvale a nenávratně</strong> odstraníte obsah z vašeho účtu a deaktivujete ho. Vaše uživatelské jméno zůstane rezervované pro zabránění budoucím napodobováním.
     proceed: Odstranit účet
     success_msg: Váš účet byl úspěšně odstraněn
-    warning_html: Pouze vymazání obsahu z této konkrétní instance je zaručeno. Obsah, který byl široce sdílen, po sobě pravděpodobně zanechá stopy. U offline serverů a serverů, které vaše aktualizace již neodebírají, nebudou databáze aktualizovány.
+    warning_html: Pouze vymazání obsahu z tohoto konkrétního serveru je zaručeno. Obsah, který byl široce sdílen, po sobě pravděpodobně zanechá stopy. U offline serverů a serverů, které vaše aktualizace již neodebírají, nebudou databáze aktualizovány.
     warning_title: Dostupnost rozšířeného obsahu
   directories:
     directory: Adresář profilů
     enabled: Aktuálně jste v adresáři uveden/a.
-    enabled_but_waiting: Přihlásil/a jste se k uvedení v adresáři, ale ještě nemáte minimální počet sledovatelů (%{min_followers}) pro uvedení.
+    enabled_but_waiting: Přihlásil/a jste se k uvedení v adresáři, ale ještě nemáte minimální počet sledujících (%{min_followers}) pro uvedení.
     explanation: Objevujte uživatele podle jejich zájmů
     explore_mastodon: Prozkoumejte %{title}
     how_to_enable: Aktuálně nejste přihlášen/a do adresáře. Přihlásit se můžete níže. Použijte ve svém popisu profilu hashtagy, abyste mohl/a být uveden/a pod konkrétními hashtagy!
@@ -613,17 +613,17 @@ cs:
       title: Přidat nový filtr
   followers:
     domain: Doména
-    explanation_html: Chcete-li zaručit soukromí vašich příspěvků, musíte mít na vědomí, kdo vás sleduje. <strong>Vaše soukromé příspěvky jsou doručeny na všechny instance, kde máte sledovatele</strong>. Nejspíš si je budete chtít zkontrolovat a odstranit sledovatele na instancích, jejichž personálu či softwaru nedůvěřujete s respektováním vašeho soukromí.
-    followers_count: Počet sledovatelů
+    explanation_html: Chcete-li zaručit soukromí vašich příspěvků, musíte mít na vědomí, kdo vás sleduje. <strong>Vaše soukromé příspěvky jsou doručeny na všechny servery, kde máte sledující</strong>. Nejspíš si je budete chtít zkontrolovat a odstranit sledující na serverech, jejichž provozovatelům či softwaru nedůvěřujete s respektováním vašeho soukromí.
+    followers_count: Počet sledujících
     lock_link: Zamkněte svůj účet
-    purge: Odstranit ze sledovatelů
+    purge: Odstranit ze sledujících
     success:
       few: V průběhu blokování sledovatelů ze %{count} domén...
-      one: V průběhu blokování sledovatelů z jedné domény...
-      other: V průběhu blokování sledovatelů z %{count} domén...
+      one: V průběhu blokování sledujících z jedné domény...
+      other: V průběhu blokování sledujících z %{count} domén...
     true_privacy_html: Berte prosím na vědomí, že <strong>skutečného soukromí se dá dosáhnout pouze za pomoci end-to-end šifrování</strong>.
-    unlocked_warning_html: Kdokoliv vás může sledovat a okamžitě vidět vaše soukromé příspěvky. %{lock_link}, abyste mohl/a zkontrolovat a odmítnout sledovatele.
-    unlocked_warning_title: Váš účet není zamknutý
+    unlocked_warning_html: Kdokoliv vás může sledovat a okamžitě vidět vaše soukromé příspěvky. %{lock_link}, abyste mohl/a kontrolovat a odmítat sledující.
+    unlocked_warning_title: Váš účet není uzamčen
   footer:
     developers: Vývojáři
     more: Více…
@@ -637,7 +637,7 @@ cs:
       one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže
       other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže
   imports:
-    preface: Můžete importovat data, která jste exportoval/a z jiné instance, jako například seznam lidí, které sledujete či blokujete.
+    preface: Můžete importovat data, která jste exportoval/a z jiného serveru, jako například seznam lidí, které sledujete či blokujete.
     success: Vaše data byla úspěšně nahrána a nyní budou zpracována v daný čas
     types:
       blocking: Seznam blokovaných
@@ -663,7 +663,7 @@ cs:
       one: 1 použití
       other: "%{count} použití"
     max_uses_prompt: Bez limitu
-    prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tuto instanci
+    prompt: Vygenerujte a sdílejte s ostatními odkazy a umožněte jim přístup na tento server
     table:
       expires_at: Vyprší
       uses: Použití
@@ -689,8 +689,8 @@ cs:
       mention: "%{name} vás zmínil/a v:"
       new_followers_summary:
         few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Skvělé!
-        one: Navíc jste získal/a jednoho nového sledovatele, zatímco jste byl/a pryč! Hurá!
-        other: Navíc jste získal/a %{count} nových sledovatelů, zatímco jste byl/a pryč! Úžasné!
+        one: Navíc jste získal/a jednoho nového sledujícího, zatímco jste byl/a pryč! Hurá!
+        other: Navíc jste získal/a %{count} nových sledujících, zatímco jste byl/a pryč! Úžasné!
       subject:
         few: "%{count} nová oznámení od vaší poslední návštěvy \U0001F418"
         one: "1 nové oznámení od vaší poslední návštěvy \U0001F418"
@@ -703,11 +703,11 @@ cs:
     follow:
       body: "%{name} vás nyní sleduje!"
       subject: "%{name} vás nyní sleduje"
-      title: Nový sledovatel
+      title: Nový sledující
     follow_request:
       action: Spravovat požadavky o sledování
       body: "%{name} požádal/a o povolení vás sledovat"
-      subject: 'Čekající sledovatel: %{name}'
+      subject: 'Čekající sledující: %{name}'
       title: Nový požadavek o sledování
     mention:
       action: Odpovědět
@@ -812,7 +812,7 @@ cs:
     development: Vývoj
     edit_profile: Upravit profil
     export: Export dat
-    followers: Autorizovaní sledovatelé
+    followers: Autorizovaní sledující
     import: Import
     migrate: Přesunutí účtu
     notifications: Oznámení
@@ -849,8 +849,8 @@ cs:
     sign_in_to_participate: Chcete-li se účastnit této konverzace, přihlaste se
     title: "%{name}: „%{quote}“"
     visibilities:
-      private: Pouze pro sledovatele
-      private_long: Zobrazit pouze sledovatelům
+      private: Pouze pro sledující
+      private_long: Zobrazit pouze sledujícím
       public: Veřejné
       public_long: Všichni mohou vidět
       unlisted: Neuvedené
@@ -866,8 +866,8 @@ cs:
 
       <ul>
         <li><em>Základní informace o účtu</em>: Pokud se na tomto serveru zaregistrujete, můžeme vás požádat o zadání uživatelského jména, e-mailové adresy a hesla. Můžete také zadat dodatečné profilové informace, jako například zobrazované jméno a krátký životopis, a nahrát si profilovou fotografii a hlavičkový obrázek. Uživatelské i zobrazované jméno, životopis, profilová fotografie a hlavičkový obrázek jsou vždy uvedeny veřejně.</li>
-        <li><em>Příspěvky, sledovatelé a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro vaše sledovatele. Když sem nahrajete zprávu, bude uloženo datum a čas, společně s aplikací, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a neuvedené příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, je to také veřejně dostupná informace. Vaše příspěvky jsou doručeny vašim sledovatelům, což v některých případech znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Pokud příspěvky smažete, bude tohle taktéž doručeno vašim sledovatelům. Akce znovusdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li>
-        <li><em>Příspěvky přímé a pouze pro sledovatele</em>: Všechny příspěvky jsou uloženy a zpracovány na serveru. Příspěvky pouze pro sledovatele jsou doručeny vašim sledovatelům a uživatelům v nich zmíněným a přímé příspěvky jsou doručeny pouze uživatelům v nich zmíněným. V některých případech tohle znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Snažíme se omezit přístup k těmto příspěvkům pouze na autorizované uživatele, ovšem jiné servery tak nemusejí učinit. Proto je důležité posoudit servery, ke kterým vaši sledovatelé patří. V nastavení si můžete zapnout volbu pro manuální schvalování či odmítnutí nových sledovatelů. <em>Prosím mějte na paměti, že operátoři tohoto serveru a kteréhokoliv přijímacího serveru mohou tyto zprávy vidět</em> a příjemci mohou vytvořit jejich snímek, zkopírovat je, nebo je jinak sdílet. <em>Nesdílejte přes Mastodon jakékoliv nebezpečné informace.</em></li>
+        <li><em>Příspěvky, sledující a další veřejné informace</em>: Seznam lidí, které sledujete, je uveden veřejně, totéž platí i pro vaše sledující. Když sem nahrajete zprávu, bude uloženo datum a čas, společně s aplikací, ze které jste zprávu odeslali. Zprávy mohou obsahovat mediální přílohy, jako jsou obrázky a videa. Veřejné a neuvedené příspěvky jsou dostupné veřejně. Pokud na vašem profilu uvedete příspěvek, je to také veřejně dostupná informace. Vaše příspěvky jsou doručeny vašim sledujícím, což v některých případech znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Pokud příspěvky smažete, bude tohle taktéž doručeno vašim sledujícím. Akce znovusdílení nebo oblíbení jiného příspěvku je vždy veřejná.</li>
+        <li><em>Příspěvky přímé a pouze pro sledující</em>: Všechny příspěvky jsou uloženy a zpracovány na serveru. Příspěvky pouze pro sledující jsou doručeny vašim sledujícím a uživatelům v nich zmíněným a přímé příspěvky jsou doručeny pouze uživatelům v nich zmíněným. V některých případech tohle znamená, že budou doručeny na různé servery, na kterých budou ukládány kopie. Snažíme se omezit přístup k těmto příspěvkům pouze na autorizované uživatele, ovšem jiné servery tak nemusejí učinit. Proto je důležité posoudit servery, ke kterým vaši sledující patří. V nastavení si můžete zapnout volbu pro manuální schvalování či odmítnutí nových sledujících. <em>Prosím mějte na paměti, že operátoři tohoto serveru a kteréhokoliv přijímacího serveru mohou tyto zprávy vidět</em> a příjemci mohou vytvořit jejich snímek, zkopírovat je, nebo je jinak sdílet. <em>Nesdílejte přes Mastodon jakékoliv nebezpečné informace.</em></li>
         <li><em>IP adresy a další metadata</em>: Když se přihlásíte, zaznamenáváme IP adresu, ze které se přihlašujete, jakožto i název vašeho webového prohlížeče. Všechny vaše webové relace jsou v nastavení přístupné k vašemu posouzení a odvolání. Nejpozdější IP adresa použita je uložena maximálně do 12 měsíců. Můžeme také uchovávat serverové záznamy, které obsahují IP adresy každého požadavku odeslaného na náš server.</li>
       </ul>
 
@@ -908,7 +908,7 @@ cs:
 
       <h3 id="cookies">Používáme cookies?</h3>
 
-      <p>Ano. Cookies jsou malé soubory, které stránka nebo její poskytovatel uloží na pevný disk vašeho počítače (pokud to dovolíte). Tyto cookies umožňují stránce rozpoznat váš prohlížeč a, pokud máte registrovaný účet, přidružit ho s vaším registrovaným účtem.</p>
+      <p>Ano. Cookies jsou malé soubory, které stránka nebo její poskytovatel uloží na pevný disk vašeho počítače (pokud to dovolíte). Tyto cookies umožňují stránce rozpoznat váš prohlížeč, a pokud máte registrovaný účet, přidružit ho s vaším registrovaným účtem.</p>
 
       <p>Používáme cookies pro pochopení a ukládání vašich předvoleb pro budoucí návštěvy.</p>
 
@@ -918,15 +918,15 @@ cs:
 
       <p>Vaše osobně identifikovatelné informace neprodáváme, neobchodujeme s nimi, ani je nijak nepřenášíme vnějším stranám. Do tohoto se nepočítají důvěryhodné třetí strany, které nám pomáhají provozovat naši stránku, podnikat, nebo vás obsluhovat, pokud tyto strany souhlasí se zachováním důvěrnosti těchto informací. Můžeme také uvolnit vaše informace, pokud věříme, že je to nutné pro soulad se zákonem, prosazování našich zásad, nebo ochranu práv, majetku, či bezpečnost nás či ostatních.</p>
 
-      <p>Váš veřejný obsah může být stažen jinými servery na síti. Vaše příspěvky veřejné a pouze pro sledovatele budou doručeny na servery vašich sledovatelů a přímé zprávy budou doručeny na servery příjemců, pokud jsou tito sledovatelé nebo příjemci zaregistrováni na jiném serveru, než je tento.</p>
+      <p>Váš veřejný obsah může být stažen jinými servery na síti. Vaše příspěvky veřejné a pouze pro sledující budou doručeny na servery vašich sledujících a přímé zprávy budou doručeny na servery příjemců, pokud jsou tito sledující nebo příjemci zaregistrováni na jiném serveru, než je tento.</p>
 
-      <p>Když autorizujete aplikaci, aby používala váš účet, může, v závislosti na rozsahu oprávnění, které jí udělíte, přistupovat k vašim veřejným profilovým informacím, seznamu lidí, které sledujete, vašim sledovatelům, vašim seznamům, všem vašim příspěvkům a příspěvkům, které jste si oblíbili. Aplikace nikdy nemohou získat vaši e-mailovou adresu či heslo.</p>
+      <p>Když autorizujete aplikaci, aby používala váš účet, může, v závislosti na rozsahu oprávnění, které jí udělíte, přistupovat k vašim veřejným profilovým informacím, seznamu lidí, které sledujete, vašim sledujícím, vašim seznamům, všem vašim příspěvkům a příspěvkům, které jste si oblíbili. Aplikace nikdy nemohou získat vaši e-mailovou adresu či heslo.</p>
 
       <hr class="spacer" />
 
       <h3 id="children">Používání stránky dětmi</h3>
 
-      <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochraně sobních údajů</a>) tuto stránku nepoužívejte.</p>
+      <p>Pokud se tento server nachází v EU nebo EHP: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 16 let. Pokud je vám méně než 16, dle požadavků nařízení GDPR (<a href="https://cs.wikipedia.org/wiki/Obecn%C3%A9_na%C5%99%C3%ADzen%C3%AD_o_ochran%C4%9B_osobn%C3%ADch_%C3%BAdaj%C5%AF">Obecné nařízení o ochraně osobních údajů</a>) tuto stránku nepoužívejte.</p>
 
       <p>Pokud se tento server nachází v USA: Naše stránka, produkty a služby jsou všechny směřovány na lidi, kterým je alespoň 13 let. Pokud je vám méně než 13, dle požadavků zákona COPPA (<a href="https://cs.wikipedia.org/wiki/Children%27s_online_privacy_protection_act">Children's Online Privacy Protection Act</a>) tuto stránku nepoužívejte.</p>
 
@@ -975,7 +975,7 @@ cs:
       explanation:
         disable: Zatímco je váš účet zmražen, zůstávají data vašeho účtu nedotčená, ale nemůžete vykonávat žádné akce, dokud nebude odemčen.
         silence: Zatímco je váš účet omezen, mohou vaše tooty na tomto serveru vidět pouze lidé, kteří váš již sledují, a můžete být vyloučen/a z různých veřejných výpisů. Ostatní vás však pořád mohou manuálně sledovat.
-        suspend: Váš účet byl pozastaven a všechny vaše tooty a vaše nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měl/a sledovatele.
+        suspend: Váš účet byl pozastaven a všechny vaše tooty a vaše nahrané mediální soubory byly nenávratně odstraněny z tohoto serveru a serverů, na kterých jste měl/a sledující.
       review_server_policies: Posoudit politiku serveru
       subject:
         disable: Váš účet %{acct} byl zmražen
@@ -989,12 +989,12 @@ cs:
         suspend: Účet pozastaven
     welcome:
       edit_profile_action: Nastavit profil
-      edit_profile_step: Můžete si přizpůsobit svůj profil nahráním avataru a obrázku na hlavičce, změnou zobrazovaného jména a dalších. Chcete-li posoudit nové sledovatele předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
+      edit_profile_step: Můžete si přizpůsobit svůj profil nahráním avataru a obrázku na hlavičce, změnou zobrazovaného jména a dalších. Chcete-li posoudit nové sledující předtím, než vás mohou sledovat, můžete svůj účet uzamknout.
       explanation: Zde je pár tipů na začátek
       final_action: Začněte přispívat
-      final_step: 'Začněte přispívat! I když nemáte sledovatele, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a mezi hashtagy. Můžete se ostatním představit pomocí hashtagu #introductions.'
+      final_step: 'Začněte přispívat! I když nemáte sledující, mohou vaše zprávy vidět jiní lidé, například na místní časové ose a mezi hashtagy. Můžete se ostatním představit pomocí hashtagu #introductions.'
       full_handle: Vaše celá adresa profilu
-      full_handle_hint: Tohle je, co byste řekl/a svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiné instance.
+      full_handle_hint: Tohle je, co byste řekl/a svým přátelům, aby vám mohli posílat zprávy nebo vás sledovat z jiného serveru.
       review_preferences_action: Změnit nastavení
       review_preferences_step: Nezapomeňte si nastavit své volby, například jaké e-maily chcete přijímat či jak soukromé mají být vaše příspěvky ve výchozím stavu. Nemáte-li epilepsii, můžete si nastavit automatické přehrávání obrázků GIF.
       subject: Vítejte na Mastodonu
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index 53b474c167..f225cc086d 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -60,6 +60,7 @@ cy:
       zero: Dilynwyr
     following: Yn dilyn
     joined: Ymunodd %{date}
+    last_active: diweddaraf
     link_verified_on: Gwiriwyd perchnogaeth y ddolen yma ar %{date}
     media: Cyfryngau
     moved_html: 'Mae %{name} wedi symud i %{new_profile_link}:'
@@ -87,6 +88,7 @@ cy:
   admin:
     account_actions:
       action: Cyflawni gweithred
+      title: Perfformio cymedroli ar %{acct}
     account_moderation_notes:
       create: Gadael nodyn
       created_msg: Crewyd nodyn cymedroli yn llwyddiannus!
@@ -155,6 +157,7 @@ cy:
       push_subscription_expires: Tanysgrifiad PuSH yn dod i ben
       redownload: Adnewyddu proffil
       remove_avatar: Dileu afatar
+      remove_header: Dileu pennawd
       resend_confirmation:
         already_confirmed: Mae'r defnyddiwr hwn wedi ei gadarnhau yn barod
         send: Ailanfonwch e-bost cadarnhad
@@ -172,8 +175,8 @@ cy:
       search: Chwilio
       shared_inbox_url: URL Mewnflwch wedi ei rannu
       show:
-        created_reports: Adroddiadau a grewyd gan y cyfri hwn
-        targeted_reports: Adroddiadau am y cyfri hwn
+        created_reports: Adroddiadau a wnaed
+        targeted_reports: Adroddwyd gan eraill
       silence: Tawelu
       silenced: Tawelwyd
       statuses: Statysau
@@ -192,6 +195,7 @@ cy:
         assigned_to_self_report: Aseiniodd %{name} adroddiad %{target} i'w hunan
         change_email_user: Newidodd %{name} gyfeiriad e-bost y defnyddiwr %{target}
         confirm_user: Cadarnhaodd %{name} gyfeiriad e-bost y defnyddiwr %{target}
+        create_account_warning: Anfonwyd rhybudd i %{target} gan %{name}
         create_custom_emoji: Uwchlwythodd %{name} emoji newydd %{target}
         create_domain_block: Blociodd %{name} y parth %{target}
         create_email_domain_block: Cosbrestrwyd parth e-bost %{target} gan %{name}
@@ -250,6 +254,7 @@ cy:
       config: Cyfluniad
       feature_deletions: Dileadau cyfrif
       feature_invites: Dolenni gwahodd
+      feature_profile_directory: Cyfeiriadur proffil
       feature_registrations: Cofrestriadau
       feature_relay: Relái ffederasiwn
       features: Nodweddion
@@ -267,7 +272,7 @@ cy:
       week_users_active: gweithredol yr wythnos hon
       week_users_new: defnyddwyr yr wythnos hon
     domain_blocks:
-      add_new: Ychwanegu
+      add_new: Ychwanegu bloc parth newydd
       created_msg: Mae'r bloc parth nawr yn cael ei brosesu
       destroyed_msg: Mae'r bloc parth wedi ei ddadwneud
       domain: Parth
@@ -284,14 +289,25 @@ cy:
       reject_media_hint: Dileu dogfennau cyfryngau wedi eu cadw yn lleol ac yn gwrthod i lawrlwytho unrhyw rai yn y dyfodol. Amherthnasol i ataliadau
       reject_reports: Gwrthod adroddiadau
       reject_reports_hint: Anwybyddu'r holl adroddiadau sy'n dod o'r parth hwn. Amherthnasol i ataliadau
+      rejecting_media: Yn gwrthod ffeiliau cyfryngau
+      rejecting_reports: Yn gwrthod adroddiadau
+      severity:
+        silence: tawelu
+        suspend: ataliedig
       show:
-        affected_accounts: "%{count} o gyfrifoedd yn y bas data wedi eu hefeithio"
+        affected_accounts:
+          few: Effeithiwyd ar %{count} gyfrifon
+          many: Effeithiwyd ar %{count} gyfrifon
+          one: Effeithiwyd ar un cyfrif
+          other: Effeithiwyd ar %{count} gyfrifon
+          two: Effeithiwyd ar %{count} gyfrifon
+          zero: Effeithiwyd ar %{count} gyfrifon
         retroactive:
           silence: Dad-dawelu pob cyfri presennol o'r parth hwn
           suspend: Dad-atal pob cyfrif o'r parth hwn sy'n bodoli
         title: Dadwneud blocio parth ar gyfer %{domain}
         undo: Dadwneud
-      undo: Dadwneud
+      undo: Dadwneud bloc parth
     email_domain_blocks:
       add_new: Ychwanegu
       created_msg: Llwyddwyd i ychwanegu parth e-bost i'r gosbrestr
@@ -302,11 +318,28 @@ cy:
         create: Ychwanegu parth
         title: Cofnod newydd yng nghosbrestr e-byst
       title: Cosbrestr e-bost
+    followers:
+      back_to_account: Nôl i'r gyfrif
+      title: Dilynwyr %{acct}
     instances:
+      delivery_available: Mae'r cyflenwad ar gael
+      known_accounts:
+        few: "%{count} cyfrifon hysbys"
+        many: "%{count} cyfrifon hysbys"
+        one: "%{count} cyfrif hysbys"
+        other: "%{count} cyfrifon hysbys"
+        two: "%{count} cyfrifon hysbys"
+        zero: "%{count} cyfrifon hysbys"
       moderation:
         all: Pob
         limited: Gyfyngedig
+        title: Cymedroli
       title: Ffederasiwn
+      total_blocked_by_us: Wedi'i bloc gan ni
+      total_followed_by_them: Yn dilyn ganynt
+      total_followed_by_us: Yn dilyn ganom ni
+      total_reported: Adroddiadau amdanynt
+      total_storage: Atodiadau cyfryngau
     invites:
       deactivate_all: Diffodd pob un
       filter:
@@ -388,6 +421,9 @@ cy:
       preview_sensitive_media:
         desc_html: Bydd rhagolygon ar wefannau eraill yn dangos ciplun hyd yn oed os oes na gyfryngau wedi eu marcio'n sensitif
         title: Dangos cyfryngau sensitif mewn rhagolygon OpenGraph
+      profile_directory:
+        desc_html: Caniatáu i ddefnyddwyr gael eu gweld
+        title: Galluogi cyfeiriadur proffil
       registrations:
         closed_message:
           desc_html: I'w arddangos ar y dudalen flaen wedi i gofrestru cau. Mae modd defnyddio tagiau HTML
@@ -450,9 +486,14 @@ cy:
     tags:
       accounts: Cyfrifon
       hidden: Cudd
+      hide: Cuddio o gyfeiriadur
       name: Hashnod
+      title: Hashnodau
+      unhide: Dangoswch yn y cyfeiriadur
+      visible: Gweladwy
     title: Gweinyddiaeth
     warning_presets:
+      add_new: Ychwanegu newydd
       delete: Dileu
       edit: Golygu
   admin_mailer:
@@ -532,6 +573,20 @@ cy:
     success_msg: Llwyddwyd i ddileu eich cyfrif
     warning_html: Dim ond dileu cynnwys o'r achos hwn ellid bod yn sicr ei fod wedi ei ddileu. Mae cynnwys sydd wedi ei rannu'n eang yn debygol o adael olion. Ni fydd gweinyddwyr all-lein a gweinyddwyr sydd wedi dad-danysgrifio o'ch diwedderiadau ddim yn diweddaru eu cronfeydd data.
     warning_title: Argaeledd cynnwys wedi'i rannu
+  directories:
+    directory: Cyfeiriadur proffil
+    enabled: Rydych chi wedi'ch rhestru yn y cyfeiriadur ar hyn o bryd.
+    enabled_but_waiting: Rydych wedi dewis i chi gael eich rhestru yn y cyfeiriadur, ond nid oes gennych y nifer lleiaf o ddilynwyr (%{min_followers}) i'w rhestru eto.
+    explanation: Darganfod defnyddwyr yn seiliedig ar eu diddordebau
+    explore_mastodon: Archwilio %{title}
+    how_to_enable: Ar hyn o bryd nid ydych chi wedi dewis y cyfeiriadur. Gallwch ddewis i mewn isod. Defnyddiwch hashnodau yn eich bio-destun i'w restru dan hashnodau penodol!
+    people:
+      few: "%{count} personau"
+      many: "%{count} personau"
+      one: "%{count} person"
+      other: "%{count} personau"
+      two: "%{count} personau"
+      zero: "%{count} personau"
   errors:
     '403': Nid oes gennych ganiatad i weld y dudalen hon.
     '404': Nid yw'r dudalen yr oeddech yn chwilio amdani'n bodoli.
@@ -554,7 +609,9 @@ cy:
       size: Maint
     blocks: Yr ydych yn blocio
     csv: CSV
+    domain_blocks: Blociau parth
     follows: Yr ydych yn dilyn
+    lists: Rhestrau
     mutes: Yr ydych yn tawelu
     storage: Storio cyfryngau
   filters:
@@ -579,7 +636,13 @@ cy:
     followers_count: Nifer y dilynwyr
     lock_link: Cloi eich cyfrif
     purge: Dileu o dilynwyr
-    success: Yn y broses o ysgafn-flocio dilynwyr o %{count} parth...
+    success:
+      few: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth...
+      many: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth...
+      one: Yn y broses o ysgafn-flocio dilynwyr o un parth...
+      other: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth...
+      two: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth...
+      zero: Yn y broses o ysgafn-flocio defnyddwyr o %{count} parth...
     true_privacy_html: Cofiwch <strong>mai ond amgryptio pen-i-ben all sicrhau gwir breifatrwydd</strong>.
     unlocked_warning_html: Gall unrhywun eich dilyn yn syth i weld eich tŵtiau preifat. %{lock_link} i gael adolygu a gwrthod dilynwyr.
     unlocked_warning_title: Nid yw eich cyfrif wedi ei gloi
@@ -591,7 +654,13 @@ cy:
     changes_saved_msg: Llwyddwyd i gadw y newidiadau!
     copy: Copïo
     save_changes: Cadw newidiadau
-    validation_errors: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
+    validation_errors:
+      few: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
+      many: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
+      one: Mae rhywbeth o'i le o hyd! Edrychwch ar y gwall isod os gwelwch yn dda
+      other: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
+      two: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
+      zero: Mae rhywbeth o'i le o hyd! Edrychwch ar y %{count} gwall isod os gwelwch yn dda
   imports:
     preface: Mae modd mewnforio data yr ydych wedi allforio o achos arall, megis rhestr o bobl yr ydych yn ei ddilyn neu yn blocio.
     success: Uwchlwythwyd eich data yn llwyddiannus ac fe fydd yn cael ei brosesu mewn da bryd
@@ -614,7 +683,13 @@ cy:
     expires_in_prompt: Byth
     generate: Cynhyrchu
     invited_by: 'Cawsoch eich gwahodd gan:'
-    max_uses: "%{count} defnydd"
+    max_uses:
+      few: "%{count} defnydd"
+      many: "%{count} defnydd"
+      one: 1 iws
+      other: "%{count} defnydd"
+      two: "%{count} defnydd"
+      zero: "%{count} defnydd"
     max_uses_prompt: Dim terfyn
     prompt: Cynhyrchwch a rhannwch ddolenni gyda eraill i ganiatau mynediad i'r achos hwn
     table:
@@ -640,8 +715,20 @@ cy:
       action: Gweld holl hysbysiadau
       body: Dyma grynodeb byr o'r holl negeseuon golloch chi ers eich ymweliad diwethaf ar %{since}
       mention: 'Soniodd %{name} amdanoch chi:'
-      new_followers_summary: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
-      subject: "%{count} hysbysiad newydd ers eich ymweliad diwethaf \U0001F418"
+      new_followers_summary:
+        few: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+        many: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+        one: Yr ydych wedi ennill dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+        other: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+        two: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+        zero: Hefyd, rydych wedi ennill %{count} dilynwr newydd tra eich bod i ffwrdd! Hwrê!
+      subject:
+        few: "%{count} hysbysiad newydd ers eich ymweliad diwethaf"
+        many: "%{count} hysbysiad newydd ers eich ymweliad diwethaf"
+        one: 1 hysbysiad newydd ers eich ymweliad diwethaf
+        other: "%{count} hysbysiad newydd ers eich ymweliad diwethaf"
+        two: "%{count} hysbysiad newydd ers eich ymweliad diwethaf"
+        zero: "%{count} hysbysiad newydd ers eich ymweliad diwethaf"
       title: Yn eich absenoldeb...
     favourite:
       body: 'Cafodd eich statws ei hoffi gan %{name}:'
@@ -755,7 +842,13 @@ cy:
   statuses:
     attached:
       description: 'Ynghlwm: %{attached}'
-      image: "%{count} o luniau"
+      image:
+        few: "%{count} o luniau"
+        many: "%{count} o luniau"
+        one: "%{count} llun"
+        other: "%{count} o luniau"
+        two: "%{count} o luniau"
+        zero: "%{count} o luniau"
       video:
         few: "%{count} fideo"
         many: "%{count} fideo"
@@ -765,7 +858,13 @@ cy:
         zero: "%{count} fideo"
     boosted_from_html: Wedi ei fŵstio %{acct_link}
     content_warning: 'Rhybudd cynnwys: %{warning}'
-    disallowed_hashtags: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
+    disallowed_hashtags:
+      few: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
+      many: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
+      one: 'yn cynnwys hashnod gwaharddedig: %{tags}'
+      other: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
+      two: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
+      zero: 'yn cynnwys yr hashnod gwaharddedig: %{tags}'
     language_detection: Canfod iaith yn awtomataidd
     open_in_web: Agor yn y wê
     over_character_limit: wedi mynd heibio'r uchafswm nodyn o %{max}
@@ -901,6 +1000,14 @@ cy:
       subject: Mae eich archif yn barod i'w lawrlwytho
       title: Allfudo archif
     warning:
+      explanation:
+        disable: Er bod eich cyfrif wedi'i rewi, mae eich data cyfrif yn parhau i fod yn gyfan, ond ni allwch chi berfformio unrhyw gamau nes ei ddatgloi.
+      review_server_policies: Adolygu polisïau'r gweinydd
+      subject:
+        disable: Mae'ch cyfrif %{acct} wedi'i rewi
+        none: Rhybudd am %{acct}
+        silence: Mae'ch cyfrif %{acct} wedi bod yn gyfyngedig
+        suspend: Mae'ch cyfrif %{acct} wedi'i atal
       title:
         disable: Cyfrif wedi'i rewi
         none: Rhybudd
@@ -912,7 +1019,7 @@ cy:
       explanation: Dyma ambell nodyn i'ch helpu i ddechrau
       final_action: Dechrau postio
       final_step: 'Dechrau postio! Hyd yn oed heb ddilynwyr mae''n bosib i eraill weld eich negeseuon cyhoeddus, er enghraifft at y ffrwd leol ac mewn hashnodau. Mae''n bosib yr hoffech hi gyflwyno''ch hun ar yr hashnod #introductions.'
-      full_handle: Eich enw Mastodon llawn
+      full_handle: Eich enw llawn
       full_handle_hint: Dyma'r hyn y bysech yn dweud wrth eich ffrindiau er mwyn iddyn nhw gael anfon neges atoch o achos arall.
       review_preferences_action: Newid dewisiadau
       review_preferences_step: Gwnewch yn siŵr i chi osod eich dewisiadau, megis pa e-byst hoffech eu derbyn, neu ba lefel preifatrwydd hoffech eich tŵtiau ragosod i. Os nad oes gennych salwch symud, gallwch ddewis i ganiatau chwarae GIFs yn awtomatig.
diff --git a/config/locales/devise.cs.yml b/config/locales/devise.cs.yml
index 850ff1fe82..83534cccd9 100644
--- a/config/locales/devise.cs.yml
+++ b/config/locales/devise.cs.yml
@@ -20,17 +20,17 @@ cs:
         action: Potvrdit e-mailovou adresu
         action_with_app: Potvrdit a navrátit se do %{app}
         explanation: S touto e-mailovou adresou jste si vytvořil/a účet na %{host}. K jeho aktivaci vám zbývá jedno kliknutí. Pokud jste to nebyl/a vy, ignorujte této e-mail.
-        extra_html: Prosím podívejte se také na <a href="%{terms_path}">pravidla této instance</a> a <a href="%{policy_path}">naše podmínky používání</a>.
+        extra_html: Prosím podívejte se také na <a href="%{terms_path}">pravidla tohoto serveru</a> a <a href="%{policy_path}">naše podmínky používání</a>.
         subject: 'Mastodon: Potvrzovací instrukce pro %{instance}'
         title: Potvrďte e-mailovou adresu
       email_changed:
         explanation: 'E-mailová adresa vašeho účtu byla změněna na:'
-        extra: Pokud jste si e-mail nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora instance.
+        extra: Pokud jste si e-mail nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
         subject: 'Mastodon: E-mail byl změněn'
         title: Nová e-mailová adresa
       password_change:
         explanation: Heslo k vašemu účtu bylo změněno.
-        extra: Pokud jste si heslo nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora instance.
+        extra: Pokud jste si heslo nezměnil/a, je pravděpodobné, že někdo jiný získal přístup k vašemu účtu. Prosím změňte si okamžitě heslo, nebo, pokud se nemůžete na účet přihlásit, kontaktujte administrátora serveru.
         subject: 'Mastodon: Heslo bylo změněno'
         title: Heslo bylo změněno
       reconfirmation_instructions:
@@ -60,8 +60,8 @@ cs:
       signed_up: Vítejte! Registroval/a jste se úspěšně.
       signed_up_but_inactive: Registroval/a jste se úspěšně. Nemohli jsme vás však přihlásit, protože váš účet ještě není aktivován.
       signed_up_but_locked: Registroval/a jste se úspěšně. Nemohli jsme vás však přihlásit, protože váš účet je uzamčen.
-      signed_up_but_unconfirmed: Na vaši e-mailovou adresu byla poslána zpráva s potvrzovacím odkazem. Pro aktivaci účtu přejděte na danou adresu. Prosím zkontrolujte si složku spam, jestli jste tento e-mail neobdržel/a.
-      update_needs_confirmation: Váš účet byl úspěšně aktualizován, ale je potřeba ověřit vaši novou e-mailovou adresu. Prosím zkontrolujte si e-mail a klikněte na odkaz pro potvrzení vaši nové e-mailové adresy. Prosím zkontrolujte si složku spam, jestli jste tento e-mail neobdržel/a.
+      signed_up_but_unconfirmed: Na vaši e-mailovou adresu byla poslána zpráva s potvrzovacím odkazem. Pro aktivaci účtu přejděte na danou adresu. Pokud jste tento e-mail neobdržel/a, prosím zkontrolujte si složku spam.
+      update_needs_confirmation: Váš účet byl úspěšně aktualizován, ale je potřeba ověřit vaši novou e-mailovou adresu. Prosím zkontrolujte si e-mail a klikněte na odkaz pro potvrzení vaši nové e-mailové adresy. Pokud jste tento e-mail neobdržel/a, prosím zkontrolujte si složku spam.
       updated: Váš účet byl úspěšně aktualizován.
     sessions:
       already_signed_out: Odhlášení proběhlo úspěšně.
diff --git a/config/locales/devise.cy.yml b/config/locales/devise.cy.yml
index 7d96e57f9b..8ea7e1b4fa 100644
--- a/config/locales/devise.cy.yml
+++ b/config/locales/devise.cy.yml
@@ -18,6 +18,7 @@ cy:
     mailer:
       confirmation_instructions:
         action: Gwiriwch eich cyfeiriad e-bost
+        action_with_app: Cadarnhau a dychwelyd i %{app}
         explanation: Yr ydych wedi creu cyfrif ar %{host} gyda'r cyfrif e-bost hwn. Dim ond un clic sydd angen i'w wneud yn weithredol. Os nad chi oedd hyn, anwybyddwch yr e-bost hwn os gwelwch yn dda.
         extra_html: Gwnewch yn siŵr i edrych ar <a href="%{terms_path}">reolau'r achos</a> a <a href="%{policy_path}">ein telerau gwasanaeth</a>.
         subject: 'Mastodon: Canllawiau cadarnhau i %{instance}'
@@ -77,4 +78,10 @@ cy:
       expired: wedi dod i ben, gwnewch gais am un newydd os gwelwch yn dda
       not_found: heb ei ganfod
       not_locked: heb ei gloi
-      not_saved: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
+      not_saved:
+        few: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
+        many: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
+        one: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd 1 gwall:'
+        other: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
+        two: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
+        zero: 'Gwaharddwyd yr %{resource} rhag cael ei arbed oherwydd %{count} gwall:'
diff --git a/config/locales/devise.sk.yml b/config/locales/devise.sk.yml
index 16cd9262e2..e054efb305 100644
--- a/config/locales/devise.sk.yml
+++ b/config/locales/devise.sk.yml
@@ -2,9 +2,9 @@
 sk:
   devise:
     confirmations:
-      confirmed: Váš účet bol úspešne overený.
-      send_instructions: O niekoľko minút obdržíte email s inštrukciami ako potvrdiť váš účet.
-      send_paranoid_instructions: Ak sa váš email nachádza v našej databáze, obdržíte email s inštrukciami ako potvrdiť váš účet.
+      confirmed: Tvoja emailová adresa bola úspešne overená.
+      send_instructions: O niekoľko minút obdržíš email s inštrukciami ako potvrdiť svoj účet. Prosím, skontroluj si aj zložku spam, ak sa k tebe toto potvrdenie nedostalo.
+      send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v našej databázi, o niekoľko minút obdržíš email s pokynmi ako potvrdiť svoj účet. Prosím, skontroluj aj zložku spam, ak sa k tebe toto potvrdenie nedostalo.
     failure:
       already_authenticated: Už si prihlásený/á.
       inactive: Tvoj účet ešte nebol potvrdený.
@@ -51,15 +51,15 @@ sk:
       success: Úspešné overenie z účtu %{kind}.
     passwords:
       no_token: Túto stránku nemôžete navštíviť pokiaľ neprichádzate z emailu s inštrukciami na obnovu hesla. Pokiaľ prichádzate z tohto emailu, prosím uistite sa že ste použili celú URL z emailu.
-      send_instructions: Ak zadaný email existuje v našej databázi, tak o niekoľko minút obdržíte email s inštrukciami ako nastaviť nové heslo.
-      send_paranoid_instructions: Ak zadaný email existuje v našej databázi, zachvíľu obdržíte odkaz na obnovu hesla na svoj email. Skontrolujte aj spam ak tento email nevidíte.
+      send_instructions: Pokiaľ sa tvoja emailová adresa nachádza v databázi, tak o niekoľko minút obdržíš email s inštrukciami ako nastaviť nové heslo. Ak máš pocit, že si email neobdržal/a, prosím skontroluj aj svoju spam zložku.
+      send_paranoid_instructions: Ak sa tvoja emailová adresa nachádza v databázi, za chvíľu obdržíš odkaz pre obnovu hesla na svoj email. Skontroluj ale prosím aj svoj spam, ak tento email nevidíš.
       updated: Tvoje heslo bolo úspešne zmenené. Teraz si prihlásený/á.
       updated_not_active: Tvoje heslo bolo úspešne zmenené.
     registrations:
       destroyed: Dovidenia! Tvoj účet bol úspešne zrušený. Dúfame ale, že ťa tu opäť niekedy uvidíme.
       signed_up: Vitaj! Tvoja registrácia bola úspešná.
-      signed_up_but_inactive: Registrácia bola úspešná. Avšak, účet ešte nebol aktivovaný, takže ťa nemôžeme prihlásiť.
-      signed_up_but_locked: Prihlasovanie úspešné. Avšak tvoj účet je zamknutý, takže ťa nieje možné prihlásiť.
+      signed_up_but_inactive: Registrácia bola úspešná. Avšak, účet ešte nebol aktivovaný, takže ťa nemožno prihlásiť.
+      signed_up_but_locked: Registroval/a si sa úspešné. Avšak, tvoj účet je zamknutý, takže ťa nemožno prihlásiť.
       signed_up_but_unconfirmed: Správa s odkazom na potvrdenie registrácie bola odoslaná na tvoj email. Pre aktváciu účtu, klikni prosím na daný odkaz. Takisto ale skontroluj aj svoju spam zložku, pokiaľ sa ti zdá, že si tento email nedostal/a.
       update_needs_confirmation: Účet bol úspešne zmenený ale ešte potrebujeme overiť tvoju novú emailovú adresu. Pre overenie prosím klikni na link v správe ktorú si dostal/a na email. Takisto ale skontroluj aj svoju spam zložku, ak sa ti zdá, že si tento email nedostal/a.
       updated: Tvoj účet bol úspešne aktualizovaný.
diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml
new file mode 100644
index 0000000000..906bece813
--- /dev/null
+++ b/config/locales/devise.sq.yml
@@ -0,0 +1,83 @@
+---
+sq:
+  devise:
+    confirmations:
+      confirmed: Adresa juaj email u ripohua me sukses.
+      send_instructions: Brenda pak minutash, do të merrni një email me udhëzime se si të ripohoni adresën tuaj email. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      send_paranoid_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, do të merrni një email me udhëzime se si të ripohoni adresën tuaj email. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+    failure:
+      already_authenticated: Jeni tashmë i futur.
+      inactive: Llogaria juaj s’është aktivizuar ende.
+      invalid: "%{authentication_keys} ose fjalëkalim i pavlefshëm."
+      last_attempt: Mund të provoni edhe një herë, përpara se llogaria juaj të kyçet.
+      locked: Llogaria juaj është e kyçur.
+      not_found_in_database: "%{authentication_keys} ose fjalëkalim i pavlefshëm."
+      timeout: Sesioni juaj ka skaduar. Ju lutemi, që të vazhdohet, ribëni hyrjen.
+      unauthenticated: Përpara se të vazhdohet më tej, lypset të bëni hyrjen ose të regjistroheni.
+      unconfirmed: Përpara se të vazhdohet, lypset të ripohoni adresën tuaj email.
+    mailer:
+      confirmation_instructions:
+        action: Verifikoni adresë email
+        action_with_app: Ripohojeni dhe kthehuni te %{app}
+        explanation: Keni krijuar një llogari te %{host}, me këtë adresë email. Jeni një klikim larg aktivizimit të saj. Nëse s’jeni ju, shpërfilleni këtë email.
+        extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e instancës</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>.
+        subject: 'Mastodon: Udhëzime ripohimi për %{instance}'
+        title: Verifikoni adresë email
+      email_changed:
+        explanation: 'Adresa email për llogarinë tuaj po ndryshohet në:'
+        extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj.
+        subject: 'Mastodon: Email-i u ndryshua'
+        title: Adresë email e re
+      password_change:
+        explanation: Fjalëkalimi për llogarinë tuaj u ndryshua.
+        extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj.
+        subject: 'Mastodon: Fjalëkalimi u ndryshua'
+        title: Fjalëkalimi u ndryshua
+      reconfirmation_instructions:
+        explanation: Që të ndryshohet email-i juaj, ripohoni adresën e re.
+        extra: Nëse ky ndryshim s’qe filluar prej jush, ju lutemi, shpërfilleni këtë email. Adresa email për llogarinë Mastodon s’do të ndryshojë, para se të hyni në lidhjen më sipër.
+        subject: 'Mastodon: Ripohoni email-in për %{instance}'
+        title: Verifikoni adresë email
+      reset_password_instructions:
+        action: Ndryshoni fjalëkalimin
+        explanation: Kërkuat një fjalëkalim të ri për këtë llogari.
+        extra: Nëse këtë s’e kërkuat ju, ju lutemi, shpërfilleni këtë email. Fjalëkalimi juaj s’do të ndryshohet pa hyrë në lidhjen më sipër dhe krijimin e një të riu.
+        subject: 'Mastodon: Udhëzime ricaktimi fjalëkalimi'
+        title: Ricaktim fjalëkalimi
+      unlock_instructions:
+        subject: 'Mastodon: Udhëzime shkyçjeje'
+    omniauth_callbacks:
+      failure: S’u bë dot mirëfilltësimi juaj nga %{kind}, sepse "%{reason}".
+      success: Mirëfilltësimi nga llogaria %{kind} u bë me sukses.
+    passwords:
+      no_token: S’mund të hyni në këtë faqe paardhur nga një email ricaktimi fjalëkalimi. Nëse vini nga një email ricaktimi fjalëkalimi, ju lutemi, sigurohuni se përdorët URL-në e plotë dhënë për ju.
+      send_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, te adresa juaj email do të merrni një lidhje rimarrjeje fjalëkalimi. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      send_paranoid_instructions: Nëse adresa juaj email gjendet në bazën tonë të të dhënave, brenda pak minutash, te adresa juaj email do të merrni një lidhje rimarrjeje fjalëkalimi. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      updated: Fjalëkalimi juaj u ndryshua me sukses. Tani jeni i futur.
+      updated_not_active: Fjalëkalimi juaj u ndryshua me sukses.
+    registrations:
+      destroyed: Shëndet! Llogaria juaj u fshi me sukses. Shpresojmë t’ju rishohim së shpejti.
+      signed_up: Mirë se vini! U regjistruat me sukses.
+      signed_up_but_inactive: U regjistruat me sukses. Megjithatë, s’u bë dot hyrja juaj, ngaqë llogaria juaj s’është aktivizuar ende.
+      signed_up_but_locked: U regjistruat me sukses. Megjithatë, s’u bë dot hyrja juaj, ngaqë llogaria juaj është kyçur.
+      signed_up_but_unconfirmed: Te adresa juaj email u dërgua një mesazh me një lidhje ripohimi. Ju lutemi, që të aktivizoni llogarinë tuaj, ndiqni lidhjen. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      update_needs_confirmation: E përditësuat me sukses llogarinë tuaj, por na duhet të verifikojmë adresën tuaj të re email. Ju lutemi, që të ripohoni adresën tuaj të re email, kontrolloni email-in tuaj dhe ndiqni lidhjen. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      updated: Llogaria juaj u përditësua me sukses.
+    sessions:
+      already_signed_out: Dolët me sukses.
+      signed_in: Hytë me sukses.
+      signed_out: Dolët me sukses.
+    unlocks:
+      send_instructions: Brenda pak minutash, do të merrni një email me udhëzime se si të shkyçni llogarinë tuaj. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      send_paranoid_instructions: Nëse llogaria juaj ekziston, brenda pak minutash, do të merrni një email me udhëzime se si të shkyçni llogarinë tuaj. Ju lutemi, kontrolloni dosjen e mesazheve të padëshiruar, nëse nuk e morët këtë email.
+      unlocked: Llogaria juaj u shkyç me sukses. Ju lutemi, që të vazhdohet, bëni hyrjen.
+  errors:
+    messages:
+      already_confirmed: qe e ripohuar tashmë, ju lutemi, provoni të bëni hyrjen
+      confirmation_period_expired: lyp të ripohohet brenda %{period}, ju lutemi, kërkoni një të ri
+      expired: ka skaduar, ju lutemi, kërkoni një të ri
+      not_found: s’u gjet
+      not_locked: s’qe kyçur
+      not_saved:
+        one: 'Ruajtjen e këtij %{resource} e pengoi 1 gabim:'
+        other: 'Ruajtjen e këtij %{resource} e penguan %{count} gabime:'
diff --git a/config/locales/doorkeeper.cs.yml b/config/locales/doorkeeper.cs.yml
index b9e9bc0349..03b66a0faf 100644
--- a/config/locales/doorkeeper.cs.yml
+++ b/config/locales/doorkeeper.cs.yml
@@ -54,7 +54,7 @@ cs:
         title: 'Aplikace: %{name}'
     authorizations:
       buttons:
-        authorize: Ověřit
+        authorize: Autorizovat
         deny: Zamítnout
       error:
         title: Vyskytla se chyba
diff --git a/config/locales/doorkeeper.sq.yml b/config/locales/doorkeeper.sq.yml
new file mode 100644
index 0000000000..a1f2121f9f
--- /dev/null
+++ b/config/locales/doorkeeper.sq.yml
@@ -0,0 +1,142 @@
+---
+sq:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Emër aplikacioni
+        redirect_uri: URI Ridrejtimi
+        scopes: Fushëveprime
+        website: Sajt aplikacioni
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: s’mund të përmbajë një fragment.
+              invalid_uri: duhet të jetë një URI e vlefshme.
+              relative_uri: duhet të jetë një URI absolute.
+              secured_uri: duhet të jetë një URI HTTPS/SSL.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Autorizoje
+        cancel: Anuloje
+        destroy: Asgjësoje
+        edit: Përpunoni
+        submit: Parashtroje
+      confirmations:
+        destroy: A jeni i sigurt?
+      edit:
+        title: Përpunoni aplikacion
+      form:
+        error: Oh! Kontrolloni formularin tuaj për gabime të mundshme
+      help:
+        native_redirect_uri: Përdor %{native_redirect_uri} për teste vendore
+        redirect_uri: Përdorni një URI për rresht
+        scopes: Ndajini fushëveprimet me hapësira. Që të përdoren fushëveprimet parazgjedhje, lëreni të zbrazët.
+      index:
+        application: Aplikacion
+        callback_url: URL Callback-u
+        delete: Fshije
+        name: Emër
+        new: Aplikacion i ri
+        scopes: Fushëveprime
+        show: Shfaqe
+        title: Aplikacionet tuaja
+      new:
+        title: Aplikacion i ri
+      show:
+        actions: Veprime
+        application_id: Kyç klienti
+        callback_urls: URL-ra Callback
+        scopes: Fushëveprime
+        secret: E fshehtë klienti
+        title: 'Aplikacion: %{name}'
+    authorizations:
+      buttons:
+        authorize: Autorizoje
+        deny: Mohoje
+      error:
+        title: Ndodhi një gabim
+      new:
+        able_to: Do të jetë në gjendje të
+        prompt: "%{client_name} kërkesa hyrjeje aplikacionesh te llogaria juaj"
+        title: Lypset autorizim
+      show:
+        title: Kopjojeni këtë kod autorizimi dhe ngjiteni te aplikacioni.
+    authorized_applications:
+      buttons:
+        revoke: Shfuqizoje
+      confirmations:
+        revoke: A jeni i sigurt?
+      index:
+        application: Aplikacion
+        created_at: I autorizuar
+        date_format: "%d.%m.%Y, %H:%M:%S"
+        scopes: Fushëveprime
+        title: Aplikacionet tuaja të autorizuara
+    errors:
+      messages:
+        access_denied: I zoti i burimit ose shërbyesi i autorizimit e hodhi poshtë kërkesën.
+        credential_flow_not_configured: Rrjedha e Kredencialeve të Fjalëkalimit të të Zotit të Burimit dështoi për shkak se Doorkeeper.configure.resource_owner_from_credentials është i paformësuar.
+        invalid_client: Mirëfilltësimi i klientit dështoi për shkak klienti të panjohur, mospërfshirjeje mirëfilltësimi klienti, ose metode të pambuluar mirëfilltësimi.
+        invalid_grant: Autorizimi i dhënë është i pavlefshëm, ka skaduar, është shfuqizuar, nuk përputhet me URI-n e ridrejtimit të përdorur te kërkesa e autorizimit, ose është emetuar për klient tjetër.
+        invalid_redirect_uri: URI e ridrejtimit s’është e vlefshme.
+        invalid_request: Kërkesës i mungon një parametër i domosdoshëm, përfshin një vlerë të pambuluar parametri, ose përndryshe është e keqformuar.
+        invalid_resource_owner: Kredencialet e dhëna për të zotin e burimit s’janë të vlefshme, ose s’gjendet i zoti i burimit
+        invalid_scope: Fushëveprimi i kërkuar është i pavlefshëm, i panjohur ose i keqformuar.
+        invalid_token:
+          expired: Token-i i hyrjeve skadoi
+          revoked: Token-i i hyrjeve u shfuqizua
+          unknown: Token-i i hyrjeve është i pavlefshëm
+        resource_owner_authenticator_not_configured: Gjetja e të Zotit të Burimit dështoi, ngaqë Doorkeeper.configure.resource_owner_authenticator s’është i formësuar.
+        server_error: Shërbyesi i autorizimit hasi një kusht të papritur, i cili e pengoi të plotësonte kërkesën.
+        temporarily_unavailable: Shërbyesi i mirëfilltësimeve hëpërhë s’është në gjendje të trajtojë kërkesën, për shkak të një mbingarkese të përkohshme ose ndonjë mirëmbajtjeje të shërbyesit.
+        unauthorized_client: Klienti s’është i autorizuar të kryejë këtë kërkesë duke përdorur këtë metodë.
+        unsupported_grant_type: Lloji i autorizimit të dhënë nuk mbulohet nga shërbyesi i autorizimeve.
+        unsupported_response_type: Shërbyesi i autorizimeve nuk e mbulon këtë lloj përgjigjeje.
+    flash:
+      applications:
+        create:
+          notice: Aplikacioni u krijua.
+        destroy:
+          notice: Aplikacioni u fshi.
+        update:
+          notice: Aplikacioni u përditësua.
+      authorized_applications:
+        destroy:
+          notice: Aplikacioni u shfuqizua.
+    layouts:
+      admin:
+        nav:
+          applications: Aplikacione
+          oauth2_provider: Furnizues OAuth2
+      application:
+        title: Lypset autorizim OAuth
+    scopes:
+      follow: të ndryshojë marrëdhënies llogarish
+      push: të marrë njoftime push për ju
+      read: të lexojë krejt të dhënat e llogarisë tuaj
+      read:accounts: të shohë të dhëna llogarish
+      read:blocks: të shohë blloqet tuaja
+      read:favourites: të shohë të parapëlqyerit tuaj
+      read:filters: të shohë filtrat tuaj
+      read:follows: të shohë ndjekësit tuaj
+      read:lists: të shohë listat tuaja
+      read:mutes: të shohë ç’keni heshtuar
+      read:notifications: të shohë njoftimet tuaja
+      read:reports: të shohë raportet tuaja
+      read:search: të bëjë kërkime në emrin tuaj
+      read:statuses: të shohë krejt gjendjet
+      write: të ndryshojë krejt të dhënat e llogarisë tuaj
+      write:accounts: të ndryshojë profilin tuaj
+      write:blocks: të bllokojë llogari dhe përkatësi
+      write:favourites: të parapëlqejë gjendje
+      write:filters: të krijojë filtra
+      write:follows: të ndjekë persona
+      write:lists: të krijojë lista
+      write:media: të ngarkojë kartela media
+      write:mutes: të heshtojë persona dhe biseda
+      write:notifications: të pastrojë njoftimet tuaja
+      write:reports: të raportojë persona të tjerë
+      write:statuses: të botojë gjendje
diff --git a/config/locales/el.yml b/config/locales/el.yml
index c29b8301e3..95a72571d3 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -115,7 +115,7 @@ el:
       joined: Γράφτηκε
       location:
         all: Όλες
-        local: Τοπικά
+        local: Τοπική
         remote: Απομακρυσμένα
         title: Τοποθεσία
       login_status: Κατάσταση σύνδεσης
@@ -556,7 +556,7 @@ el:
     enabled: Περιλαμβάνεσαι στον κατάλογο.
     enabled_but_waiting: Έχεις επιλέξει να εμφανίζεσαι στον κατάλογο μεν, αλλά ακόμα δεν έχεις τον ελάχιστο αριθμό ακόλουθων (%{min_followers}) που απαιτείται για να συμπεριληφθείς.
     explanation: Βρες χρήστες βάσει των ενδιαφερόντων τους
-    explore_mastodon: Εξερεύνησε %{title}
+    explore_mastodon: Εξερεύνησε το %{title}
     how_to_enable: Δεν έχεις επιλέξει να συμπεριληφθείς στον καταλογο. Μπορείς να επιλέξεις παρακάτω. Χρησιμοποίησε ταμπέλες στο κείμενο του βιογραφικού σου για να εμφανίζεσαι κάτω από συγκεκριμένες ταμπέλες!
     people:
       one: "%{count} άτομο"
@@ -657,7 +657,7 @@ el:
     table:
       expires_at: Λήγει
       uses: Χρήσεις
-    title: Προσκάλεσε άτομα
+    title: Προσκάλεσε κόσμο
   lists:
     errors:
       limit: Έχεις φτάσει το μέγιστο πλήθος επιτρεπτών λιστών
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 6abf152010..84fbbbaf70 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -92,6 +92,7 @@ eu:
       confirm: Berretsi
       confirmed: Berretsita
       confirming: Berresten
+      deleted: Ezabatua
       demote: Jaitsi mailaz
       disable: Desgaitu
       disable_two_factor_authentication: Desgaitu 2FA
@@ -109,7 +110,9 @@ eu:
       follows: Jarraitzen du
       header: Goiburua
       inbox_url: Sarrera ontziaren URL-a
+      invited_by: 'Honek gonbidatua:'
       ip: IP
+      joined: Elkartuta
       location:
         all: Denak
         local: Lokala
@@ -136,7 +139,7 @@ eu:
       protocol: Protokoloa
       public: Publikoa
       push_subscription_expires: Push harpidetzaren iraugitzea
-      redownload: Freskatu abatarra
+      redownload: Freskatu profila
       remove_avatar: Kendu abatarra
       remove_header: Kendu goiburua
       resend_confirmation:
@@ -156,8 +159,8 @@ eu:
       search: Bilatu
       shared_inbox_url: Partekatutako sarrera ontziaren URL-a
       show:
-        created_reports: Kontu honek sortutako txostenak
-        targeted_reports: Kontu honek egindako salaketak
+        created_reports: Sortutako txostenak
+        targeted_reports: Besteen salaketak
       silence: Isilarazi
       silenced: Isilarazita
       statuses: Mezuak
@@ -169,6 +172,7 @@ eu:
       undo_suspension: Desegin kanporatzea
       unsubscribe: Kendu harpidetza
       username: Erabiltzaile-izena
+      warn: Abisatu
       web: Web
     action_logs:
       actions:
@@ -252,7 +256,7 @@ eu:
       week_users_active: aktibo aste honetan
       week_users_new: erabiltzaile aste honetan
     domain_blocks:
-      add_new: Gehitu berria
+      add_new: Gehitu domeinuaren blokeo berria
       created_msg: Domeinuaren blokeoa orain prozesatzen ari da
       destroyed_msg: Domeinuaren blokeoa desegin da
       domain: Domeinua
@@ -264,11 +268,16 @@ eu:
           noop: Bat ere ez
           silence: Isilarazi
           suspend: Kanporatu
-        title: Domeinu blokeo berria
+        title: Domeinuaren blokeo berria
       reject_media: Ukatu multimedia fitxategiak
       reject_media_hint: Lokalki gordetako multimedia fitxategiak ezabatzen ditu eta etorkizunean fitxategi berriak deskargatzeari uko egingo dio. Ez du garrantzirik kanporaketetan
       reject_reports: Errefusatu salaketak
       reject_reports_hint: Ezikusi domeinu honetatik jasotako salaketak. Kanporatzeentzako garrantzirik gabekoa
+      rejecting_media: errefusatu multimedia fitxategiak
+      rejecting_reports: txostenak errefusatzen
+      severity:
+        silence: isilarazia
+        suspend: kanporatua
       show:
         affected_accounts:
           one: Datu-baseko kontu bati eragiten dio
@@ -278,7 +287,7 @@ eu:
           suspend: Kendu kanporatzeko agindua domeinu honetako kontu guztiei
         title: Desegin %{domain} domeinuko blokeoa
         undo: Desegin
-      undo: Desegin
+      undo: Desegin domeinuaren blokeoa
     email_domain_blocks:
       add_new: Gehitu berria
       created_msg: Ongi gehitu da e-mail helbidea domeinuen zerrenda beltzera
@@ -293,7 +302,20 @@ eu:
       back_to_account: Itzuli kontura
       title: "%{acct} kontuaren jarraitzaileak"
     instances:
-      title: Instantzia ezagunak
+      delivery_available: Bidalketa eskuragarri dago
+      known_accounts:
+        one: Kontu ezagun %{count}
+        other: "%{count} kontu ezagun"
+      moderation:
+        all: Denak
+        limited: Mugatua
+        title: Moderazioa
+      title: Federazioa
+      total_blocked_by_us: Guk blokeatuta
+      total_followed_by_them: Haiek jarraitua
+      total_followed_by_us: Guk jarraitua
+      total_reported: Heiei buruzko txostenak
+      total_storage: Multimedia eranskinak
     invites:
       deactivate_all: Desgaitu guztiak
       filter:
@@ -531,8 +553,11 @@ eu:
     warning_title: Sakabanatutako edukiaren eskuragarritasuna
   directories:
     directory: Profilen direktorioa
+    enabled: Direktorioan zerrendatuta zaude orain.
+    enabled_but_waiting: Direktorioan zerrendatuta izatea aukeratu duzu, baina ez duzu oraindik gutxieneko jarraitzaile kopurua (%{min_followers}) zerrendan agertzeko.
     explanation: Deskubritu erabiltzaileak interesen arabera
     explore_mastodon: Esploratu %{title}
+    how_to_enable: Ez duzu aukeratu direktorioan zerrendatua izatea aukeratu. Behean aukeratu dezakezu. Erabili traolak zure biografiaren testuan traola zehatzetan agertzeko!
     people:
       one: pertsona %{count}
       other: "%{count} pertsona"
@@ -558,7 +583,9 @@ eu:
       size: Tamaina
     blocks: Zuk blokeatutakoak
     csv: CSV
+    domain_blocks: Domeinuen blokeoak
     follows: Zuk jarraitutakoak
+    lists: Zerrendak
     mutes: Zuk mututukoak
     storage: Multimedia biltegiratzea
   filters:
@@ -707,10 +734,25 @@ eu:
     no_account_html: Ez duzu konturik? <a href='%{sign_up_path}' target='_blank'>Izena eman</a> dezakezu
     proceed: Ekin jarraitzeari
     prompt: 'Hau jarraituko duzu:'
+    reason_html: "<strong>Zergaitik eman behar da urrats hau?</strong><code>%{instance}</code> agian ez da izena eman duzun zerbitzaria, eta zure hasiera-zerbitzarira eraman behar zaitugu aurretik."
+  remote_interaction:
+    favourite:
+      proceed: Bihurtu gogoko
+      prompt: 'Toot hau gogoko bihurtu nahi duzu:'
+    reblog:
+      proceed: Eman bultzada
+      prompt: 'Toot honi bultzada eman nahi diozu:'
+    reply:
+      proceed: Ekin erantzuteari
+      prompt: 'Toot honi erantzun nahi diozu:'
   remote_unfollow:
     error: Errorea
     title: Izenburua
     unfollowed: Jarraitzeari utzita
+  scheduled_statuses:
+    over_daily_limit: Egun horretarako programatutako toot kopuruaren muga gainditu duzu (%{limit})
+    over_total_limit: Programatutako toot kopuruaren muga gainditu duzu (%{limit})
+    too_soon: Programatutako data etorkizunean egon behar du
   sessions:
     activity: Azken jarduera
     browser: Nabigatzailea
@@ -919,15 +961,18 @@ eu:
       explanation:
         disable: Zure kontua izoztuta dagoen bitartean, zure kontua bere horretan dirau, baina ezin duzu ekintzarik burutu desblokeatzen den arte.
         silence: Zure kontua murriztua dagoen bitartean, jada zu jarraitzen zaituztenak besterik ez dituzte zure Toot-ak ikusiko zerbitzari honetan, eta agian zerrenda publikoetatik kenduko zaizu. Hala ere besteek oraindik zu jarraitu zaitzakete.
+        suspend: Zure kontua kanporatua izan da, zure toot guztiak eta multimedia fitxategiak behin betiko ezabatu dira zerbitzari honetatik, eta zure jarraitzaileen zerbitzarietatik.
       review_server_policies: Berrikusi zerbitzariko politikak
       subject:
         disable: Zure  %{acct} kontua izoztu da
         none: "%{acct} konturako abisua"
         silence: Zure  %{acct} kontua murriztu da
+        suspend: Zure %{acct} kontua kanporatua izan da
       title:
         disable: Kontu izoztua
         none: Abisua
         silence: Kontu murriztua
+        suspend: Kontu kanporatua
     welcome:
       edit_profile_action: Ezarri profila
       edit_profile_step: Pertsonalizatu profila abatar bat igoz, goiburu bat, zure pantaila-izena aldatuz eta gehiago. Jarraitzaile berriak onartu aurretik gainbegiratu nahi badituzu, kontua giltzaperatu dezakezu.
@@ -935,7 +980,7 @@ eu:
       final_action: Hasi mezuak bidaltzen
       final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure mezu publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.'
       full_handle: Zure erabiltzaile-izen osoa
-      full_handle_hint: Hau da lagunei esango zeniena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko.
+      full_handle_hint: Hau da lagunei esango zeniekeena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko.
       review_preferences_action: Aldatu hobespenak
       review_preferences_step: Ziurtatu hobespenak ezartzen dituzula, jaso nahi dituzu e-mail mezuak, lehenetsitako pribatutasuna mezu berrietarako. Mareatzen ez bazaitu GIF-ak automatikoki abiatzea ezarri dezakezu ere.
       subject: Ongi etorri Mastodon-era
diff --git a/config/locales/ga.yml b/config/locales/ga.yml
new file mode 100644
index 0000000000..9f586aa377
--- /dev/null
+++ b/config/locales/ga.yml
@@ -0,0 +1,4 @@
+---
+ga:
+  about:
+    about_hashtag_html: Is toots phoiblí iad seo atá clibáilte le <strong>#%{hashtag}</strong>. Is féidir leat idirghníomhú leo má tá cuntas agat áit ar bith sa fediverse.
diff --git a/config/locales/id.yml b/config/locales/id.yml
index fabf2746e3..d155ab0a79 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -4,6 +4,7 @@ id:
     about_hashtag_html: Ini adalah toot public yang ditandai dengan <strong>#%{hashtag}</strong>. Anda bisa berinteraksi dengan mereka jika anda memiliki akun dimanapun di fediverse.
     about_mastodon_html: Mastodon adalah sebuah jejaring sosial <em>terbuka, open-source</em. Sebuah alternatif <em>desentralisasi</em> dari platform komersial, menjauhkan anda resiko dari sebuah perusahaan yang memonopoli komunikasi anda. Pilih server yang anda percayai &mdash; apapun yang anda pilih, anda tetap dapat berinteraksi dengan semua orang. Semua orang dapat menjalankan server Mastodon sendiri dan berpartisipasi dalam <em>jejaring sosial</em> dengan mudah.
     about_this: Tentang server ini
+    administered_by: 'Dikelola oleh:'
     api: API
     apps: Aplikasi hp
     closed_registrations: Pendaftaran untuk server ini sedang ditutup. Tetapi, anda bisa mencari server lain untuk membuat akun dan mendapatkan akses dari jaringan yang sama di sana.
@@ -70,52 +71,104 @@ id:
   admin:
     account_actions:
       action: Lakukan aksi
+      title: Lakukan moderasi pada %{acct}
+    account_moderation_notes:
+      create: Beri catatan
+      created_msg: Catatan moderasi berhasil dibuat!
+      delete: Hapus
+      destroyed_msg: Catatan moderasi berhasil dihapus!
     accounts:
       are_you_sure: Anda yakin?
+      avatar: Avatar
+      by_domain: Domain
+      change_email:
+        changed_msg: Email akun ini berhasil diubah!
+        current_email: Email saat ini
+        label: Ganti email
+        new_email: Email baru
+        submit: Ganti email
+        title: Ganti email untuk %{username}
       confirm: Konfirmasi
       confirmed: Dikonfirmasi
       confirming: Mengkonfirmasi
+      deleted: Terhapus
+      disable: Nonaktifkan
+      disable_two_factor_authentication: Nonaktifkan 2FA
+      disabled: Dinonaktifkan
       display_name: Nama
       domain: Domain
       edit: Ubah
       email: E-mail
       email_status: Status Email
+      enable: Aktifkan
+      enabled: Diaktifkan
       feed_url: URL Feed
       followers: Pengikut
+      followers_url: URL pengikut
       follows: Mengikut
+      inbox_url: URL Kotak masuk
+      invited_by: Diundang oleh
+      ip: IP
+      joined: Bergabung
       location:
         all: Semua
         local: Lokal
         remote: Remote
         title: Lokasi
+      login_status: Status login
       media_attachments: Lampiran media
+      memorialize: Ubah menjadi memoriam
       moderation:
+        active: Aktif
         all: Semua
         silenced: Didiamkan
         suspended: Disuspen
         title: Moderasi
+      moderation_notes: Catatan moderasi
       most_recent_activity: Aktivitas terbaru
       most_recent_ip: IP terbaru
+      no_limits_imposed: Tidak ada batasan
       not_subscribed: Tidak berlangganan
+      outbox_url: URL Kotak keluar
       perform_full_suspension: Lakukan suspen penuh
       profile_url: URL profil
+      promote: Promosikan
+      protocol: Protokol
       public: Publik
       push_subscription_expires: Langganan PuSH telah kadaluarsa
+      redownload: Muat ulang profil
+      remove_avatar: Hapus avatar
+      remove_header: Hapus header
       resend_confirmation:
         already_confirmed: Pengguna ini sudah dikonfirmasi
         send: Kirim ulang email konfirmasi
         success: Email konfirmasi berhasil dikirim!
+      reset: Reset
       reset_password: Reset kata sandi
+      resubscribe: Langganan ulang
+      role: Hak akses
+      roles:
+        admin: Administrator
+        moderator: Moderator
+        staff: Staf
+        user: Pengguna
       salmon_url: URL Salmon
+      search: Cari
       show:
         created_reports: Laporan yang dibuat oleh akun ini
         targeted_reports: Laporan yang dibuat tentang akun ini
       silence: Diam
+      silenced: Didiamkan
       statuses: Status
+      subscribe: Langganan
+      suspended: Disuspen
       title: Akun
+      unconfirmed_email: Email belum dikonfirmasi
       undo_silenced: Undo mendiamkan
       undo_suspension: Undo suspen
+      unsubscribe: Berhenti langganan
       username: Nama pengguna
+      warn: Beri Peringatan
       web: Web
     domain_blocks:
       add_new: Tambah
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 339dadaf4b..fea39b1fd1 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -28,7 +28,7 @@ it:
     hosted_on: Mastodon ospitato su %{domain}
     learn_more: Scopri altro
     other_instances: Elenco istanze
-    privacy_policy: Policy su la Privacy
+    privacy_policy: Politica della privacy
     source_code: Codice sorgente
     status_count_after:
       one: status
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 1a2591cb4e..6d0e196847 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -939,8 +939,8 @@ ja:
       <p>オリジナルの出典: <a href="https://github.com/discourse/discourse">Discourse privacy policy</a></p>
     title: "%{instance} 利用規約・プライバシーポリシー"
   themes:
-    contrast: ハイコントラスト
-    default: Mastodon
+    contrast: Mastodon (ハイコントラスト)
+    default: Mastodon (ダーク)
     mastodon-light: Mastodon (ライト)
   time:
     formats:
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index bf6a8b7705..0e95adf7b1 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -93,7 +93,7 @@ ko:
       confirmed: 확인됨
       confirming: 확인 중
       deleted: 삭제됨
-      demote: 모더레이터 강등
+      demote: 강등
       disable: 비활성화
       disable_two_factor_authentication: 2단계 인증을 비활성화
       disabled: 비활성화된
@@ -135,7 +135,7 @@ ko:
       outbox_url: 발신함 URL
       perform_full_suspension: 정지시키기
       profile_url: 프로필 URL
-      promote: 모더레이터로 승급
+      promote: 승급
       protocol: 프로토콜
       public: 전체 공개
       push_subscription_expires: PuSH 구독 기간 만료
@@ -350,7 +350,7 @@ ko:
         report: 리포트
       action_taken_by: 신고 처리자
       are_you_sure: 정말로 실행하시겠습니까?
-      assign_to_self: 나에게 할당 됨
+      assign_to_self: 나에게 할당하기
       assigned: 할당 된 모더레이터
       comment:
         none: 없음
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
new file mode 100644
index 0000000000..52aa868a60
--- /dev/null
+++ b/config/locales/lt.yml
@@ -0,0 +1,182 @@
+---
+lt:
+  about:
+    about_hashtag_html: Čia visiems prieinamas įrankis <strong>#%{hashtag}</strong>. Jūs galite juo naudotis bet kur, jeigu turite paskyra fedi-visatoje.
+    about_mastodon_html: Mastodon, tai socialinis tinklas pagrįstas atviro kodo programavimu, ir atvirais web protokolais. Visiškai nemokamas. Ši sistema decantrilizuota kaip jūsų elektroninis paštas.
+    about_this: Apie
+    administered_by: 'Administruoja:'
+    api: API
+    apps: Mobilioji Aplikacija
+    closed_registrations: Registracija šiuo metu uždaryta prie šito tinklo.  Jūs galite rasti kitą būdą susikurti paskyrą ir gauti prieeiga prie to paties tinklo.
+    contact: Kontaktai
+    contact_missing: Nenustatyta
+    contact_unavailable: N/A
+    documentation: Dokumentacija
+    extended_description_html: |
+      <h3>TaisyklÄ—s</h3>
+      <p>Ilgas aprašymas dar nėra sudartyas</p>
+    features:
+      humane_approach_body: Mokantis iš kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiška dizainą, kovojant su netinkamu socialinių tinklų naudojimu.
+      humane_approach_title: Humaniškesnis metodas
+      not_a_product_body: Mastodon nėra komercinis tinklas. Jokių reklamų, privačios informacijos rinkimo. Čia nėra vieno žmogaus, kuris už viską atsako.
+      not_a_product_title: Tu esi žmogus, o ne produktas
+      real_conversation_body: Su 500 simbolių limitu, ir galimybe pažymėti savo įkeliama informacija su įspėjamaisiais ženklais, galite išsireikšti kaip tik norite.
+      real_conversation_title: Sukurtas tikram bendravimui
+      within_reach_body: Mobiliosios aplikacijos skirtos iOS, Android, ir kitoms platformoms. Draugiškos API ekosistemos dėka, Jūs galite palaikyti pokalbi su draugais bet kur.
+      within_reach_title: Visada pasiekama
+    generic_description: "%{domain} yra vienas serveris tinkle"
+    hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu
+    learn_more: Daugiau
+    privacy_policy: Privatumo Politika
+    source_code: Å altinio kodas
+    status_count_after:
+      few: statusai
+      one: statusas
+      other: statusai
+    status_count_before: Autorius
+    terms: Naudojimo sÄ…lygos
+    user_count_after:
+      few: vartotojai
+      one: vartotojas
+      other: vartotojai
+    user_count_before: Namai
+    what_is_mastodon: Kas tai, Mastodon?
+  accounts:
+    choices_html: "%{name} pasirinkimai:"
+    follow: Sekti
+    followers:
+      few: SekÄ—jai
+      one: SekÄ—jas
+      other: SekÄ—jai
+    following: Sekami
+    joined: Prisijungiai %{date}
+    last_active: paskutinį kartą aktyvus
+    link_verified_on: Nuorodos nuosavybė paskutinį kartą tikrinta %{date}
+    media: Medija
+    moved_html: "%{name} persikėlė į %{new_profile_link}:"
+    network_hidden: Å i informacija neprieinama
+    nothing_here: ÄŒia nieko nÄ—ra!
+    people_followed_by: Žmonės, kuriuos %{name} seka
+    people_who_follow: Žmonės kurie seka %{name}
+    pin_errors:
+      following: Privalai sekti žmogų kurį nori pagerbti
+    posts:
+      few: Tootai
+      one: Tootas
+      other: Tootai
+    posts_tab_heading: Tootai
+    posts_with_replies: Tootai ir atsakymai
+    reserved_username: Vartotojo vardas rezervuotas
+    roles:
+      admin: Administratorius
+      bot: Bot'as
+      moderator: Moderatorius
+    unfollow: Nesekti
+  admin:
+    account_actions:
+      action: Veiksmas
+      title: Moderuoti %{acct}
+    account_moderation_notes:
+      create: Palikti žinutę
+      created_msg: Moderavimo žinutė sėkimngai sukurta!
+      delete: IÅ¡trinti
+      destroyed_msg: Moderacijos žinutė sėkmingai ištrinta!
+    accounts:
+      are_you_sure: Ar esate įsitikinęs?
+      avatar: Profilio nuotrauka
+      by_domain: Domenas
+      change_email:
+        changed_msg: Paskyros el paštas sėkmingai pakeistas!
+        current_email: Dabartinis el paštas
+        label: Pakeisti el pašto adresą
+        new_email: Naujas el pašto adresas
+        submit: Pakeisti el pašto adresą
+        title: Pakeisti el pašto adresą vartotojui %{username}
+      confirm: Patvirtinti
+      confirmed: Patvirtinta
+      confirming: Tvirtinama
+      deleted: IÅ¡trinti
+      demote: Pažeminti
+      disable: IÅ¡jungti
+      disable_two_factor_authentication: Išjungti 2 faktorių autentifikaciją
+      disabled: IÅ¡jungta
+      display_name: Matomas vardas
+      domain: Domenas
+      edit: Keisti
+      email: El paštas
+      email_status: El pašto statusas
+      enable: Įjungti
+      enabled: Įjungta
+      followers: SekÄ—jai
+      followers_url: Sekėjų URL
+      follows: Seka
+      header: Antraštė
+      inbox_url: Gautųjų URL
+      invited_by: PakvietÄ—
+      ip: IP
+      joined: PrisijungÄ—
+      location:
+        all: Visi
+        local: Lokali
+        title: Lokacija
+      login_status: Prisijungimo statusas
+      media_attachments: Prisegti medijos failai
+      memorialize: Paversti į memorija
+      moderation:
+        active: Aktyvus
+        all: Visi
+        silenced: Užtildytas
+        suspended: Užrakintas
+        title: Moderacija
+      moderation_notes: Medaracijos žinutės
+      most_recent_activity: Paskutinioji veikla
+      most_recent_ip: Paskutinis IP
+      no_limits_imposed: Be limitu
+      not_subscribed: Ne prenumeruota
+      outbox_url: Išsiustųjų URL
+      perform_full_suspension: Užrakinti
+      profile_url: Profilio URL
+      promote: Paaukštinti
+      protocol: Protokolas
+      public: Viešas
+      push_subscription_expires: PuSH prenumeramivas pasibaigÄ—
+      redownload: Perkrauti profilį
+      remove_avatar: Panaikinti profilio nuotraukÄ…
+      remove_header: Panaikinti antraštę
+      resend_confirmation:
+        already_confirmed: Å is vartotojas jau patvirtintas
+        send: Dar kartą išsiųsti patvirtinimo žinutę
+        success: Patvirtinimo laiškas sėkmingai išsiųstas!
+      reset: IÅ¡ naujo
+      reset_password: Atkurti slaptažodį
+      resubscribe: Per prenumeruoti
+      role: Leidimai
+      roles:
+        admin: Administratorius
+        moderator: Moderatorius
+        staff: Personalas
+        user: Vartotojas
+      salmon_url: Lašišos URL
+      search: Ieškoti
+      shared_inbox_url: Bendroji gautųjų URL
+      show:
+        created_reports: Parašyti raportai
+        targeted_reports: Reportuotas kitų
+      silence: Tyla
+      silenced: Užtildytas
+      statuses: Statusai
+      subscribe: Prenumeruoti
+      suspended: Užrakintas
+      title: Vartotojai
+      unconfirmed_email: Nepatvirtintas el pašto adresas
+      undo_silenced: Atšaukti užtildymą
+      undo_suspension: Atšaukti užrakinimą
+      unsubscribe: Nebeprenumeruoti
+      username: Slapyvardis
+      warn: Įspėti
+      web: Web
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} paskyrÄ— reportÄ… %{target} saviems"
+        change_email_user: "%{name} pakeitė el pašto adresą vartotojui %{target}"
+        confirm_user: "%{name} patvirtino el pašto adresą vartotojui %{target}"
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 0e255e4dc1..99127c2b68 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -15,14 +15,14 @@ cs:
         bot: Tento účet provádí hlavně automatizované akce a nemusí být spravován
         context: Jedno či více kontextů, ve kterých má být filtr uplatněn
         digest: Odesíláno pouze po dlouhé době nečinnosti a pouze, pokud jste při své nepřítomnosti obdržel/a osobní zprávy
-        discoverable_html: <a href="%{path}" target="_blank">Adresář</a> dovoluje lidem najít účty podle zájmů a aktivity. Vyžaduje alespoň %{min_followers} sledovatelů
+        discoverable_html: <a href="%{path}" target="_blank">Adresář</a> dovoluje lidem najít účty podle zájmů a aktivity. Vyžaduje alespoň %{min_followers} sledujících
         email: Bude vám poslán potvrzovací e-mail
         fields: Na profilu můžete mít až 4 položky zobrazené jako tabulka
         header: PNG, GIF či JPG. Maximálně %{size}. Bude zmenšen na %{dimensions} px
         inbox_url: Zkopírujte URL z hlavní stránky mostu, který chcete použít
         irreversible: Filtrované tooty nenávratně zmizí, i pokud bude filtr později odstraněn
         locale: Jazyk uživatelského rozhraní, e-mailů a oznámení push
-        locked: Vyžaduje manuální schvalování sledovatelů
+        locked: Vyžaduje, abyste ručně schvaloval/a sledující
         password: Použijte alespoň 8 znaků
         phrase: Shoda bude nalezena bez ohledu na velikost písmen v těle tootu či varování o obsahu
         scopes: Které API bude aplikace povolena používat. Pokud vyberete rozsah nejvyššího stupně, nebudete je muset vybírat po jednom.
@@ -37,7 +37,7 @@ cs:
         username: Vaše uživatelské jméno bude na %{domain} unikátní
         whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem
       imports:
-        data: Soubor CSV exportován z jiné instance Mastodon
+        data: Soubor CSV exportovaný z jiného serveru Mastodon
       sessions:
         otp: 'Napište dvoufaktorový kód vygenerovaný vaší mobilní aplikací, nebo použijte jeden z vašich záložních kódů:'
       user:
diff --git a/config/locales/simple_form.cy.yml b/config/locales/simple_form.cy.yml
index d3f9cb340d..24ae49a2a9 100644
--- a/config/locales/simple_form.cy.yml
+++ b/config/locales/simple_form.cy.yml
@@ -38,6 +38,18 @@ cy:
         fields:
           name: Label
           value: Cynnwys
+      account_warning_preset:
+        text: Testun rhagosodedig
+      admin_account_action:
+        send_email_notification: Hysbysu'r defnyddiwr trwy e-bost
+        text: Rhybudd wedi'i addasu
+        type: Gweithredu
+        types:
+          disable: Analluogi
+          none: Gwneud dim
+          silence: Tawelwch
+          suspend: Dileu data cyfrif
+        warning_preset_id: Defnyddiwch ragnod rhag rhybudd
       defaults:
         autofollow: Gwahodd i ddilyn eich cyfrif
         avatar: Afatar
@@ -48,6 +60,7 @@ cy:
         context: Hidlo cyd-destunau
         current_password: Cyfrinair presennol
         data: Data
+        discoverable: Rhestrwch y cyfrif hwn ar y cyfeiriadur
         display_name: Enw arddangos
         email: Cyfeiriad e-bost
         expires_in: Yn dod i ben ar ôl
@@ -63,6 +76,7 @@ cy:
         otp_attempt: Côd dau gam
         password: Cyfrinair
         phrase: Allweddair neu ymadrodd
+        setting_aggregate_reblogs: Grŵp hybiau mewn llinellau amser
         setting_auto_play_gif: Chwarae GIFs wedi'u hanimeiddio yn awtomatig
         setting_boost_modal: Dangos deialog cadarnhad cyn bŵstio
         setting_default_language: Cyhoeddi iaith
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 0ffc22b53d..2b9c2bb811 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -57,6 +57,7 @@ eu:
           disable: Desaktibatu
           none: Ez egin ezer
           silence: Isiltarazi
+          suspend: Kanporatu eta behin betiko ezabatu kontuko datuak
         warning_preset_id: Erabili aurre-ezarritako abisu bat
       defaults:
         autofollow: Gonbidatu zure kontua jarraitzera
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index d5e0ef574a..aebab52475 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -41,7 +41,7 @@ gl:
       sessions:
         otp: 'Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación:'
       user:
-        chosen_languages: Si se marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas
+        chosen_languages: Se ten marca, só os toots nos idiomas seleccionados serán mostrados en liñas temporais públicas
     labels:
       account:
         fields:
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index f2d26cf026..41d045a4ad 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -14,7 +14,7 @@ sk:
         avatar: PNG, GIF alebo JPG. Maximálne %{size}. Bude zmenšený na %{dimensions}px
         bot: Tento účet vykonáva hlavne automatizované akcie, a je pravdepodobne nespravovaný
         context: Jedno, alebo viac kritérií, v ktorých má byť filtrovanie uplatnené
-        digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdŕžal/a nejaké osobné správy kým si bol/a preč
+        digest: Odoslané iba v prípade dlhodobej neprítomnosti, a len ak si obdržal/a nejaké osobné správy kým si bol/a preč
         discoverable_html: Táto <a href="%{path}" target="_blank">databáza</a> umožňuje ľudom nájsť profily podľa záujmu a aktívnosti. Vyžaduje aby mali aspoň %{min_followers} sledovateľov
         email: Bude ti odoslaný potvrdzujúci email
         fields: Až štyri položky môžeš mať na svojom profile zobrazené vo forme tabuľky
@@ -22,7 +22,7 @@ sk:
         inbox_url: Skopíruj adresu z hlavnej stránky mostíka, ktorý chceš používať
         irreversible: Vytriedené príspevky zmiznú nenávratne, aj keď triedenie neskôr zrušíš
         locale: Jazyk užívateľského rozhrania, emailových, a nástenkových oboznámení
-        locked: Vyžaduje, aby si manuálne schvaľoval/a následovateľov
+        locked: Vyžaduje sa manuálne schvaľovanie sledujúcich
         password: Zadaj aspoň osem znakov
         phrase: Zhoda sa nájde nezávisle od toho, či je text napísaný, veľkými, alebo malými písmenami, či už v tele, alebo v hlavičke
         scopes: Ktoré API budú povolené aplikácii pre prístup. Ak vyberieš vrcholný stupeň, nemusíš už potom vyberať po jednom.
@@ -69,8 +69,8 @@ sk:
         context: Triedenie kontextov
         current_password: Súčasné heslo
         data: Dáta
-        discoverable: Zaraď tento účet do databázy
-        display_name: Meno
+        discoverable: Zaraď tento účet do databázy profilov
+        display_name: Zobrazované meno
         email: Emailová adresa
         expires_in: Expirovať po
         fields: Metadáta profilu
@@ -99,8 +99,8 @@ sk:
         setting_expand_spoilers: Stále rozbaľ príspevky označené varovaním o obsahu
         setting_hide_network: Ukri svoju sieť kontaktov
         setting_noindex: Nezaraďuj príspevky do indexu pre vyhľadávče
-        setting_reduce_motion: Redukovať pohyb v animáciách
-        setting_system_font_ui: Použiť základné systémové písmo
+        setting_reduce_motion: Mierni pohyb pri animáciách
+        setting_system_font_ui: Použi základné systémové písmo
         setting_theme: Vzhľad webu
         setting_unfollow_modal: Zobrazuj potvrdzovacie okno pred skončením sledovania iného užívateľa
         severity: Závažnosť
@@ -109,8 +109,8 @@ sk:
         username_or_email: Prezívka, alebo email
         whole_word: Celé slovo
       interactions:
-        must_be_follower: Blokuj oboznámenia ohľadom užívateľov, ktorí ťa nesledujú
-        must_be_following: Blokuj oboznámenia ohľadom ľudí ktorých nesleduješ
+        must_be_follower: Blokovať oznámenia od nesledujúcich
+        must_be_following: Blokovať oznámenia od ľudí, ktorých nesleduješ
         must_be_following_dm: Blokuj súkromné správy od ľudí ktorých nesleduješ
       notification_emails:
         digest: Posielaj súhrnné emaily
diff --git a/config/locales/simple_form.sl.yml b/config/locales/simple_form.sl.yml
index 890cbac418..781485864f 100644
--- a/config/locales/simple_form.sl.yml
+++ b/config/locales/simple_form.sl.yml
@@ -96,7 +96,7 @@ sl:
         follow_request: Pošlji e-pošto, ko vam nekdo želi slediti
         mention: Pošlji e-pošto, ko vas nekdo omeni
         reblog: Pošlji e-pošto, ko nekdo sune vaše stanje
-        report: Pošlji e-pošto, ko je oddano novo poročilo
+        report: Pošlji e-pošto, ko je oddana nova prijava
     'no': Ne
     required:
       mark: "*"
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
new file mode 100644
index 0000000000..0967ef424b
--- /dev/null
+++ b/config/locales/simple_form.sq.yml
@@ -0,0 +1 @@
+{}
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 868358f09b..5c2dcd7e07 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -3,7 +3,7 @@ sk:
   about:
     about_hashtag_html: Toto sú verejné príspevky otagované pod <strong>#%{hashtag}</strong>. Ak máš účet hocikde v rámci fediversa, môžeš ich využívať.
     about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email.
-    about_this: O tejto instancii
+    about_this: O tomto serveri
     administered_by: 'Správcom je:'
     api: API
     apps: Aplikácie
@@ -126,7 +126,7 @@ sk:
       media_attachments: Prílohy
       memorialize: Zmeniť na "Navždy budeme spomínať"
       moderation:
-        active: Aktívny/a
+        active: Aktívny
         all: VÅ¡etko
         silenced: Umlčané
         suspended: Vylúčený/á
@@ -215,8 +215,8 @@ sk:
     custom_emojis:
       by_domain: Doména
       copied_msg: Lokálna kópia emoji úspešne vytvorená
-      copy: Kopírovať
-      copy_failed_msg: Nebolo možné vytvoriť lokálnu kópiu tohto emoji
+      copy: Kopíruj
+      copy_failed_msg: Nebolo možné vytvoriť miestnu kópiu tohto emoji
       created_msg: Emoji úspešne vytvorené!
       delete: Zmazať
       destroyed_msg: Emojo úspešne zničený!
@@ -398,10 +398,10 @@ sk:
         desc_html: Zobrazované na viacerých stránkach. Odporúčaná veľkosť aspoň 293×205px. Pokiaľ nieje nahraté, bude zobrazený základný maskot
         title: Obrázok maskota
       peers_api_enabled:
-        desc_html: Domény na ktoré táto instancia už vo fediverse natrafila
-        title: Zverejniť zoznam objavených instancií
+        desc_html: Domény, na ktoré tento server už vo fediverse natrafil
+        title: Zverejni zoznam objavených serverov
       preview_sensitive_media:
-        desc_html: Náhľad adresy z iných instancií, bude zobrazený aj vtedy, keď sú dané médiá označené ako senzitívne
+        desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keď sú médiá označené ako senzitívne
         title: Ukazuj aj chúlostivé médiá v náhľadoch OpenGraph
       profile_directory:
         desc_html: Povoliť užívateľom aby boli nájdení
@@ -429,13 +429,13 @@ sk:
         desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. Opíš, čo robí tento Mastodon server špecifickým, a ďalej hocičo iné, čo považuješ za dôležité. Môžeš použiť HTML kód, hlavne <code>&lt; a &gt;</code>, ale tiež <code>&lt;&gt;</code>.
         title: Popis instancie
       site_description_extended:
-        desc_html: Toto je vhodné miesto pre vaše pravidlá, oboznámenia a iné veci, ktorými je vaša instancia špecifická. Je možné tu používať HTML kód
+        desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny a iné veci, ktorými je tvoja instancia špecifická. Je možné tu používať HTML kód
         title: Vlastné doplňujúce informácie
       site_short_description:
         desc_html: Zobrazené na bočnom paneli a pri meta tagoch. Popíš čo je Mastodon, a čo robí tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis instancie.
         title: Krátky popis instancie
       site_terms:
-        desc_html: Môžete si napísať vaše vlastné pravidla o súkromí, prevádzke, alebo aj iné legality. Môžete tu používať HTML kód
+        desc_html: Môžeš si napísať svoje vlastné pravidla o súkromí, prevádzke, alebo aj iné legality. Môžeš tu používať HTML kód
         title: Vlastné pravidlá prevádzky
       site_title: Názov instancie
       thumbnail:
@@ -506,13 +506,13 @@ sk:
     confirm_email: Potvrdiť email
     delete_account: Vymazať účet
     delete_account_html: Pokiaľ chceš vymazať svoj účet, môžeš tak <a href="%{path}">urobiť tu</a>. Budeš požiadaný/á o potvrdenie tohto kroku.
-    didnt_get_confirmation: Neobdŕžal/a si kroky pre potvrdenie?
+    didnt_get_confirmation: Neobdržal/a si kroky pre potvrdenie?
     forgot_password: Zabudnuté heslo?
     invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový.
     login: Prihlás sa
     logout: Odhlás sa
-    migrate_account: Presunúť sa na iný účet
-    migrate_account_html: Pokiaľ si želáš presmerovať tento účet na nejaký iný, môžeš to <a href="%{path}">urobiť tu</a>.
+    migrate_account: Presúvam sa na iný účet
+    migrate_account_html: Pokiaľ si želáš presmerovať tento účet na nejaký iný, môžeš si to <a href="%{path}">nastaviť tu</a>.
     or: alebo
     or_log_in_with: Alebo prihlásiť z
     providers:
@@ -598,7 +598,7 @@ sk:
   filters:
     contexts:
       home: Domáca os
-      notifications: Oboznámenia
+      notifications: Oznámenia
       public: Verejné osi
       thread: Konverzácie
     edit:
@@ -814,8 +814,8 @@ sk:
     export: Exportovať dáta
     followers: Povolení následovatelia
     import: Importovať
-    migrate: Presunúť účet
-    notifications: Oboznámenia
+    migrate: Presunutie účtu
+    notifications: Oznámenia
     preferences: Voľby
     settings: Nastavenia
     two_factor_authentication: Dvoj-faktorové overenie
@@ -878,7 +878,15 @@ sk:
 
       <hr class="spacer" />
 
-      <h3 id="use">
+      <h3 id="use">Načo sú tvoje údaje používané?</h3>
+
+      <p>Hociktorá z informácií, ktoré sú o tebe zozbierané, môže byť použité následujúcimi spôsobmi:</p>
+
+      <ul>
+        <li>Pre zabezpečenie základného fungovania Mastodonu. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li>
+        <li>Pre lepšie moderovanie komunity sa napríklad môže tvoja IP adresa porovnať s ostatnými už známimi adresami, aby bolo možné zistiť, či nedochádza napríklad k obchádzaniu vylúčenia, aleb k iným porušeniam pravidiel.</li>
+        <li>Emailová adresa ktorú poskytneš môže byť použitá na zasielanie informácií, oboznámení keď ostatní užívatelia interaktujú s tvojím obsahom, alebo na posielanie správ, odpovedí na otázky a iné požiadavky.</li>
+      </ul>
     title: Podmienky užívania, a pravidlá súkromia pre %{instance}
   themes:
     contrast: Vysoký kontrast
@@ -930,7 +938,7 @@ sk:
       edit_profile_step: Profil si môžeš prispôsobiť nahratím portrétu a hlavičky, môžeš upraviť svoje meno a viac. Pokiaľ chceš preverovať nových následovateľov predtým než ťa budú môcť sledovať, môžeš uzamknúť svoj účet.
       explanation: Tu nájdeš nejaké tipy do začiatku
       final_action: Začni prispievať
-      final_step: 'Začnite písať! Aj bez následovníkov budú vaše verejné správy videné ostatnými, napríklad na lokálnej osi a pod haštagmi. Môžete sa ostatným predstaviť pod haštagom #introductions.'
+      final_step: 'Začni písať! Aj bez následovateľov budú tvoje verejné príspevky videné ostatnými, napríklad na miestnej osi a pod haštagmi. Ak chceš, môžeš sa ostatným predstaviť pod haštagom #introductions.'
       full_handle: Adresa tvojho profilu v celom formáte
       full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z inej instancie.
       review_preferences_action: Zmeniť nastavenia
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 594c58acc1..35cba927be 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -54,6 +54,7 @@ sl:
       two: Sledilci
     following: Sledim
     joined: Se je pridružil na %{date}
+    last_active: zadnji aktivni
     link_verified_on: Lastništvo te povezave je bilo preverjeno na %{date}
     media: Medij
     moved_html: "%{name} se je prestavil na %{new_profile_link}:"
@@ -77,8 +78,11 @@ sl:
       moderator: Mod
     unfollow: Prenehaj slediti
   admin:
+    account_actions:
+      action: Izvedi dejanje
+      title: Izvedi moderirano dejanje %{acct}
     account_moderation_notes:
-      create: Pusti sporočilo
+      create: Pusti opombo
       created_msg: Uspešno ustvarjena opomba moderiranja!
       delete: Izbriši
       destroyed_msg: Moderirana opomba je uspešno uničena!
@@ -96,6 +100,7 @@ sl:
       confirm: Potrdi
       confirmed: Potrjeno
       confirming: Potrjujem
+      deleted: Izbrisano
       demote: Ponižaj
       disable: Onemogoči
       disable_two_factor_authentication: Onemogoči 2FA
@@ -111,8 +116,11 @@ sl:
       followers: Sledilci
       followers_url: URL sledilci
       follows: Sledi
+      header: Glava
       inbox_url: URl v mapi "Prejeto"
+      invited_by: Povabljen od
       ip: IP
+      joined: Pridružil
       location:
         all: Vse
         local: Lokalno
@@ -122,6 +130,7 @@ sl:
       media_attachments: Medijske priloge
       memorialize: Spremenite v spomin
       moderation:
+        active: Dejaven
         all: Vse
         silenced: Utišan
         suspended: Suspendiran
@@ -129,7 +138,265 @@ sl:
       moderation_notes: Opombe moderiranja
       most_recent_activity: Zadnja aktivnost
       most_recent_ip: Zadnji IP
+      no_limits_imposed: Brez omejitev
+      not_subscribed: Ni naročeno
+      outbox_url: URl za pošiljanje
+      perform_full_suspension: Začasno ustavi
+      profile_url: URL profila
       promote: Spodbujanje
+      protocol: Protokol
+      public: Javen
+      push_subscription_expires: Naročnina PuSH preteče
+      redownload: Osveži profil
+      remove_avatar: Odstrani podobo
+      remove_header: Odstrani glavo
+      resend_confirmation:
+        already_confirmed: Ta uporabnik je že potrjen
+        send: Ponovno pošlji potrditveno e-pošto
+        success: Potrditvena e-pošta je uspešno poslana!
+      reset: Ponastavi
+      reset_password: Ponastavi geslo
+      resubscribe: Ponovno se naroči
+      role: Dovoljenja
+      roles:
+        admin: Skrbnik
+        moderator: Moderator
+        staff: Osebje
+        user: Uporabnik
+      salmon_url: Salmon URL
+      search: Poišči
+      shared_inbox_url: URL mape "Prejeto v skupni rabi"
+      show:
+        created_reports: Narejene prijave
+        targeted_reports: Prijavili drugi
+      silence: Utišaj
+      silenced: Utišan
+      statuses: Stanja
+      subscribe: Naroči
+      suspended: Suspendiran
+      title: Računi
+      unconfirmed_email: Nepotrjena e-pošta
+      undo_silenced: Razveljavi utišanje
+      undo_suspension: Razveljavi suspendiranje
+      unsubscribe: Odjavi se od naročnine
+      username: Uporabniško ime
+      warn: Opozori
+      web: Splet
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} je prijavil %{target} sebi"
+        change_email_user: "%{name} je spremenil naslov e-pošte uporabnika %{target}"
+        confirm_user: "%{name} je potrdil naslov e-pošte uporabnika %{target}"
+        create_account_warning: "%{name} je poslal opozorilo %{target}"
+        create_custom_emoji: "%{name} je poslal nove emotikone %{target}"
+        create_domain_block: "%{name} je blokiral domeno %{target}"
+        create_email_domain_block: "%{name} je dal na črni seznam e-pošto domene %{target}"
+        demote_user: "%{name} je degradiral uporabnika %{target}"
+        destroy_custom_emoji: "%{name} je uničil emotikon %{target}"
+        destroy_domain_block: "%{name} je odblokiral domeno %{target}"
+        destroy_email_domain_block: "%{name} je dal na beli seznam e-pošto domene %{target}"
+        destroy_status: "%{name} je odstranil stanje od %{target}"
+        disable_2fa_user: "%{name} je onemogočil dvofaktorsko zahtevo za uporabnika %{target}"
+        disable_custom_emoji: "%{name} je onemogočil emotikon %{target}"
+        disable_user: "%{name} je onemogočil prijavo za uporabnika %{target}"
+        enable_custom_emoji: "%{name} je omogočil emotikon %{target}"
+        enable_user: "%{name} je omogočil prijavo za uporabnika %{target}"
+        memorialize_account: "%{name} je spremenil račun od %{target} v stran spominov"
+        promote_user: "%{name} je spodbudil uporabnika %{target}"
+        remove_avatar_user: "%{name} je odstranil podobo od %{target}"
+        reopen_report: "%{name} je ponovno odprl prijavo %{target}"
+        reset_password_user: "%{name} je ponastavil geslo od uporabnika %{target}"
+        resolve_report: "%{name} je razrešil prijavo %{target}"
+        silence_account: "%{name} je utišal račun od %{target}"
+        suspend_account: "%{name} je začasno ustavil račun od %{target}"
+        unassigned_report: "%{name} je nedodeljeno prijavil %{target}"
+        unsilence_account: "%{name} je preklical utišanje računa od %{target}"
+        unsuspend_account: "%{name} je aktiviral račun od %{target}"
+        update_custom_emoji: "%{name} je posodobil emotikone %{target}"
+        update_status: "%{name} je posodobil stanje od %{target}"
+      deleted_status: "(izbrisano stanje)"
+      title: Dnevnik revizije
+    custom_emojis:
+      by_domain: Domena
+      copied_msg: Lokalna kopija emotikona je bila uspešno ustvarjena
+      copy: Kopiraj
+      copy_failed_msg: Lokalne kopije emotikona ni bilo mogoče ustvariti
+      created_msg: Emotikon je uspešno ustvarjen!
+      delete: Izbriši
+      destroyed_msg: Emotikon je uspešno uničen!
+      disable: Onemogoči
+      disabled_msg: Ta emotikon je uspešno onemogočen
+      emoji: Emotikon
+      enable: Omogoči
+      enabled_msg: Ta emotikon je uspešno omogočen
+      image_hint: PNG do 50KB
+      listed: Navedeno
+      new:
+        title: Dodaj nove emotikone
+      overwrite: Prepiši
+      shortcode: Kratka koda
+      shortcode_hint: Najmanj 2 znaka, samo alfanumerični znaki in podčrtaji
+      title: Emotikoni po meri
+      unlisted: Neuvrščeni
+      update_failed_msg: Tega emotikona ni bilo mogoče posodobiti
+      updated_msg: Emotikon je uspešno posodobljen!
+      upload: Pošlji
+    dashboard:
+      backlog: Zaostala opravila
+      config: Nastavitve
+      feature_deletions: Brisanje računov
+      feature_invites: Poveza povabil
+      feature_profile_directory: Mapa profila
+      feature_registrations: Registracije
+      feature_relay: Rele federacije
+      features: Zmožnosti
+      hidden_service: Federacija s skritimi storitvami
+      open_reports: odprte prijave
+      recent_users: Nedavni uporabniki
+      search: Iskanje po celotnem besedilu
+      single_user_mode: Način enega uporabnika
+      software: Programska oprema
+      space: Uporaba prostora
+      title: Nadzorna plošča
+      total_users: Skupaj uporabnikov
+      trends: Trendi
+      week_interactions: interakcije ta teden
+      week_users_active: aktivni ta teden
+      week_users_new: uporabniki ta teden
+    domain_blocks:
+      add_new: Dodaj nov domenski blok
+      created_msg: Domenski blok se sedaj obdeluje
+      destroyed_msg: Domenski blok je bil razveljavljen
+      domain: Domena
+      new:
+        create: Ustvari blok
+        hint: Domenski blok ne bo preprečil ustvarjanja vnosov računov v zbirko podatkov, ampak bo retroaktivno in samodejno uporabil posebne metode moderiranja na teh računih.
+        severity:
+          desc_html: "<strong>Utišaj</strong> bo vse objave računa naredil nevidne vsem, ki jih ne sledijo. <strong>Suspendiraj</strong> bo odstranil vso vsebino, medije in podatke profila računa. Uporabi <strong>nič</strong>, če želite le zavrniti predstavnostne datoteke."
+          noop: Nič
+          silence: Utišaj
+          suspend: Suspendiraj
+        title: Nov domenski blok
+      reject_media: Zavrni predstavnostne datoteke
+      reject_media_hint: Odstrani lokalno shranjene predstavnostne datoteke in zavrača prenašanje le-teh v prihodnosti. Za suspenzije ni pomembno
+      reject_reports: Zavrnjene prijave
+      reject_reports_hint: Prezri vse prijave, ki pridejo iz te domene. Za suspenzije ni pomembno
+      rejecting_media: zavrnitev predstavnostnih datotek
+      rejecting_reports: zavrnitev prijav
+      severity:
+        silence: utišani
+        suspend: suspendirani
+      show:
+        affected_accounts:
+          few: "%{count} računov v bazi podatkov so prizadeti"
+          one: En račun v bazi podatkov je prizadet
+          other: "%{count} računov v bazi podatkov so prizadeti"
+          two: "%{count} računov v bazi podatkov so prizadeti"
+        retroactive:
+          silence: Prekliči utišanje za vse obstoječe račune iz te domene
+          suspend: Odsuspendiraj vse obstoječe račune iz te domene
+        title: Razveljavi domenski blok za %{domain}
+        undo: Razveljavi
+      undo: Razveljavi domenski blok
+    email_domain_blocks:
+      add_new: Dodaj novo
+      created_msg: Domena e-pošte je bila uspešno dodana na črni seznam
+      delete: Izbriši
+      destroyed_msg: Domena e-pošte je bila uspešno izbrisana iz črnega seznama
+      domain: Domena
+      new:
+        create: Dodaj domeno
+        title: Nov vnos e-pošte na črni seznam
+      title: Črni seznam e-pošte
+    followers:
+      back_to_account: Nazaj na račun
+      title: Sledilci od %{acct}
+    instances:
+      delivery_available: Na voljo je dostava
+      known_accounts:
+        few: "%{count} znanih računov"
+        one: "%{count} znan račun"
+        other: "%{count} znanih računov"
+        two: "%{count} znanih računov"
+      moderation:
+        all: Vse
+        limited: Omejeno
+        title: Moderiranje
+      title: Federacija
+      total_blocked_by_us: Blokirano iz naše strani
+      total_followed_by_them: Oni ti sledijo
+      total_followed_by_us: Mi ti sledimo
+      total_reported: Poročila o njih
+      total_storage: Predstavnostne priloge
+    invites:
+      deactivate_all: Onemogoči vse
+      filter:
+        all: Vse
+        available: Razpoložljivo
+        expired: Potekel
+        title: Filter
+      title: Povabila
+    relays:
+      add_new: Dodaj nov rele
+      delete: Izbriši
+      description_html: "<strong>Rele federacije</strong> je posredniški strežnik, ki si izmenjuje velike količine javnih trobov med strežniki, ki so se naročili in objavili na njem. <strong>Majhnim in srednjim strežnikom lahko pomaga pri odkrivanju vsebine iz sistema fediverse</strong>, kar bi sicer zahtevalo, da lokalni uporabniki ročno sledijo druge osebe na oddaljenih strežnikih."
+      disable: Onemogoči
+      disabled: Onemogočeno
+      enable: Omogoči
+      enable_hint: Ko je omogočen, se bo vaš strežnik naročil na vse javne trobe iz tega releja in začel pošiljati javne trobe tega strežnika.
+      enabled: Omogočeno
+      inbox_url: URL releja
+      pending: ÄŒakanje na odobritev releja
+      save_and_enable: Shrani in omogoči
+      setup: Nastavi povezavo releja
+      status: Stanje
+      title: Releji
+    report_notes:
+      created_msg: Opomba o prijavi je uspešno ustvarjena!
+      destroyed_msg: Opomba o prijavi je uspešno izbrisana!
+    reports:
+      account:
+        note: opomba
+        report: prijava
+      action_taken_by: Dejanje, ki ga je sprejel
+      are_you_sure: Ali ste prepričani?
+      assign_to_self: Dodeli meni
+      assigned: Dodeljen moderator
+      comment:
+        none: Nič
+      created_at: Prijavljeno
+      mark_as_resolved: Označi kot rešeno
+      mark_as_unresolved: Označi kot nerešeno
+      notes:
+        create: Dodaj opombo
+        create_and_resolve: Razreši z opombo
+        create_and_unresolve: Ponovo odpri z opombo
+        delete: Izbriši
+        placeholder: Opišite dejanja, ki ste jih izvedli, ali katere koli druge posodobitve...
+      reopen: Ponovno odpri prijavo
+      report: 'Prijavi #%{id}'
+      reported_account: Prijavljeni račun
+      reported_by: Prijavljen od
+      resolved: Razrešeno
+      resolved_msg: Prijava je uspešno razrešena!
+      status: Stanje
+      title: Prijave
+      unassign: Odstopi
+      unresolved: Nerešeno
+      updated_at: Posodobljen
+    settings:
+      activity_api_enabled:
+        desc_html: Å tevilke lokalno objavljenih stanj, aktivnih uporabnikov in novih registracij na tedenskih seznamih
+        title: Objavi združeno statistiko o dejavnosti uporabnikov
+      bootstrap_timeline_accounts:
+        desc_html: Več uporabniških imen ločite z vejico. Deluje samo na lokalnih in odklenjenih računih. Privzeto, ko je prazno, pri vseh lokalnih skrbnikih.
+        title: Privzeta sledenja za nove uporabnike
+      contact_information:
+        email: Poslovna e-pošta
+        username: Uporabniško ime stika
+      custom_css:
+        desc_html: Spremeni videz z naloženim CSS na vsaki strani
+        title: CSS po meri
   statuses:
     pin_errors:
       ownership: Trob nekoga drugega ne more biti pripet
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
new file mode 100644
index 0000000000..e583b9309f
--- /dev/null
+++ b/config/locales/sq.yml
@@ -0,0 +1,612 @@
+---
+sq:
+  about:
+    about_this: Mbi
+    administered_by: 'Administruar nga:'
+    api: API
+    apps: Aplikacione për celular
+    contact: Kontakt
+    contact_missing: I parregulluar
+    contact_unavailable: N/A
+    documentation: Dokumentim
+    features:
+      humane_approach_title: Një trajtim më njerëzor
+      not_a_product_title: Jeni një person, jo një produkt
+      real_conversation_title: Ndërtuar për bashkëbisedim të njëmendtë
+      within_reach_title: Përherë i kapshëm
+    generic_description: "%{domain} është një shërbyes te rrjeti"
+    hosted_on: Mastodon i strehuar në %{domain}
+    learn_more: Mësoni më tepër
+    other_instances: Listë instancash
+    privacy_policy: Rregulla privatësie
+    source_code: Kod burim
+    status_count_after:
+      one: gjendje
+      other: gjendje
+    status_count_before: Cili krijoi
+    terms: Kushte shërbimi
+    user_count_after:
+      one: përdorues
+      other: përdorues
+    what_is_mastodon: Ç’është Mastodon-i?
+  accounts:
+    choices_html: 'Zgjedhje të %{name}:'
+    follow: Ndiqeni
+    followers:
+      one: Ndjekës
+      other: Ndjekës
+    following: Ndjekje
+    joined: U bë pjesë më %{date}
+    last_active: aktiv së fundi
+    media: Media
+    nothing_here: S’ka gjë këtu!
+    people_followed_by: Persona të ndjekur nga %{name}
+    people_who_follow: Persona që ndjekin %{name}
+    reserved_username: Emri i përdoruesit është i ruajtur për dikë
+    roles:
+      admin: Përgjegjës
+      bot: Bot
+      moderator: Mod
+    unfollow: Resht së ndjekuri
+  admin:
+    account_actions:
+      action: Kryeje veprimin
+    account_moderation_notes:
+      create: Lini një shënim
+      created_msg: Shënimi i moderimit u krijua me sukses!
+      delete: Fshije
+      destroyed_msg: Shënimi i moderimit u asgjësua me sukses!
+    accounts:
+      are_you_sure: A jeni i sigurt?
+      avatar: Avatar
+      by_domain: Përkatësi
+      change_email:
+        changed_msg: Email-i i llogarisë u ndryshua me sukses!
+        current_email: Email-i i tanishëm
+        label: Ndrysho email-in
+        new_email: Email i ri
+        submit: Ndrysho email-in
+        title: Ndrysho email-in për %{username}
+      confirm: Ripohojeni
+      confirmed: U ripohua
+      confirming: Po ripohohet
+      deleted: U fshi
+      demote: Zhgradoje
+      disable: Çaktivizoje
+      disable_two_factor_authentication: Çaktivizoni 2FA
+      disabled: E çaktivizuar
+      display_name: Emër në ekran
+      domain: Përkatësi
+      edit: Përpunojeni
+      email: Email
+      email_status: Gjendje email-i
+      enable: Aktivizoje
+      enabled: E aktivizuar
+      feed_url: URL prurjeje
+      followers: Ndjekës
+      followers_url: URL Ndjekësish
+      follows: Ndjekje
+      header: Krye
+      inbox_url: URL Mesazhesh të Marrë
+      invited_by: Ftuar nga
+      ip: IP
+      joined: U bë pjesë
+      location:
+        all: Krejt
+        local: Vendore
+        remote: E largët
+        title: Vendndodhje
+      login_status: Gjendje hyrjeje
+      media_attachments: Bashkëngjitje media
+      moderation:
+        active: Aktiv
+        all: Krejt
+        suspended: Të pezulluara
+        title: Moderim
+      moderation_notes: Shënime moderimesh
+      most_recent_activity: Veprimtaria më e freskët
+      most_recent_ip: IP-ja më e freskët
+      no_limits_imposed: Pa imponim kufijsh
+      not_subscribed: Jo i  pajtuar
+      outbox_url: URL Mesazhesh të Dërguar
+      perform_full_suspension: Pezulloje
+      profile_url: URL profili
+      protocol: Protokoll
+      public: Publike
+      push_subscription_expires: Pajtimi PuSH skadon më
+      redownload: Rifresko profilin
+      remove_avatar: Hiqe avatarin
+      remove_header: Hiqe kryen
+      resend_confirmation:
+        already_confirmed: Ky përdorues është i ripohuar tashmë
+        send: Ridërgo email ripohimi
+        success: Email-i i ripohimit u dërgua me sukses!
+      reset_password: Ricaktoni fjalëkalimin
+      resubscribe: Ripajtohuni
+      role: Leje
+      roles:
+        admin: Përgjegjës
+        moderator: Moderator
+        staff: Staf
+        user: Përdorues
+      search: Kërkoni
+      show:
+        created_reports: Ka bërë raporte
+        targeted_reports: Raportuar nga të tjerë
+      silence: Heshtje
+      statuses: Gjendje
+      subscribe: Pajtomë
+      suspended: Të pezulluara
+      title: Llogari
+      unconfirmed_email: Email i paripohuar
+      undo_silenced: Zhbëje heshtjen
+      undo_suspension: Zhbëje pezullimin
+      unsubscribe: Shpajtohuni
+      username: Emër përdoruesi
+      warn: Sinjalizoje
+      web: Web
+    action_logs:
+      actions:
+        change_email_user: "%{name} ndryshoi adresën email të përdoruesit %{target}"
+        confirm_user: "%{name} ripohoi adresën email të përdoruesit %{target}"
+        create_account_warning: "%{name} dërgoi një sinjalizim për %{target}"
+        create_custom_emoji: "%{name} ngarkoi emotikon të ri %{target}"
+        create_domain_block: "%{name} bllokoi përkatësinë %{target}"
+        create_email_domain_block: "%{name} e shtoi në listë bllokimesh përkatësinë %{target}"
+        demote_user: "%{name} zhgradoi përdoruesin %{target}"
+        destroy_custom_emoji: "%{name} asgjësoi emotikonin %{target}"
+        destroy_domain_block: "%{name} zhbllokoi përkatësinë %{target}"
+        disable_2fa_user: "%{name} çaktivizoi domosdoshmëritë për dyfaktorësh për përdoruesin %{target}"
+        disable_custom_emoji: "%{name} çaktivizoi emotikonin %{target}"
+        disable_user: "%{name} çaktivizoi hyrje për përdoruesin %{target}"
+        enable_custom_emoji: "%{name} aktivizoi emotikonin %{target}"
+        enable_user: "%{name} aktivizoi hyrje për përdoruesin %{target}"
+        promote_user: "%{name} gradoi përdoruesin %{target}"
+        remove_avatar_user: "%{name} hoqi avatarin e %{target}"
+        reopen_report: "%{name} rihapi raportin %{target}"
+        reset_password_user: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}"
+        silence_account: "%{name} heshtoi llogarinë e %{target}"
+        suspend_account: "%{name} pezulloi llogarinë e %{target}"
+        unsilence_account: "%{name} hoqi heshtimin për llogarinë %{target}"
+        unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}"
+        update_custom_emoji: "%{name} përditësoi emotikonin %{target}"
+    custom_emojis:
+      by_domain: Përkatësi
+      copy: Kopjoje
+      created_msg: Emotikoni u krijua me sukses!
+      delete: Fshije
+      destroyed_msg: Emotikoni u asgjësua me sukses!
+      disable: Çaktivizoje
+      disabled_msg: Ai emotikon u çaktivizua me sukses
+      emoji: Emotikon
+      enable: Aktivizoje
+      enabled_msg: Ai emotikon u aktivizua me sukses
+      image_hint: PNG deri 50KB
+      new:
+        title: Shtoni emotikon të ri vetjak
+      overwrite: Mbishkruaje
+      shortcode: Kod i shkurtër
+      title: Emotikone vetjake
+      update_failed_msg: S’u përditësua dot ai emotikon
+      updated_msg: Emotikoni u përditësua me sukses!
+      upload: Ngarkoje
+    dashboard:
+      config: Formësim
+      feature_invites: Lidhje ftesash
+      feature_profile_directory: Drejtori profilesh
+      feature_registrations: Regjistrime
+      feature_relay: Rele federimi
+      features: Veçori
+      search: Kërko tekstin e plotë
+      single_user_mode: Mënyrë me përdorues të vetëm
+      software: Software
+      space: Përdorim hapësire
+      title: Pult
+      total_users: përdorues gjithsej
+      trends: Tendenca
+      week_interactions: Ndërveprime këtë javë
+      week_users_active: aktivë këtë javë
+      week_users_new: përdorues këtë javë
+    domain_blocks:
+      add_new: Shtoni bllokim të ri përkatësie
+      created_msg: Bllokimi i përkatësisë tani po përpunohet
+      destroyed_msg: Bllokimi i përkatësisë u hoq
+      domain: Përkatësi
+      new:
+        create: Krijoni bllokim
+        severity:
+          noop: Asnjë
+          silence: Heshtje
+          suspend: Pezulloje
+        title: Shtoni Bllokim i ri përkatësie
+      show:
+        affected_accounts: Pat ndikim te një llogari në bazën e të dhënave
+        undo: Zhbëje
+      undo: Zhbëje bllokimin e përkatësisë
+    email_domain_blocks:
+      add_new: Shtoni të ri
+      delete: Fshije
+      domain: Përkatësi
+      new:
+        create: Shtoni përkatësi
+    followers:
+      back_to_account: Mbrapsht Te Llogaria
+      title: Ndjekës të %{acct}
+    instances:
+      moderation:
+        all: Krejt
+        limited: E kufizuar
+        title: Moderim
+      title: Federim
+      total_blocked_by_us: Bllokuar nga ne
+      total_followed_by_them: Ndjekur prej tyre
+      total_followed_by_us: Ndjekur nga ne
+      total_reported: Raportime rreth tyre
+      total_storage: Bashkëngjitje media
+    invites:
+      deactivate_all: Çaktivizoji krejt
+      filter:
+        all: Krejt
+        expired: Ka skaduar
+        title: Filtër
+      title: Ftesa
+    relays:
+      add_new: Shtoni rele të re
+      delete: Fshije
+      disable: Çaktivizoje
+      disabled: E çaktivizuar
+      enable: Aktivizoje
+      enabled: E aktivizuar
+      inbox_url: URL releje
+      pending: Në pritje të miratimit të relesë
+      save_and_enable: Ruaje dhe aktivizoje
+      setup: Ujdisni një lidhje rele
+      status: Gjendje
+      title: Rele
+    report_notes:
+      created_msg: Shënimi i raportimit u krijua me sukses!
+      destroyed_msg: Shënimi i raportimit u fshi me sukses!
+    reports:
+      account:
+        note: shënim
+        report: Raportoje
+      action_taken_by: 'Veprimi i ndërmarrë nga '
+      are_you_sure: A jeni i sigurt?
+      assign_to_self: Caktojani vetes
+      comment:
+        none: Asnjë
+      created_at: Raportuar më
+      mark_as_resolved: Vëri shenjë si i zgjidhur
+      mark_as_unresolved: Vëri shenjë si të pazgjidhur
+      notes:
+        create: Shtoni shënim
+        create_and_resolve: Zgjidhe me shënim
+        create_and_unresolve: Rihape me shënim
+        delete: Fshije
+      reopen: Rihape raportimin
+      report: 'Raportim #%{id}'
+      reported_account: Llogari e raportuar
+      reported_by: Raportuar nga
+      status: Gjendje
+      title: Raportime
+      unresolved: Të pazgjidhur
+      updated_at: U përditësua më
+    settings:
+      custom_css:
+        title: CSS Vetjake
+      mascot:
+        title: Figurë simboli
+      peers_api_enabled:
+        title: Boto listë instancash të zbuluara
+      profile_directory:
+        desc_html: Lejoju përdoruesve të jenë të zbulueshëm
+        title: Aktivizo drejtori profilesh
+      registrations:
+        open:
+          title: Hap regjistrim
+      show_staff_badge:
+        desc_html: Shfaq një stemë stafi në faqen e një përdoruesi
+        title: Shfaq stemë stafi
+      site_description:
+        title: Përshkrim instance
+      site_terms:
+        title: Kushte vetjake shërbimi
+      site_title: Emër instance
+      thumbnail:
+        title: Miniaturë instance
+      timeline_preview:
+        title: Paraparje rrjedhe kohore
+      title: Rregullime sajti
+    statuses:
+      back_to_account: Mbrapsht te faqja e llogarisë
+      batch:
+        delete: Fshije
+        nsfw_off: Vëri shenjë si jo rezervat
+        nsfw_on: Vëri shenjë si rezervat
+      failed_to_execute: S’u arrit të përmbushej
+      media:
+        title: Media
+      no_media: S’ka media
+      no_status_selected: S’u ndryshua ndonjë gjendje, ngaqë s’u përzgjodh ndonjë e tillë
+      title: Gjendje llogarish
+      with_media: Me media
+    subscriptions:
+      callback_url: URL Callback-u
+      expires_in: Skadon më
+      topic: Temë
+    tags:
+      accounts: Llogari
+      hidden: Fshehur
+      hide: Fshihe prej drejtorie
+      name: Hashtag
+      title: Hashtage
+      unhide: Shfaqe në drejtori
+      visible: E dukshme
+    title: Administrim
+    warning_presets:
+      add_new: Shtoni të ri
+      delete: Fshije
+      edit: Përpunoni
+  admin_mailer:
+    new_report:
+      body: "%{reporter} ka raportuar %{target}"
+      subject: Raport i ri për %{instance} (#%{id})
+  application_mailer:
+    notification_preferences: Ndryshoni parapëlqime email-i
+    salutation: "%{name},"
+    settings: 'Ndryshoni parapëlqime email-i: %{link}'
+    view: 'Parje:'
+    view_profile: Shihni Profilin
+    view_status: Shihini gjendjen
+  applications:
+    created: Aplikacioni u krijua me sukses
+    destroyed: Aplikacioni u fshi me sukses
+    invalid_url: URL-ja e dhënë është e pavlefshme
+    regenerate_token: Riprodho token hyrjesh
+    your_token: Token-i juaj për hyrje
+  auth:
+    change_password: Fjalëkalim
+    confirm_email: Ripohoni email-in
+    delete_account: Fshije llogarinë
+    didnt_get_confirmation: S’morët udhëzime ripohimi?
+    forgot_password: Harruat fjalëkalimin tuaj?
+    login: Hyni
+    logout: Dalje
+    migrate_account: Kaloni në një tjetër llogari
+    migrate_account_html: Nëse doni ta ridrejtoni këtë llogari te një tjetër, këtë mund <a href="%{path}">ta formësoni këtu</a>.
+    or: ose
+    or_log_in_with: Ose bëni hyrjen me
+    providers:
+      cas: CAS
+    register: Regjistrohuni
+    register_elsewhere: Regjistrohuni në një tjetër shërbyes
+    resend_confirmation: Ridërgo udhëzime ripohimi
+    reset_password: Ricaktoni fjalëkalimin
+    security: Siguri
+    set_new_password: Caktoni fjalëkalim të ri
+  authorize_follow:
+    already_following: E ndiqni tashmë këtë llogari
+    follow: Ndiqeni
+    follow_request: 'Keni dërguar një kërkesë ndjekjeje te:'
+    following: 'Sukses! Tani e ndiqni:'
+    post_follow:
+      return: Shfaq profilin e përdoruesit
+    title: Ndiq %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count}o"
+      about_x_months: "%{count}mj"
+      about_x_years: "%{count}v"
+      almost_x_years: "%{count}v"
+      half_a_minute: Mu tani
+      less_than_x_minutes: "%{count}m"
+      less_than_x_seconds: Mu tani
+      over_x_years: "%{count}v"
+      x_days: "%{count}d"
+      x_minutes: "%{count}m"
+      x_months: "%{count}mj"
+      x_seconds: "%{count}s"
+  deletes:
+    proceed: Fshini llogarinë
+  directories:
+    directory: Drejtori profilesh
+    explore_mastodon: Eksploroni %{title}
+    people:
+      one: "%{count} person"
+      other: "%{count} persona"
+  errors:
+    '403': S’keni leje të shihni këtë faqe.
+    '404': Faqja që po kërkonit, nuk ekziston.
+    '410': Faqja që po kërkonit, nuk ekziston më.
+    '422':
+      title: Verifikimi i sigurisë dështoi
+    '500':
+      title: Kjo faqe s’është e saktë
+  exports:
+    archive_takeout:
+      date: Datë
+      size: Madhësi
+    csv: CSV
+    lists: Lista
+    storage: Depozitim për media
+  filters:
+    contexts:
+      notifications: Njoftime
+      thread: Biseda
+    edit:
+      title: Përpunoni filtër
+    index:
+      delete: Fshije
+      title: Filtra
+    new:
+      title: Shtoni filtër të ri
+  followers:
+    domain: Përkatësi
+    followers_count: Numër ndjekësish
+    purge: Hiqe nga ndjekësit
+    unlocked_warning_title: Llogaria juaj s’është kyçur
+  footer:
+    developers: Zhvillues
+    more: Më tepër…
+    resources: Burime
+  generic:
+    changes_saved_msg: Ndryshimet u ruajtën me sukses!
+    copy: Kopjoje
+    save_changes: Ruaji ndryshimet
+  imports:
+    types:
+      blocking: Listë bllokimesh
+  invites:
+    expires_in:
+      '1800': 30 minuta
+      '21600': 6 orë
+      '3600': 1 orë
+      '43200': 12 orë
+      '604800': 1 javë
+      '86400': 1 ditë
+    expires_in_prompt: Kurrë
+    generate: Prodhoje
+    invited_by: 'Qetë ftuar nga:'
+    max_uses:
+      one: 1 përdorim
+      other: "%{count} përdorime"
+    max_uses_prompt: Pa kufi
+    table:
+      expires_at: Skadon më
+      uses: Përdorime
+    title: Ftoni njerëz
+  migrations:
+    proceed: Ruaje
+  moderation:
+    title: Moderim
+  notification_mailer:
+    digest:
+      action: Shihini krejt njoftimet
+    favourite:
+      title: E parapëlqyer e re
+    follow:
+      title: Ndjekës i ri
+    mention:
+      body: 'U përmendët nga %{name} në:'
+      subject: U përmendët nga %{name}
+      title: Përmendje e re
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: K
+          thousand: K
+          trillion: T
+  pagination:
+    truncate: "&hellip;"
+  preferences:
+    languages: Gjuhë
+    other: Tjetër
+    publishing: Publikim
+    web: Web
+  remote_unfollow:
+    error: Gabim
+    title: Titull
+  sessions:
+    activity: Veprimtaria e fundit
+    browser: Shfletues
+    browsers:
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Shfletues i panjohur
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Shfletues Nokia S40 Ovi
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: Sesioni i tanishëm
+    description: "%{browser} në %{platform}"
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: platformë e panjohur
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Shfuqizoje
+    title: Sesione
+  settings:
+    authorized_apps: Aplikacione të autorizuara
+    back: Mbrapsht te Mastodon
+    delete: Fshirje llogarie
+    development: Zhvillim
+    edit_profile: Përpunoni profilin
+    export: Eksportim të dhënash
+    followers: Ndjekës të autorizuar
+    import: Importo
+    migrate: Migrim llogarie
+    notifications: Njoftime
+    preferences: Parapëlqime
+    settings: Rregullime
+    your_apps: Aplikacionet tuaja
+  statuses:
+    attached:
+      image:
+        one: "%{count} figurë"
+        other: "%{count} figura"
+      video:
+        one: "%{count} video"
+        other: "%{count} video"
+    content_warning: 'Sinjalizim lënde: %{warning}'
+    show_more: Shfaq më tepër
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Vetëm ndjekësve
+      private_long: Shfaqua vetëm ndjekësve
+      public: Publike
+      public_long: Mund ta shohë kushdo
+  themes:
+    contrast: Me kontrast të lartë
+    default: Mastodon
+    mastodon-light: Mastodon (light)
+  time:
+    formats:
+      default: "%d %b, %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    disable: Çaktivizoje
+    enable: Aktivizoje
+    enabled_success: Mirëfilltësimi dyfaktorësh u aktivizua me sukses
+  user_mailer:
+    backup_ready:
+      subject: Arkivi juaj është gati për shkarkim
+    warning:
+      subject:
+        disable: Llogaria juaj %{acct} është ngrirë
+        none: Sinjalizim për %{acct}
+        silence: Llogaria juaj %{acct} është kufizuar
+    welcome:
+      explanation: Ja disa ndihmëza, sa për t’ia filluar
+      final_action: Filloni të postoni
+      subject: Mirë se vini te Mastodon-i
+      tips: Ndihmëza
+      title: Mirë se vini, %{name}!
+  users:
+    invalid_email: Adresa email është e pavlefshme
+    invalid_otp_token: Kod dyfaktorësh i pavlefshëm
+    signed_in_as: 'I futur si:'
+  verification:
+    verification: Verifikim
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 1d373ed679..331ec3f804 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -34,14 +34,14 @@ sr:
       few: статуси
       many: статуси
       one: статус
-      other: статуси
+      other: статуса
     status_count_before: Који су написали
     terms: Услови коришћења
     user_count_after:
       few: корисници
       many: корисници
       one: корисник
-      other: корисници
+      other: корисника
     user_count_before: Дом за
     what_is_mastodon: Шта је Мастодон?
   accounts:
@@ -54,7 +54,7 @@ sr:
       other: Пратиоци
     following: Пратим
     joined: Придружио/ла се %{date}
-    last_active: последњи активни
+    last_active: последњи пут активни
     link_verified_on: Власништво над овом везом је проверено %{date}
     media: Медији
     moved_html: "%{name} је прешао на %{new_profile_link}:"
@@ -570,8 +570,8 @@ sr:
     people:
       few: "%{count} људе"
       many: "%{count} људе"
-      one: "%{count} особу"
-      other: "%{count} људе"
+      one: "%{count} особа/е"
+      other: "%{count} људи"
   errors:
     '403': Немате дозвола да видите ову страну.
     '404': Страна коју сте тражили не постоји.
-- 
GitLab


From c0a564feaa11c072da9c2be892643db55659ae38 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 11 Feb 2019 13:19:06 +0100
Subject: [PATCH 051/192] Add available locales for lv, ms, sq (#10008)

---
 app/helpers/settings_helper.rb | 3 +++
 config/application.rb          | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 0e957e9465..7a3ceca786 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -30,7 +30,9 @@ module SettingsHelper
     ja: '日本語',
     ka: 'ქართული',
     ko: '한국어',
+    lv: 'Latviešu valoda',
     ml: 'മലയാളം',
+    ms: 'بهاس ملايو',
     nl: 'Nederlands',
     no: 'Norsk',
     oc: 'Occitan',
@@ -41,6 +43,7 @@ module SettingsHelper
     ru: 'Русский',
     sk: 'Slovenčina',
     sl: 'Slovenščina',
+    sq: 'Shqip',
     sr: 'Српски',
     'sr-Latn': 'Srpski (latinica)',
     sv: 'Svenska',
diff --git a/config/application.rb b/config/application.rb
index b4a39b5c8a..ae9ce48970 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -64,6 +64,8 @@ module Mastodon
       :ja,
       :ka,
       :ko,
+      :lv,
+      :ms,
       :nl,
       :no,
       :oc,
@@ -74,6 +76,7 @@ module Mastodon
       :ru,
       :sk,
       :sl,
+      :sq,
       :sr,
       :'sr-Latn',
       :sv,
-- 
GitLab


From aee93bfc9c7169f2e784de8572263de911922760 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 11 Feb 2019 13:19:59 +0100
Subject: [PATCH 052/192] Fix timeline jumps (#10001)

* Avoid two-step rendering of statuses as much as possible

Cache width shared by Video player, MediaGallery and Cards at the
ScrollableList level, pass it down through StatusList and Notifications.

* Adjust scroll when new preview cards appear

* Adjust scroll when statuses above the current scroll position are deleted
---
 .../mastodon/components/media_gallery.js      | 10 ++-
 .../mastodon/components/scrollable_list.js    | 28 +++++++-
 app/javascript/mastodon/components/status.js  | 67 +++++++++++++++++--
 .../notifications/components/notification.js  | 32 ++++++++-
 .../features/status/components/card.js        |  5 +-
 .../mastodon/features/video/index.js          |  4 +-
 6 files changed, 134 insertions(+), 12 deletions(-)

diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js
index c507920d0e..a2bc952556 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/mastodon/components/media_gallery.js
@@ -194,6 +194,8 @@ class MediaGallery extends React.PureComponent {
     height: PropTypes.number.isRequired,
     onOpenMedia: PropTypes.func.isRequired,
     intl: PropTypes.object.isRequired,
+    defaultWidth: PropTypes.number,
+    cacheWidth: PropTypes.func,
   };
 
   static defaultProps = {
@@ -202,6 +204,7 @@ class MediaGallery extends React.PureComponent {
 
   state = {
     visible: displayMedia !== 'hide_all' && !this.props.sensitive || displayMedia === 'show_all',
+    width: this.props.defaultWidth,
   };
 
   componentWillReceiveProps (nextProps) {
@@ -221,6 +224,7 @@ class MediaGallery extends React.PureComponent {
   handleRef = (node) => {
     if (node /*&& this.isStandaloneEligible()*/) {
       // offsetWidth triggers a layout, so only calculate when we need to
+      if (this.props.cacheWidth) this.props.cacheWidth(node.offsetWidth);
       this.setState({
         width: node.offsetWidth,
       });
@@ -233,8 +237,10 @@ class MediaGallery extends React.PureComponent {
   }
 
   render () {
-    const { media, intl, sensitive, height } = this.props;
-    const { width, visible } = this.state;
+    const { media, intl, sensitive, height, defaultWidth } = this.props;
+    const { visible } = this.state;
+
+    const width = this.state.width || defaultWidth;
 
     let children;
 
diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js
index fec06e2637..0376cf85ac 100644
--- a/app/javascript/mastodon/components/scrollable_list.js
+++ b/app/javascript/mastodon/components/scrollable_list.js
@@ -40,6 +40,7 @@ export default class ScrollableList extends PureComponent {
 
   state = {
     fullscreen: null,
+    cachedMediaWidth: 250, // Default media/card width using default Mastodon theme
   };
 
   intersectionObserverWrapper = new IntersectionObserverWrapper();
@@ -130,6 +131,20 @@ export default class ScrollableList extends PureComponent {
     this.handleScroll();
   }
 
+  getScrollPosition = () => {
+    if (this.node && (this.node.scrollTop > 0 || this.mouseMovedRecently)) {
+      return { height: this.node.scrollHeight, top: this.node.scrollTop };
+    } else {
+      return null;
+    }
+  }
+
+  updateScrollBottom = (snapshot) => {
+    const newScrollTop = this.node.scrollHeight - snapshot;
+
+    this.setScrollTop(newScrollTop);
+  }
+
   getSnapshotBeforeUpdate (prevProps) {
     const someItemInserted = React.Children.count(prevProps.children) > 0 &&
       React.Children.count(prevProps.children) < React.Children.count(this.props.children) &&
@@ -150,6 +165,12 @@ export default class ScrollableList extends PureComponent {
     }
   }
 
+  cacheMediaWidth = (width) => {
+    if (width && this.state.cachedMediaWidth !== width) {
+      this.setState({ cachedMediaWidth: width });
+    }
+  }
+
   componentWillUnmount () {
     this.clearMouseIdleTimer();
     this.detachScrollListener();
@@ -239,7 +260,12 @@ export default class ScrollableList extends PureComponent {
                 intersectionObserverWrapper={this.intersectionObserverWrapper}
                 saveHeightKey={trackScroll ? `${this.context.router.route.location.key}:${scrollKey}` : null}
               >
-                {child}
+                {React.cloneElement(child, {
+                  getScrollPosition: this.getScrollPosition,
+                  updateScrollBottom: this.updateScrollBottom,
+                  cachedMediaWidth: this.state.cachedMediaWidth,
+                  cacheMediaWidth: this.cacheMediaWidth,
+                })}
               </IntersectionObserverArticleContainer>
             ))}
 
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 2be6c4b36c..386404b574 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -69,6 +69,10 @@ class Status extends ImmutablePureComponent {
     onMoveUp: PropTypes.func,
     onMoveDown: PropTypes.func,
     showThread: PropTypes.bool,
+    getScrollPosition: PropTypes.func,
+    updateScrollBottom: PropTypes.func,
+    cacheMediaWidth: PropTypes.func,
+    cachedMediaWidth: PropTypes.number,
   };
 
   // Avoid checking props that are functions (and whose equality will always
@@ -80,6 +84,43 @@ class Status extends ImmutablePureComponent {
     'hidden',
   ];
 
+  // Track height changes we know about to compensate scrolling
+  componentDidMount () {
+    this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card');
+  }
+
+  getSnapshotBeforeUpdate () {
+    if (this.props.getScrollPosition) {
+      return this.props.getScrollPosition();
+    } else {
+      return null;
+    }
+  }
+
+  // Compensate height changes
+  componentDidUpdate (prevProps, prevState, snapshot) {
+    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card');
+    if (doShowCard && !this.didShowCard) {
+      this.didShowCard = true;
+      if (snapshot !== null && this.props.updateScrollBottom) {
+        if (this.node && this.node.offsetTop < snapshot.top) {
+          this.props.updateScrollBottom(snapshot.height - snapshot.top);
+        }
+      }
+    }
+  }
+
+  componentWillUnmount() {
+    if (this.node && this.props.getScrollPosition) {
+      const position = this.props.getScrollPosition();
+      if (position !== null && this.node.offsetTop < position.top) {
+        requestAnimationFrame(() => {
+          this.props.updateScrollBottom(position.height - position.top);
+        });
+      }
+    }
+  }
+
   handleClick = () => {
     if (this.props.onClick) {
       this.props.onClick();
@@ -166,6 +207,10 @@ class Status extends ImmutablePureComponent {
     }
   }
 
+  handleRef = c => {
+    this.node = c;
+  }
+
   render () {
     let media = null;
     let statusAvatar, prepend, rebloggedByText;
@@ -180,7 +225,7 @@ class Status extends ImmutablePureComponent {
 
     if (hidden) {
       return (
-        <div>
+        <div ref={this.handleRef}>
           {status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}
           {status.get('content')}
         </div>
@@ -195,7 +240,7 @@ class Status extends ImmutablePureComponent {
 
       return (
         <HotKeys handlers={minHandlers}>
-          <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0'>
+          <div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}>
             <FormattedMessage id='status.filtered' defaultMessage='Filtered' />
           </div>
         </HotKeys>
@@ -243,11 +288,12 @@ class Status extends ImmutablePureComponent {
                 preview={video.get('preview_url')}
                 src={video.get('url')}
                 alt={video.get('description')}
-                width={239}
+                width={this.props.cachedMediaWidth}
                 height={110}
                 inline
                 sensitive={status.get('sensitive')}
                 onOpenVideo={this.handleOpenVideo}
+                cacheWidth={this.props.cacheMediaWidth}
               />
             )}
           </Bundle>
@@ -255,7 +301,16 @@ class Status extends ImmutablePureComponent {
       } else {
         media = (
           <Bundle fetchComponent={MediaGallery} loading={this.renderLoadingMediaGallery}>
-            {Component => <Component media={status.get('media_attachments')} sensitive={status.get('sensitive')} height={110} onOpenMedia={this.props.onOpenMedia} />}
+            {Component => (
+              <Component
+                media={status.get('media_attachments')}
+                sensitive={status.get('sensitive')}
+                height={110}
+                onOpenMedia={this.props.onOpenMedia}
+                cacheWidth={this.props.cacheMediaWidth}
+                defaultWidth={this.props.cachedMediaWidth}
+              />
+            )}
           </Bundle>
         );
       }
@@ -265,6 +320,8 @@ class Status extends ImmutablePureComponent {
           onOpenMedia={this.props.onOpenMedia}
           card={status.get('card')}
           compact
+          cacheWidth={this.props.cacheMediaWidth}
+          defaultWidth={this.props.cachedMediaWidth}
         />
       );
     }
@@ -291,7 +348,7 @@ class Status extends ImmutablePureComponent {
 
     return (
       <HotKeys handlers={handlers}>
-        <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}>
+        <div className={classNames('status__wrapper', `status__wrapper-${status.get('visibility')}`, { 'status__wrapper-reply': !!status.get('in_reply_to_id'), read: unread === false, focusable: !this.props.muted })} tabIndex={this.props.muted ? null : 0} data-featured={featured ? 'true' : null} aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))} ref={this.handleRef}>
           {prepend}
 
           <div className={classNames('status', `status-${status.get('visibility')}`, { 'status-reply': !!status.get('in_reply_to_id'), muted: this.props.muted, read: unread === false })} data-id={status.get('id')}>
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js
index 0bd8d47c39..9669b6e7de 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.js
+++ b/app/javascript/mastodon/features/notifications/components/notification.js
@@ -35,6 +35,10 @@ class Notification extends ImmutablePureComponent {
     onToggleHidden: PropTypes.func.isRequired,
     status: PropTypes.option,
     intl: PropTypes.object.isRequired,
+    getScrollPosition: PropTypes.func,
+    updateScrollBottom: PropTypes.func,
+    cacheMediaWidth: PropTypes.func,
+    cachedMediaWidth: PropTypes.number,
   };
 
   handleMoveUp = () => {
@@ -129,6 +133,10 @@ class Notification extends ImmutablePureComponent {
         onMoveDown={this.handleMoveDown}
         onMoveUp={this.handleMoveUp}
         contextType='notifications'
+        getScrollPosition={this.props.getScrollPosition}
+        updateScrollBottom={this.props.updateScrollBottom}
+        cachedMediaWidth={this.props.cachedMediaWidth}
+        cacheMediaWidth={this.props.cacheMediaWidth}
       />
     );
   }
@@ -149,7 +157,17 @@ class Notification extends ImmutablePureComponent {
             </span>
           </div>
 
-          <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={!!this.props.hidden} />
+          <StatusContainer
+            id={notification.get('status')}
+            account={notification.get('account')}
+            muted
+            withDismiss
+            hidden={!!this.props.hidden}
+            getScrollPosition={this.props.getScrollPosition}
+            updateScrollBottom={this.props.updateScrollBottom}
+            cachedMediaWidth={this.props.cachedMediaWidth}
+            cacheMediaWidth={this.props.cacheMediaWidth}
+          />
         </div>
       </HotKeys>
     );
@@ -171,7 +189,17 @@ class Notification extends ImmutablePureComponent {
             </span>
           </div>
 
-          <StatusContainer id={notification.get('status')} account={notification.get('account')} muted withDismiss hidden={this.props.hidden} />
+          <StatusContainer
+            id={notification.get('status')}
+            account={notification.get('account')}
+            muted
+            withDismiss
+            hidden={this.props.hidden}
+            getScrollPosition={this.props.getScrollPosition}
+            updateScrollBottom={this.props.updateScrollBottom}
+            cachedMediaWidth={this.props.cachedMediaWidth}
+            cacheMediaWidth={this.props.cacheMediaWidth}
+          />
         </div>
       </HotKeys>
     );
diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js
index 8237de84d3..0eff544119 100644
--- a/app/javascript/mastodon/features/status/components/card.js
+++ b/app/javascript/mastodon/features/status/components/card.js
@@ -61,6 +61,8 @@ export default class Card extends React.PureComponent {
     maxDescription: PropTypes.number,
     onOpenMedia: PropTypes.func.isRequired,
     compact: PropTypes.bool,
+    defaultWidth: PropTypes.number,
+    cacheWidth: PropTypes.func,
   };
 
   static defaultProps = {
@@ -69,7 +71,7 @@ export default class Card extends React.PureComponent {
   };
 
   state = {
-    width: 280,
+    width: this.props.defaultWidth || 280,
     embedded: false,
   };
 
@@ -112,6 +114,7 @@ export default class Card extends React.PureComponent {
 
   setRef = c => {
     if (c) {
+      if (this.props.cacheWidth) this.props.cacheWidth(c.offsetWidth);
       this.setState({ width: c.offsetWidth });
     }
   }
diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 15a5de4b80..894fe78d9e 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -100,6 +100,7 @@ class Video extends React.PureComponent {
     onCloseVideo: PropTypes.func,
     detailed: PropTypes.bool,
     inline: PropTypes.bool,
+    cacheWidth: PropTypes.func,
     intl: PropTypes.object.isRequired,
   };
 
@@ -109,7 +110,7 @@ class Video extends React.PureComponent {
     volume: 0.5,
     paused: true,
     dragging: false,
-    containerWidth: false,
+    containerWidth: this.props.width,
     fullscreen: false,
     hovered: false,
     muted: false,
@@ -129,6 +130,7 @@ class Video extends React.PureComponent {
     this.player = c;
 
     if (c) {
+      if (this.props.cacheWidth) this.props.cacheWidth(this.player.offsetWidth);
       this.setState({
         containerWidth: c.offsetWidth,
       });
-- 
GitLab


From 0e513ff862faf7fa9e5b89d2ab7d22fd0ab540ff Mon Sep 17 00:00:00 2001
From: Hinaloe <hina@hinaloe.net>
Date: Tue, 12 Feb 2019 13:10:31 +0900
Subject: [PATCH 053/192] Don't focus spiler input when disabled spoiler
 (#10017)

---
 .../mastodon/features/compose/components/compose_form.js        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 9e7d391665..a990e74981 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -180,7 +180,7 @@ class ComposeForm extends ImmutablePureComponent {
         <div className={`spoiler-input ${this.props.spoiler ? 'spoiler-input--visible' : ''}`}>
           <label>
             <span style={{ display: 'none' }}>{intl.formatMessage(messages.spoiler_placeholder)}</span>
-            <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} type='text' className='spoiler-input__input'  id='cw-spoiler-input' ref={this.setSpoilerText} />
+            <input placeholder={intl.formatMessage(messages.spoiler_placeholder)} value={this.props.spoiler_text} onChange={this.handleChangeSpoilerText} onKeyDown={this.handleKeyDown} tabIndex={this.props.spoiler ? 0 : -1} type='text' className='spoiler-input__input'  id='cw-spoiler-input' ref={this.setSpoilerText} />
           </label>
         </div>
 
-- 
GitLab


From 99c4b5b75ad8856f6e05e6a838abacc755a7b183 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Tue, 12 Feb 2019 05:10:43 +0100
Subject: [PATCH 054/192] =?UTF-8?q?Move=20sending=20account=20Delete=20to?=
 =?UTF-8?q?=20anyone=20but=20the=20account's=20followers=20to=20the=20pull?=
 =?UTF-8?q?=CC=80=20queue=20(#10016)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/services/suspend_account_service.rb                | 10 +++++++++-
 .../activitypub/low_priority_delivery_worker.rb        |  5 +++++
 2 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 app/workers/activitypub/low_priority_delivery_worker.rb

diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 1bc2314de7..fc3bc03a53 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -102,6 +102,10 @@ class SuspendAccountService < BaseService
     ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url|
       [delete_actor_json, @account.id, inbox_url]
     end
+
+    ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes) do |inbox_url|
+      [delete_actor_json, @account.id, inbox_url]
+    end
   end
 
   def delete_actor_json
@@ -117,7 +121,11 @@ class SuspendAccountService < BaseService
   end
 
   def delivery_inboxes
-    Account.inboxes + Relay.enabled.pluck(:inbox_url)
+    @delivery_inboxes ||= @account.followers.inboxes + Relay.enabled.pluck(:inbox_url)
+  end
+
+  def low_priority_delivery_inboxes
+    Account.inboxes - delivery_inboxes
   end
 
   def associations_for_destruction
diff --git a/app/workers/activitypub/low_priority_delivery_worker.rb b/app/workers/activitypub/low_priority_delivery_worker.rb
new file mode 100644
index 0000000000..a141b8f780
--- /dev/null
+++ b/app/workers/activitypub/low_priority_delivery_worker.rb
@@ -0,0 +1,5 @@
+# frozen_string_literal: true
+
+class ActivityPub::LowPriorityDeliveryWorker < ActivityPub::DeliveryWorker
+  sidekiq_options queue: 'pull', retry: 8, dead: false
+end
-- 
GitLab


From 241661e009a7f3a9a458b5494910f39bec5e88e4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 Feb 2019 05:11:06 +0100
Subject: [PATCH 055/192] Bump rubocop from 0.63.1 to 0.64.0 (#10006)

Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.63.1 to 0.64.0.
- [Release notes](https://github.com/rubocop-hq/rubocop/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.63.1...v0.64.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index 53c8b4602f..d924a546ba 100644
--- a/Gemfile
+++ b/Gemfile
@@ -127,7 +127,7 @@ group :development do
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.3'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.63', require: false
+  gem 'rubocop', '~> 0.64', require: false
   gem 'brakeman', '~> 4.4', require: false
   gem 'bundler-audit', '~> 0.6', require: false
   gem 'scss_lint', '~> 0.57', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 0c342064fc..6f8a53d181 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -525,7 +525,7 @@ GEM
       rspec-core (~> 3.0, >= 3.0.0)
       sidekiq (>= 2.4.0)
     rspec-support (3.8.0)
-    rubocop (0.63.1)
+    rubocop (0.64.0)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
       parser (>= 2.5, != 2.5.1.1)
@@ -746,7 +746,7 @@ DEPENDENCIES
   rqrcode (~> 0.10)
   rspec-rails (~> 3.8)
   rspec-sidekiq (~> 3.0)
-  rubocop (~> 0.63)
+  rubocop (~> 0.64)
   sanitize (~> 5.0)
   scss_lint (~> 0.57)
   sidekiq (~> 5.2)
-- 
GitLab


From 4f0322dcae8d68feecff880eabfd7339082647d0 Mon Sep 17 00:00:00 2001
From: Franck Zoccolo <franck@zoccolo.com>
Date: Tue, 12 Feb 2019 14:48:04 +0100
Subject: [PATCH 056/192] Add support for IPv6 only MXes in Email validation
 (#10009)

* Add support for IPv6 only MXes

* Fixed email validator tests
---
 app/validators/email_mx_validator.rb       |  1 +
 spec/validators/email_mx_validator_spec.rb | 38 ++++++++++++++++++++++
 2 files changed, 39 insertions(+)

diff --git a/app/validators/email_mx_validator.rb b/app/validators/email_mx_validator.rb
index 5b4c684b2c..96fbedcfcf 100644
--- a/app/validators/email_mx_validator.rb
+++ b/app/validators/email_mx_validator.rb
@@ -24,6 +24,7 @@ class EmailMxValidator < ActiveModel::Validator
 
       ([domain] + hostnames).uniq.each do |hostname|
         ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::A).to_a.map { |e| e.address.to_s })
+        ips.concat(dns.getresources(hostname, Resolv::DNS::Resource::IN::AAAA).to_a.map { |e| e.address.to_s })
       end
     end
 
diff --git a/spec/validators/email_mx_validator_spec.rb b/spec/validators/email_mx_validator_spec.rb
index bc68f63cfb..48e17a4f10 100644
--- a/spec/validators/email_mx_validator_spec.rb
+++ b/spec/validators/email_mx_validator_spec.rb
@@ -11,6 +11,7 @@ describe EmailMxValidator do
 
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
       allow(resolver).to receive(:timeouts=).and_return(nil)
       allow(Resolv::DNS).to receive(:open).and_yield(resolver)
 
@@ -23,7 +24,9 @@ describe EmailMxValidator do
 
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
       allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
       allow(resolver).to receive(:timeouts=).and_return(nil)
       allow(Resolv::DNS).to receive(:open).and_yield(resolver)
 
@@ -37,6 +40,21 @@ describe EmailMxValidator do
 
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '1.2.3.4')])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if the AAAA record is blacklisted' do
+      EmailDomainBlock.create!(domain: 'fd00::1')
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::1')])
       allow(resolver).to receive(:timeouts=).and_return(nil)
       allow(Resolv::DNS).to receive(:open).and_yield(resolver)
 
@@ -50,7 +68,25 @@ describe EmailMxValidator do
 
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
       allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
+      allow(resolver).to receive(:timeouts=).and_return(nil)
+      allow(Resolv::DNS).to receive(:open).and_yield(resolver)
+
+      subject.validate(user)
+      expect(user.errors).to have_received(:add)
+    end
+
+    it 'adds an error if the MX IPv6 record is blacklisted' do
+      EmailDomainBlock.create!(domain: 'fd00::2')
+      resolver = double
+
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')])
       allow(resolver).to receive(:timeouts=).and_return(nil)
       allow(Resolv::DNS).to receive(:open).and_yield(resolver)
 
@@ -64,7 +100,9 @@ describe EmailMxValidator do
 
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::MX).and_return([double(exchange: 'mail.example.com')])
       allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::A).and_return([])
+      allow(resolver).to receive(:getresources).with('example.com', Resolv::DNS::Resource::IN::AAAA).and_return([])
       allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::A).and_return([double(address: '2.3.4.5')])
+      allow(resolver).to receive(:getresources).with('mail.example.com', Resolv::DNS::Resource::IN::AAAA).and_return([double(address: 'fd00::2')])
       allow(resolver).to receive(:timeouts=).and_return(nil)
       allow(Resolv::DNS).to receive(:open).and_yield(resolver)
 
-- 
GitLab


From 2f80a348c9de3de6dbf220f9e12d5906042b3f73 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 Feb 2019 15:17:26 +0100
Subject: [PATCH 057/192] Bump active_model_serializers from 0.10.8 to 0.10.9
 (#10018)

Bumps [active_model_serializers](https://github.com/rails-api/active_model_serializers) from 0.10.8 to 0.10.9.
- [Release notes](https://github.com/rails-api/active_model_serializers/releases)
- [Changelog](https://github.com/rails-api/active_model_serializers/blob/v0.10.9/CHANGELOG.md)
- [Commits](https://github.com/rails-api/active_model_serializers/compare/v0.10.8...v0.10.9)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 6f8a53d181..c47f4e9307 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -38,7 +38,7 @@ GEM
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.0.3)
-    active_model_serializers (0.10.8)
+    active_model_serializers (0.10.9)
       actionpack (>= 4.1, < 6)
       activemodel (>= 4.1, < 6)
       case_transform (>= 0.2)
-- 
GitLab


From e230b176fbb8ba9c29e8ed31131bac870b72c3e9 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Tue, 12 Feb 2019 21:16:02 +0100
Subject: [PATCH 058/192] [Glitch] Don't focus spoiler input when disabled
 spoiler

Inspired by 0e513ff862faf7fa9e5b89d2ab7d22fd0ab540ff
---
 .../flavours/glitch/features/composer/spoiler/index.js           | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/javascript/flavours/glitch/features/composer/spoiler/index.js b/app/javascript/flavours/glitch/features/composer/spoiler/index.js
index 1c3c962f09..e2f9c70216 100644
--- a/app/javascript/flavours/glitch/features/composer/spoiler/index.js
+++ b/app/javascript/flavours/glitch/features/composer/spoiler/index.js
@@ -87,6 +87,7 @@ export default class ComposerSpoiler extends React.PureComponent {
             type='text'
             value={text}
             ref={handleRefSpoilerText}
+            disabled={hidden}
           />
         </label>
       </div>
-- 
GitLab


From 67215692fc1764cb4311e4bbd1211d0cf38438bd Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Tue, 12 Feb 2019 22:24:14 +0100
Subject: [PATCH 059/192] Save IP address used for sign-up, not only sign-in
 (#10026)

Fixes #9995
---
 app/controllers/auth/registrations_controller.rb | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/controllers/auth/registrations_controller.rb b/app/controllers/auth/registrations_controller.rb
index f2a832542f..ad7b1859f6 100644
--- a/app/controllers/auth/registrations_controller.rb
+++ b/app/controllers/auth/registrations_controller.rb
@@ -28,6 +28,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
     resource.invite_code = params[:invite_code] if resource.invite_code.blank?
     resource.agreement   = true
 
+    resource.current_sign_in_ip = request.remote_ip if resource.current_sign_in_ip.nil?
     resource.build_account if resource.account.nil?
   end
 
-- 
GitLab


From fbe527ccfc85f9547fd807b3d1e2a7fcf3fc81ae Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Feb 2019 02:45:01 +0100
Subject: [PATCH 060/192] Bump sidekiq-unique-jobs from 6.0.8 to 6.0.9 (#10019)

Bumps [sidekiq-unique-jobs](https://github.com/mhenrixon/sidekiq-unique-jobs) from 6.0.8 to 6.0.9.
- [Release notes](https://github.com/mhenrixon/sidekiq-unique-jobs/releases)
- [Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.8...v6.0.9)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index c47f4e9307..9d4252f163 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -563,7 +563,7 @@ GEM
       rufus-scheduler (~> 3.2)
       sidekiq (>= 3)
       tilt (>= 1.4.0)
-    sidekiq-unique-jobs (6.0.8)
+    sidekiq-unique-jobs (6.0.9)
       concurrent-ruby (~> 1.0, >= 1.0.5)
       sidekiq (>= 4.0, < 6.0)
       thor (~> 0)
-- 
GitLab


From 3a2e44b62c408f2665f4faf6245f6a41e3a2c541 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Feb 2019 02:54:27 +0100
Subject: [PATCH 061/192] Bump pkg-config from 1.3.2 to 1.3.3 (#10023)

Bumps [pkg-config](https://github.com/ruby-gnome2/pkg-config) from 1.3.2 to 1.3.3.
- [Release notes](https://github.com/ruby-gnome2/pkg-config/releases)
- [Changelog](https://github.com/ruby-gnome2/pkg-config/blob/master/NEWS)
- [Commits](https://github.com/ruby-gnome2/pkg-config/compare/1.3.2...1.3.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 9d4252f163..30c7d31d95 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -400,7 +400,7 @@ GEM
     pg (1.1.4)
     pghero (2.2.0)
       activerecord
-    pkg-config (1.3.2)
+    pkg-config (1.3.3)
     powerpack (0.1.2)
     premailer (1.11.1)
       addressable
-- 
GitLab


From 5977e6af322fd597c7e9a28d4686870a7e0ed539 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Feb 2019 02:54:48 +0100
Subject: [PATCH 062/192] Bump faker from 1.9.1 to 1.9.2 (#10020)

Bumps [faker](https://github.com/stympy/faker) from 1.9.1 to 1.9.2.
- [Release notes](https://github.com/stympy/faker/releases)
- [Changelog](https://github.com/stympy/faker/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stympy/faker/compare/v1.9.1...v1.9.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 30c7d31d95..d60eb1c141 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -205,7 +205,7 @@ GEM
       tzinfo
     excon (0.62.0)
     fabrication (2.20.1)
-    faker (1.9.1)
+    faker (1.9.2)
       i18n (>= 0.7)
     faraday (0.15.0)
       multipart-post (>= 1.2, < 3)
-- 
GitLab


From 3d374ed18be3efc78e48ccd512f7e44f38d2bc7c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Feb 2019 02:55:06 +0100
Subject: [PATCH 063/192] Bump bootsnap from 1.3.2 to 1.4.0 (#10022)

Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.3.2 to 1.4.0.
- [Release notes](https://github.com/Shopify/bootsnap/releases)
- [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Shopify/bootsnap/compare/v1.3.2...v1.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Gemfile b/Gemfile
index d924a546ba..e01d168b63 100644
--- a/Gemfile
+++ b/Gemfile
@@ -24,7 +24,7 @@ gem 'streamio-ffmpeg', '~> 3.0'
 
 gem 'active_model_serializers', '~> 0.10'
 gem 'addressable', '~> 2.6'
-gem 'bootsnap', '~> 1.3', require: false
+gem 'bootsnap', '~> 1.4', require: false
 gem 'browser'
 gem 'charlock_holmes', '~> 0.7.6'
 gem 'iso-639'
diff --git a/Gemfile.lock b/Gemfile.lock
index d60eb1c141..05622340b7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -98,7 +98,7 @@ GEM
       rack (>= 0.9.0)
     binding_of_caller (0.8.0)
       debug_inspector (>= 0.0.1)
-    bootsnap (1.3.2)
+    bootsnap (1.4.0)
       msgpack (~> 1.0)
     brakeman (4.4.0)
     browser (2.5.3)
@@ -345,7 +345,7 @@ GEM
     mini_mime (1.0.1)
     mini_portile2 (2.4.0)
     minitest (5.11.3)
-    msgpack (1.2.4)
+    msgpack (1.2.6)
     multi_json (1.13.1)
     multipart-post (2.0.0)
     necromancer (0.4.0)
@@ -660,7 +660,7 @@ DEPENDENCIES
   aws-sdk-s3 (~> 1.30)
   better_errors (~> 2.5)
   binding_of_caller (~> 0.7)
-  bootsnap (~> 1.3)
+  bootsnap (~> 1.4)
   brakeman (~> 4.4)
   browser
   bullet (~> 5.9)
-- 
GitLab


From c6e7b97baa37c23a4853619ad3ff706f41a15237 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 05:30:49 +0100
Subject: [PATCH 064/192] Fix color of static page links in high contrast theme
 (#10028)

---
 app/javascript/styles/contrast/diff.scss | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/javascript/styles/contrast/diff.scss b/app/javascript/styles/contrast/diff.scss
index 7d8993a508..8429103b8a 100644
--- a/app/javascript/styles/contrast/diff.scss
+++ b/app/javascript/styles/contrast/diff.scss
@@ -13,6 +13,10 @@
   }
 }
 
+.rich-formatting a,
+.rich-formatting p a,
+.rich-formatting li a,
+.landing-page__short-description p a,
 .status__content a,
 .reply-indicator__content a {
   color: lighten($ui-highlight-color, 12%);
-- 
GitLab


From 614ea184bb911a5b86804e05350997bafc605580 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Wed, 13 Feb 2019 07:29:57 +0100
Subject: [PATCH 065/192] [Glitch] Add "copy link" item to status action bars

Port 3cfadd875cc91b3fb893681ed7c2ef86148b3f85 to glitch-soc
---
 .../glitch/components/status_action_bar.js    | 22 +++++++++++++++++++
 .../features/status/components/action_bar.js  | 21 ++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 16abcab4e2..7fb84bd1e7 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -34,6 +34,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
 });
 
 const obfuscatedCount = count => {
@@ -148,6 +149,25 @@ export default class StatusActionBar extends ImmutablePureComponent {
     this.props.onMuteConversation(this.props.status);
   }
 
+  handleCopy = () => {
+    const url      = this.props.status.get('url');
+    const textarea = document.createElement('textarea');
+
+    textarea.textContent    = url;
+    textarea.style.position = 'fixed';
+
+    document.body.appendChild(textarea);
+
+    try {
+      textarea.select();
+      document.execCommand('copy');
+    } catch (e) {
+
+    } finally {
+      document.body.removeChild(textarea);
+    }
+  }
+
   render () {
     const { status, intl, withDismiss, showReplyCount } = this.props;
 
@@ -165,6 +185,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
     menu.push({ text: intl.formatMessage(messages.open), action: this.handleOpen });
 
     if (publicStatus) {
+      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
     }
 
@@ -189,6 +210,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
       menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });
       menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });
       menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });
+
       if (isStaff && (accountAdminLink || statusAdminLink)) {
         menu.push(null);
         if (accountAdminLink !== undefined) {
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index be82bca5b4..66cc10d787 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -29,6 +29,7 @@ const messages = defineMessages({
   embed: { id: 'status.embed', defaultMessage: 'Embed' },
   admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },
   admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },
+  copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },
 });
 
 @injectIntl
@@ -119,6 +120,25 @@ export default class ActionBar extends React.PureComponent {
     this.props.onEmbed(this.props.status);
   }
 
+  handleCopy = () => {
+    const url      = this.props.status.get('url');
+    const textarea = document.createElement('textarea');
+
+    textarea.textContent    = url;
+    textarea.style.position = 'fixed';
+
+    document.body.appendChild(textarea);
+
+    try {
+      textarea.select();
+      document.execCommand('copy');
+    } catch (e) {
+
+    } finally {
+      document.body.removeChild(textarea);
+    }
+  }
+
   render () {
     const { status, intl } = this.props;
 
@@ -128,6 +148,7 @@ export default class ActionBar extends React.PureComponent {
     let menu = [];
 
     if (publicStatus) {
+      menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });
       menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });
       menu.push(null);
     }
-- 
GitLab


From 98d1a1f117452a5e12d73eaf43a10f36e187402e Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 13 Feb 2019 18:33:03 +0100
Subject: [PATCH 066/192] Disable box shadows for featured hashtags in light
 theme (#10034)

Fixes #9990
---
 app/javascript/styles/mastodon-light/diff.scss | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/javascript/styles/mastodon-light/diff.scss b/app/javascript/styles/mastodon-light/diff.scss
index 78bc2dbb6d..de03cf1a66 100644
--- a/app/javascript/styles/mastodon-light/diff.scss
+++ b/app/javascript/styles/mastodon-light/diff.scss
@@ -352,6 +352,8 @@
 .moved-account-widget,
 .memoriam-widget,
 .activity-stream,
-.nothing-here {
+.nothing-here,
+.directory__tag > a,
+.directory__tag > div {
   box-shadow: none;
 }
-- 
GitLab


From 169b9d4428d8e54d7bee365fd76be9a6e2a92da5 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 18:34:58 +0100
Subject: [PATCH 067/192] Fix hashtags select styling in default and high
 contrast themes (#10029)

---
 .../components/column_settings.js             | 55 ++++++-----
 app/javascript/styles/mastodon/_mixins.scss   | 31 ++++++
 .../styles/mastodon/components.scss           | 95 +++++++++++++------
 3 files changed, 128 insertions(+), 53 deletions(-)

diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
index 9c9f62d821..cdc138c8bf 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/components/column_settings.js
@@ -1,10 +1,15 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import Toggle from 'react-toggle';
 import AsyncSelect from 'react-select/lib/Async';
 
+const messages = defineMessages({
+  placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
+  noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' },
+});
+
 export default @injectIntl
 class ColumnSettings extends React.PureComponent {
 
@@ -25,6 +30,7 @@ class ColumnSettings extends React.PureComponent {
 
   tags (mode) {
     let tags = this.props.settings.getIn(['tags', mode]) || [];
+
     if (tags.toJSON) {
       return tags.toJSON();
     } else {
@@ -32,33 +38,36 @@ class ColumnSettings extends React.PureComponent {
     }
   };
 
-  onSelect = (mode) => {
-    return (value) => {
-      this.props.onChange(['tags', mode], value);
-    };
-  };
+  onSelect = mode => value => this.props.onChange(['tags', mode], value);
 
   onToggle = () => {
     if (this.state.open && this.hasTags()) {
       this.props.onChange('tags', {});
     }
+
     this.setState({ open: !this.state.open });
   };
 
+  noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions);
+
   modeSelect (mode) {
     return (
-      <div className='column-settings__section'>
-        {this.modeLabel(mode)}
+      <div className='column-settings__row'>
+        <span className='column-settings__section'>
+          {this.modeLabel(mode)}
+        </span>
+
         <AsyncSelect
           isMulti
           autoFocus
           value={this.tags(mode)}
-          settings={this.props.settings}
-          settingPath={['tags', mode]}
           onChange={this.onSelect(mode)}
           loadOptions={this.props.onLoad}
-          classNamePrefix='column-settings__hashtag-select'
+          className='column-select__container'
+          classNamePrefix='column-select'
           name='tags'
+          placeholder={this.props.intl.formatMessage(messages.placeholder)}
+          noOptionsMessage={this.noOptionsMessage}
         />
       </div>
     );
@@ -66,11 +75,15 @@ class ColumnSettings extends React.PureComponent {
 
   modeLabel (mode) {
     switch(mode) {
-    case 'any':  return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;
-    case 'all':  return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;
-    case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;
+    case 'any':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;
+    case 'all':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;
+    case 'none':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;
+    default:
+      return '';
     }
-    return '';
   };
 
   render () {
@@ -78,23 +91,21 @@ class ColumnSettings extends React.PureComponent {
       <div>
         <div className='column-settings__row'>
           <div className='setting-toggle'>
-            <Toggle
-              id='hashtag.column_settings.tag_toggle'
-              onChange={this.onToggle}
-              checked={this.state.open}
-            />
+            <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} />
+
             <span className='setting-toggle__label'>
               <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />
             </span>
           </div>
         </div>
-        {this.state.open &&
+
+        {this.state.open && (
           <div className='column-settings__hashtags'>
             {this.modeSelect('any')}
             {this.modeSelect('all')}
             {this.modeSelect('none')}
           </div>
-        }
+        )}
       </div>
     );
   }
diff --git a/app/javascript/styles/mastodon/_mixins.scss b/app/javascript/styles/mastodon/_mixins.scss
index d5bafe6b6a..08806599e8 100644
--- a/app/javascript/styles/mastodon/_mixins.scss
+++ b/app/javascript/styles/mastodon/_mixins.scss
@@ -41,3 +41,34 @@
     font-size: 16px;
   }
 }
+
+@mixin search-popout() {
+  background: $simple-background-color;
+  border-radius: 4px;
+  padding: 10px 14px;
+  padding-bottom: 14px;
+  margin-top: 10px;
+  color: $light-text-color;
+  box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
+
+  h4 {
+    text-transform: uppercase;
+    color: $light-text-color;
+    font-size: 13px;
+    font-weight: 500;
+    margin-bottom: 10px;
+  }
+
+  li {
+    padding: 4px 0;
+  }
+
+  ul {
+    margin-bottom: 10px;
+  }
+
+  em {
+    font-weight: 500;
+    color: $inverted-text-color;
+  }
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 32fd773859..02bbd345a7 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -3056,14 +3056,41 @@ a.status-card.compact:hover {
   display: block;
   font-weight: 500;
   margin-bottom: 10px;
+}
+
+.column-settings__hashtags {
+  .column-settings__row {
+    margin-bottom: 15px;
+  }
 
-  .column-settings__hashtag-select {
+  .column-select {
     &__control {
       @include search-input();
     }
 
+    &__placeholder {
+      color: $dark-text-color;
+      padding-left: 2px;
+      font-size: 12px;
+    }
+
+    &__value-container {
+      padding-left: 6px;
+    }
+
     &__multi-value {
       background: lighten($ui-base-color, 8%);
+
+      &__remove {
+        cursor: pointer;
+
+        &:hover,
+        &:active,
+        &:focus {
+          background: lighten($ui-base-color, 12%);
+          color: lighten($darker-text-color, 4%);
+        }
+      }
     }
 
     &__multi-value__label,
@@ -3071,9 +3098,42 @@ a.status-card.compact:hover {
       color: $darker-text-color;
     }
 
-    &__indicator-separator,
+    &__clear-indicator,
     &__dropdown-indicator {
-      display: none;
+      cursor: pointer;
+      transition: none;
+      color: $dark-text-color;
+
+      &:hover,
+      &:active,
+      &:focus {
+        color: lighten($dark-text-color, 4%);
+      }
+    }
+
+    &__indicator-separator {
+      background-color: lighten($ui-base-color, 8%);
+    }
+
+    &__menu {
+      @include search-popout();
+      padding: 0;
+      background: $ui-secondary-color;
+    }
+
+    &__menu-list {
+      padding: 6px;
+    }
+
+    &__option {
+      color: $inverted-text-color;
+      border-radius: 4px;
+      font-size: 14px;
+
+      &--is-focused,
+      &--is-selected {
+        background: darken($ui-secondary-color, 10%);
+      }
     }
   }
 }
@@ -4867,34 +4927,7 @@ a.status-card.compact:hover {
 }
 
 .search-popout {
-  background: $simple-background-color;
-  border-radius: 4px;
-  padding: 10px 14px;
-  padding-bottom: 14px;
-  margin-top: 10px;
-  color: $light-text-color;
-  box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
-
-  h4 {
-    text-transform: uppercase;
-    color: $light-text-color;
-    font-size: 13px;
-    font-weight: 500;
-    margin-bottom: 10px;
-  }
-
-  li {
-    padding: 4px 0;
-  }
-
-  ul {
-    margin-bottom: 10px;
-  }
-
-  em {
-    font-weight: 500;
-    color: $inverted-text-color;
-  }
+  @include search-popout();
 }
 
 noscript {
-- 
GitLab


From 6a5307a5733e7872e7827f32b27111434e0307c4 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 13 Feb 2019 18:36:23 +0100
Subject: [PATCH 068/192] Alternative handling of private self-boosts (#9998)

* When self-boosting, embed original toot into Announce serialization

* Process unknown self-boosts from Announce object if it is more than an URI

* Add some self-boost specs

* Only serialize private toots in self-Announces
---
 app/lib/activitypub/activity.rb               | 32 +++++++++++
 app/lib/activitypub/activity/announce.rb      |  4 +-
 app/lib/activitypub/activity/create.rb        | 15 ------
 .../activitypub/activity_serializer.rb        |  8 ++-
 .../lib/activitypub/activity/announce_spec.rb | 53 ++++++++++++++++---
 5 files changed, 86 insertions(+), 26 deletions(-)

diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 919678618a..7e4e195313 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -4,6 +4,9 @@ class ActivityPub::Activity
   include JsonLdHelper
   include Redisable
 
+  SUPPORTED_TYPES = %w(Note).freeze
+  CONVERTED_TYPES = %w(Image Video Article Page).freeze
+
   def initialize(json, account, **options)
     @json    = json
     @account = account
@@ -71,6 +74,18 @@ class ActivityPub::Activity
     @object_uri ||= value_or_id(@object)
   end
 
+  def unsupported_object_type?
+    @object.is_a?(String) || !(supported_object_type? || converted_object_type?)
+  end
+
+  def supported_object_type?
+    equals_or_includes_any?(@object['type'], SUPPORTED_TYPES)
+  end
+
+  def converted_object_type?
+    equals_or_includes_any?(@object['type'], CONVERTED_TYPES)
+  end
+
   def distribute(status)
     crawl_links(status)
 
@@ -120,6 +135,23 @@ class ActivityPub::Activity
     redis.setex("delete_upon_arrival:#{@account.id}:#{uri}", 6.hours.seconds, uri)
   end
 
+  def status_from_object
+    # If the status is already known, return it
+    status = status_from_uri(object_uri)
+    return status unless status.nil?
+
+    # If the boosted toot is embedded and it is a self-boost, handle it like a Create
+    unless unsupported_object_type?
+      actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri
+      if actor_id == @account.uri
+        return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform
+      end
+    end
+
+    # If the status is not from the actor, try to fetch it
+    return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri
+  end
+
   def fetch_remote_original_status
     if object_uri.start_with?('http')
       return if ActivityPub::TagManager.instance.local_uri?(object_uri)
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 34d1b7cbd0..04afeea202 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -2,9 +2,7 @@
 
 class ActivityPub::Activity::Announce < ActivityPub::Activity
   def perform
-    original_status   = status_from_uri(object_uri)
-    original_status ||= fetch_remote_original_status
-
+    original_status = status_from_object
     return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status)
 
     status = Status.find_by(account: @account, reblog: original_status)
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index b49657d4b1..9a3db51dd9 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -1,9 +1,6 @@
 # frozen_string_literal: true
 
 class ActivityPub::Activity::Create < ActivityPub::Activity
-  SUPPORTED_TYPES = %w(Note).freeze
-  CONVERTED_TYPES = %w(Image Video Article Page).freeze
-
   def perform
     return if unsupported_object_type? || invalid_origin?(@object['id'])
     return if Tombstone.exists?(uri: @object['id'])
@@ -318,22 +315,10 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     @object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty?
   end
 
-  def unsupported_object_type?
-    @object.is_a?(String) || !(supported_object_type? || converted_object_type?)
-  end
-
   def unsupported_media_type?(mime_type)
     mime_type.present? && !(MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES).include?(mime_type)
   end
 
-  def supported_object_type?
-    equals_or_includes_any?(@object['type'], SUPPORTED_TYPES)
-  end
-
-  def converted_object_type?
-    equals_or_includes_any?(@object['type'], CONVERTED_TYPES)
-  end
-
   def skip_download?
     return @skip_download if defined?(@skip_download)
     @skip_download ||= DomainBlock.find_by(domain: @account.domain)&.reject_media?
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index 50c4f6a049..b51e8c5442 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -3,8 +3,8 @@
 class ActivityPub::ActivitySerializer < ActiveModel::Serializer
   attributes :id, :type, :actor, :published, :to, :cc
 
-  has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :announce?
-  attribute :proper_uri, key: :object, if: :announce?
+  has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :owned_announce?
+  attribute :proper_uri, key: :object, if: :owned_announce?
   attribute :atom_uri, if: :announce?
 
   def id
@@ -42,4 +42,8 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer
   def announce?
     object.reblog?
   end
+
+  def owned_announce?
+    announce? && object.account == object.proper.account && object.proper.private_visibility?
+  end
 end
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index 54dd52a604..1725c2843b 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -1,7 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe ActivityPub::Activity::Announce do
-  let(:sender)    { Fabricate(:account) }
+  let(:sender)    { Fabricate(:account, followers_url: 'http://example.com/followers') }
   let(:recipient) { Fabricate(:account) }
   let(:status)    { Fabricate(:status, account: recipient) }
 
@@ -11,19 +11,60 @@ RSpec.describe ActivityPub::Activity::Announce do
       id: 'foo',
       type: 'Announce',
       actor: ActivityPub::TagManager.instance.uri_for(sender),
-      object: ActivityPub::TagManager.instance.uri_for(status),
+      object: object_json,
     }.with_indifferent_access
   end
 
-  describe '#perform' do
-    subject { described_class.new(json, sender) }
+  subject { described_class.new(json, sender) }
+
+  before do
+    sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender))
+  end
 
+  describe '#perform' do
     before do
       subject.perform
     end
 
-    it 'creates a reblog by sender of status' do
-      expect(sender.reblogged?(status)).to be true
+    context 'a known status' do
+      let(:object_json) do
+        ActivityPub::TagManager.instance.uri_for(status)
+      end
+
+      it 'creates a reblog by sender of status' do
+        expect(sender.reblogged?(status)).to be true
+      end
+    end
+
+    context 'self-boost of a previously unknown status with missing attributedTo' do
+      let(:object_json) do
+        {
+          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+          type: 'Note',
+          content: 'Lorem ipsum',
+          to: 'http://example.com/followers',
+        }
+      end
+
+      it 'creates a reblog by sender of status' do
+        expect(sender.reblogged?(sender.statuses.first)).to be true
+      end
+    end
+
+    context 'self-boost of a previously unknown status with correct attributedTo' do
+      let(:object_json) do
+        {
+          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+          type: 'Note',
+          content: 'Lorem ipsum',
+          attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
+          to: 'http://example.com/followers',
+        }
+      end
+
+      it 'creates a reblog by sender of status' do
+        expect(sender.reblogged?(sender.statuses.first)).to be true
+      end
     end
   end
 end
-- 
GitLab


From 114cdc36aad7247ffa886674ae40021516d53420 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 18:36:40 +0100
Subject: [PATCH 069/192] Fix style regressions on landing page (#10030)

---
 app/javascript/styles/mastodon/about.scss | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index b6c92a09e7..b078d4d24d 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -49,15 +49,9 @@ $small-breakpoint: 960px;
     }
   }
 
+  strong,
   em {
-    display: inline;
-    margin: 0;
-    padding: 0;
     font-weight: 700;
-    background: transparent;
-    font-family: inherit;
-    font-size: inherit;
-    line-height: inherit;
     color: lighten($darker-text-color, 10%);
   }
 
@@ -796,7 +790,7 @@ $small-breakpoint: 960px;
       width: 100%;
       display: flex;
       flex-direction: row-reverse;
-      flex-wrap: wrap;
+      flex-wrap: nowrap;
       justify-content: space-between;
       align-items: center;
     }
@@ -846,14 +840,7 @@ $small-breakpoint: 960px;
     }
 
     strong {
-      display: inline;
-      margin: 0;
-      padding: 0;
-      font-weight: 700;
-      background: transparent;
-      font-family: inherit;
-      font-size: inherit;
-      line-height: inherit;
+      font-weight: 500;
       color: lighten($darker-text-color, 10%);
     }
 
-- 
GitLab


From 011b476d38663656988ae21ca29689aae01cb7c2 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 13 Feb 2019 18:37:27 +0100
Subject: [PATCH 070/192] Bump faker from 1.9.2 to 1.9.3 (#10031)

Bumps [faker](https://github.com/stympy/faker) from 1.9.2 to 1.9.3.
- [Release notes](https://github.com/stympy/faker/releases)
- [Changelog](https://github.com/stympy/faker/blob/master/CHANGELOG.md)
- [Commits](https://github.com/stympy/faker/compare/v1.9.2...v1.9.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 05622340b7..ee536f2ab6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -205,7 +205,7 @@ GEM
       tzinfo
     excon (0.62.0)
     fabrication (2.20.1)
-    faker (1.9.2)
+    faker (1.9.3)
       i18n (>= 0.7)
     faraday (0.15.0)
       multipart-post (>= 1.2, < 3)
-- 
GitLab


From dad339da6d19679f0361bfd49d9bcf3a3517af0c Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 18:42:47 +0100
Subject: [PATCH 071/192] Filter incoming Create activities by relation to
 local activity (#10005)

Reject those from accounts with no local followers, from relays
that are not enabled, which do not address local accounts and are
not replies to accounts that do have local followers
---
 app/lib/activitypub/activity/create.rb        | 34 +++++++++++++++++--
 .../activitypub/process_collection_service.rb |  1 +
 app/workers/activitypub/processing_worker.rb  |  2 +-
 3 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 9a3db51dd9..1b31768d96 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -2,8 +2,7 @@
 
 class ActivityPub::Activity::Create < ActivityPub::Activity
   def perform
-    return if unsupported_object_type? || invalid_origin?(@object['id'])
-    return if Tombstone.exists?(uri: @object['id'])
+    return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity?
 
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
@@ -337,6 +336,37 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     !replied_to_status.nil? && replied_to_status.account.local?
   end
 
+  def related_to_local_activity?
+    fetch? || followed_by_local_accounts? || requested_through_relay? ||
+      responds_to_followed_account? || addresses_local_accounts?
+  end
+
+  def fetch?
+    !@options[:delivery]
+  end
+
+  def followed_by_local_accounts?
+    @account.passive_relationships.exists?
+  end
+
+  def requested_through_relay?
+    @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled?
+  end
+
+  def responds_to_followed_account?
+    !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?)
+  end
+
+  def addresses_local_accounts?
+    return true if @options[:delivered_to_account_id]
+
+    local_usernames = (as_array(@object['to']) + as_array(@object['cc'])).uniq.select { |uri| ActivityPub::TagManager.instance.local_uri?(uri) }.map { |uri| ActivityPub::TagManager.instance.uri_to_local_id(uri, :username) }
+
+    return false if local_usernames.empty?
+
+    Account.local.where(username: local_usernames).exists?
+  end
+
   def forward_for_reply
     return unless @json['signature'].present? && reply_to_local?
     ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url])
diff --git a/app/services/activitypub/process_collection_service.rb b/app/services/activitypub/process_collection_service.rb
index 5c54aad89f..881df478bf 100644
--- a/app/services/activitypub/process_collection_service.rb
+++ b/app/services/activitypub/process_collection_service.rb
@@ -44,6 +44,7 @@ class ActivityPub::ProcessCollectionService < BaseService
   end
 
   def verify_account!
+    @options[:relayed_through_account] = @account
     @account = ActivityPub::LinkedDataSignature.new(@json).verify_account!
   rescue JSON::LD::JsonLdError => e
     Rails.logger.debug "Could not verify LD-Signature for #{value_or_id(@json['actor'])}: #{e.message}"
diff --git a/app/workers/activitypub/processing_worker.rb b/app/workers/activitypub/processing_worker.rb
index a8a3ebf0f5..a3abe72cf6 100644
--- a/app/workers/activitypub/processing_worker.rb
+++ b/app/workers/activitypub/processing_worker.rb
@@ -6,6 +6,6 @@ class ActivityPub::ProcessingWorker
   sidekiq_options backtrace: true
 
   def perform(account_id, body, delivered_to_account_id = nil)
-    ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id)
+    ActivityPub::ProcessCollectionService.new.call(body, Account.find(account_id), override_timestamps: true, delivered_to_account_id: delivered_to_account_id, delivery: true)
   end
 end
-- 
GitLab


From 188f1c7c89d6fc7349302a9680bac9a82515cb90 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 13 Feb 2019 18:52:02 +0100
Subject: [PATCH 072/192] Add list title editing (#9748)

* Add list title editing

Port changes made by ash for glitch-soc

* Code style fixes
---
 .../list_editor/components/edit_list_form.js  | 70 +++++++++++++++++++
 .../mastodon/features/list_editor/index.js    |  7 +-
 .../mastodon/reducers/list_editor.js          | 11 ++-
 .../styles/mastodon/components.scss           |  2 +-
 4 files changed, 83 insertions(+), 7 deletions(-)
 create mode 100644 app/javascript/mastodon/features/list_editor/components/edit_list_form.js

diff --git a/app/javascript/mastodon/features/list_editor/components/edit_list_form.js b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js
new file mode 100644
index 0000000000..3dc59c12e7
--- /dev/null
+++ b/app/javascript/mastodon/features/list_editor/components/edit_list_form.js
@@ -0,0 +1,70 @@
+import React from 'react';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
+import { changeListEditorTitle, submitListEditor } from '../../../actions/lists';
+import IconButton from '../../../components/icon_button';
+import { defineMessages, injectIntl } from 'react-intl';
+
+const messages = defineMessages({
+  title: { id: 'lists.edit.submit', defaultMessage: 'Change title' },
+});
+
+const mapStateToProps = state => ({
+  value: state.getIn(['listEditor', 'title']),
+  disabled: !state.getIn(['listEditor', 'isChanged']),
+});
+
+const mapDispatchToProps = dispatch => ({
+  onChange: value => dispatch(changeListEditorTitle(value)),
+  onSubmit: () => dispatch(submitListEditor(false)),
+});
+
+export default @connect(mapStateToProps, mapDispatchToProps)
+@injectIntl
+class ListForm extends React.PureComponent {
+
+  static propTypes = {
+    value: PropTypes.string.isRequired,
+    disabled: PropTypes.bool,
+    intl: PropTypes.object.isRequired,
+    onChange: PropTypes.func.isRequired,
+    onSubmit: PropTypes.func.isRequired,
+  };
+
+  handleChange = e => {
+    this.props.onChange(e.target.value);
+  }
+
+  handleSubmit = e => {
+    e.preventDefault();
+    this.props.onSubmit();
+  }
+
+  handleClick = () => {
+    this.props.onSubmit();
+  }
+
+  render () {
+    const { value, disabled, intl } = this.props;
+
+    const title = intl.formatMessage(messages.title);
+
+    return (
+      <form className='column-inline-form' onSubmit={this.handleSubmit}>
+        <input
+          className='setting-text'
+          value={value}
+          onChange={this.handleChange}
+        />
+
+        <IconButton
+          disabled={disabled}
+          icon='check'
+          title={title}
+          onClick={this.handleClick}
+        />
+      </form>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/list_editor/index.js b/app/javascript/mastodon/features/list_editor/index.js
index aab0cdd0c0..48466604a7 100644
--- a/app/javascript/mastodon/features/list_editor/index.js
+++ b/app/javascript/mastodon/features/list_editor/index.js
@@ -7,11 +7,11 @@ import { injectIntl } from 'react-intl';
 import { setupListEditor, clearListSuggestions, resetListEditor } from '../../actions/lists';
 import Account from './components/account';
 import Search from './components/search';
+import EditListForm from './components/edit_list_form';
 import Motion from '../ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 
 const mapStateToProps = state => ({
-  title: state.getIn(['listEditor', 'title']),
   accountIds: state.getIn(['listEditor', 'accounts', 'items']),
   searchAccountIds: state.getIn(['listEditor', 'suggestions', 'items']),
 });
@@ -33,7 +33,6 @@ class ListEditor extends ImmutablePureComponent {
     onInitialize: PropTypes.func.isRequired,
     onClear: PropTypes.func.isRequired,
     onReset: PropTypes.func.isRequired,
-    title: PropTypes.string.isRequired,
     accountIds: ImmutablePropTypes.list.isRequired,
     searchAccountIds: ImmutablePropTypes.list.isRequired,
   };
@@ -49,12 +48,12 @@ class ListEditor extends ImmutablePureComponent {
   }
 
   render () {
-    const { title, accountIds, searchAccountIds, onClear } = this.props;
+    const { accountIds, searchAccountIds, onClear } = this.props;
     const showSearch = searchAccountIds.size > 0;
 
     return (
       <div className='modal-root__modal list-editor'>
-        <h4>{title}</h4>
+        <EditListForm />
 
         <Search />
 
diff --git a/app/javascript/mastodon/reducers/list_editor.js b/app/javascript/mastodon/reducers/list_editor.js
index 02a0dabb14..91e524dd55 100644
--- a/app/javascript/mastodon/reducers/list_editor.js
+++ b/app/javascript/mastodon/reducers/list_editor.js
@@ -22,6 +22,7 @@ import {
 const initialState = ImmutableMap({
   listId: null,
   isSubmitting: false,
+  isChanged: false,
   title: '',
 
   accounts: ImmutableMap({
@@ -47,10 +48,16 @@ export default function listEditorReducer(state = initialState, action) {
       map.set('isSubmitting', false);
     });
   case LIST_EDITOR_TITLE_CHANGE:
-    return state.set('title', action.value);
+    return state.withMutations(map => {
+      map.set('title', action.value);
+      map.set('isChanged', true);
+    });
   case LIST_CREATE_REQUEST:
   case LIST_UPDATE_REQUEST:
-    return state.set('isSubmitting', true);
+    return state.withMutations(map => {
+      map.set('isSubmitting', true);
+      map.set('isChanged', false);
+    });
   case LIST_CREATE_FAIL:
   case LIST_UPDATE_FAIL:
     return state.set('isSubmitting', false);
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 02bbd345a7..8533e4eb5b 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -5163,7 +5163,7 @@ noscript {
 
   .icon-button {
     flex: 0 0 auto;
-    margin-left: 5px;
+    margin: 0 5px;
   }
 }
 
-- 
GitLab


From 658b4621a622364d8daf699a7e46c65f3f63486b Mon Sep 17 00:00:00 2001
From: Nolan Lawson <nolan@nolanlawson.com>
Date: Wed, 13 Feb 2019 09:52:36 -0800
Subject: [PATCH 073/192] perf: run node directly when streaming (#10032)

---
 dist/mastodon-streaming.service | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dist/mastodon-streaming.service b/dist/mastodon-streaming.service
index 5d7c129dfb..c324fccf46 100644
--- a/dist/mastodon-streaming.service
+++ b/dist/mastodon-streaming.service
@@ -9,7 +9,7 @@ WorkingDirectory=/home/mastodon/live
 Environment="NODE_ENV=production"
 Environment="PORT=4000"
 Environment="STREAMING_CLUSTER_NUM=1"
-ExecStart=/usr/bin/npm run start
+ExecStart=/usr/bin/node ./streaming
 TimeoutSec=15
 Restart=always
 
-- 
GitLab


From 7750416597e4d172b1d4751215aac2a50cf528e3 Mon Sep 17 00:00:00 2001
From: Aditoo17 <42938951+Aditoo17@users.noreply.github.com>
Date: Wed, 13 Feb 2019 17:53:01 +0000
Subject: [PATCH 074/192] I18n: Update Czech pluralization and fix some
 language names (#10015)

* I18n: Update Czech pluralization

* I18n: Fix some language names

* I18n: Fix some language names
---
 app/helpers/settings_helper.rb | 12 ++++++------
 config/locales/cs.yml          |  6 +++---
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index 7a3ceca786..e868b45c01 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -4,7 +4,7 @@ module SettingsHelper
   HUMAN_LOCALES = {
     en: 'English',
     ar: 'العربية',
-    ast: 'l\'asturianu',
+    ast: 'Asturianu',
     bg: 'Български',
     ca: 'Català',
     co: 'Corsu',
@@ -30,16 +30,16 @@ module SettingsHelper
     ja: '日本語',
     ka: 'ქართული',
     ko: '한국어',
-    lv: 'Latviešu valoda',
+    lv: 'Latviešu',
     ml: 'മലയാളം',
-    ms: 'بهاس ملايو',
+    ms: 'Bahasa Melayu',
     nl: 'Nederlands',
     no: 'Norsk',
     oc: 'Occitan',
-    pl: 'Polszczyzna',
+    pl: 'Polski',
     pt: 'Português',
     'pt-BR': 'Português do Brasil',
-    ro: 'Limba română',
+    ro: 'Română',
     ru: 'Русский',
     sk: 'Slovenčina',
     sl: 'Slovenščina',
@@ -49,7 +49,7 @@ module SettingsHelper
     sv: 'Svenska',
     ta: 'தமிழ்',
     te: 'తెలుగు',
-    th: 'ภาษาไทย',
+    th: 'ไทย',
     tr: 'Türkçe',
     uk: 'Українська',
     zh: '中文',
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index d1f11261cc..c75d0b643c 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -46,7 +46,7 @@ cs:
     choices_html: 'Volby uživatele %{name}:'
     follow: Sledovat
     followers:
-      few: Sledovatelé
+      few: Sledující
       one: Sledující
       other: Sledujících
     following: Sledovaných
@@ -618,7 +618,7 @@ cs:
     lock_link: Zamkněte svůj účet
     purge: Odstranit ze sledujících
     success:
-      few: V průběhu blokování sledovatelů ze %{count} domén...
+      few: V průběhu blokování sledujících ze %{count} domén...
       one: V průběhu blokování sledujících z jedné domény...
       other: V průběhu blokování sledujících z %{count} domén...
     true_privacy_html: Berte prosím na vědomí, že <strong>skutečného soukromí se dá dosáhnout pouze za pomoci end-to-end šifrování</strong>.
@@ -688,7 +688,7 @@ cs:
       body: Zde najdete stručný souhrn zpráv, které jste zmeškal/a od vaší poslední návštěvy %{since}
       mention: "%{name} vás zmínil/a v:"
       new_followers_summary:
-        few: Navíc jste získal/a %{count} nové sledovatele, zatímco jste byl/a pryč! Skvělé!
+        few: Navíc jste získal/a %{count} nové sledující, zatímco jste byl/a pryč! Skvělé!
         one: Navíc jste získal/a jednoho nového sledujícího, zatímco jste byl/a pryč! Hurá!
         other: Navíc jste získal/a %{count} nových sledujících, zatímco jste byl/a pryč! Úžasné!
       subject:
-- 
GitLab


From 80161f43510ad9316c60c9b50dd5c09c2dae4d54 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 21:28:18 +0100
Subject: [PATCH 075/192] Change robots.txt to exclude some URLs (#10037)

- Exclude static assets
- Exclude uploaded files
- Exclude alternate versions of the profile page
- Exclude media proxy URLs
---
 public/robots.txt | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/public/robots.txt b/public/robots.txt
index 3c9c7c01f3..36afc85eff 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,5 +1,13 @@
-# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
-#
-# To ban all spiders from the entire site uncomment the next two lines:
-# User-agent: *
-# Disallow: /
+User-Agent: *
+Disallow: /users/*/followers
+Disallow: /users/*/following
+Disallow: /@*/media
+Disallow: /@*/with_replies
+Disallow: /@*/tagged/*
+Disallow: /media_proxy/*
+Disallow: /emoji/*
+Disallow: /packs/*
+Disallow: /sounds/*
+Disallow: /system/*
+Disallow: /avatars/*
+Disallow: /headers/*
-- 
GitLab


From 309043b158f5a4187b6f603f346ed17ee6ddb190 Mon Sep 17 00:00:00 2001
From: Ben Lubar <ben.lubar+github@gmail.com>
Date: Wed, 13 Feb 2019 18:04:43 -0600
Subject: [PATCH 076/192] Improve image description user experience (#10036)

* Add image descriptions to searchable post content.

* Allow multi-line image descriptions.

* Request image descriptions in the same query as posts when creating the search index.

(see https://github.com/tootsuite/mastodon/pull/10036#discussion_r256551624)
---
 app/chewy/statuses_index.rb                                   | 4 ++--
 app/javascript/mastodon/features/compose/components/upload.js | 3 +--
 app/javascript/styles/mastodon/components.scss                | 2 +-
 3 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index d3104172c4..eafc1818b8 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -31,7 +31,7 @@ class StatusesIndex < Chewy::Index
     },
   }
 
-  define_type ::Status.unscoped.without_reblogs do
+  define_type ::Status.unscoped.without_reblogs.includes(:media_attachments) do
     crutch :mentions do |collection|
       data = ::Mention.where(status_id: collection.map(&:id)).pluck(:status_id, :account_id)
       data.each.with_object({}) { |(id, name), result| (result[id] ||= []).push(name) }
@@ -50,7 +50,7 @@ class StatusesIndex < Chewy::Index
     root date_detection: false do
       field :account_id, type: 'long'
 
-      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].join("\n\n") } do
+      field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
         field :stemmed, type: 'text', analyzer: 'content'
       end
 
diff --git a/app/javascript/mastodon/features/compose/components/upload.js b/app/javascript/mastodon/features/compose/components/upload.js
index 038d7ee28a..629cbc36ac 100644
--- a/app/javascript/mastodon/features/compose/components/upload.js
+++ b/app/javascript/mastodon/features/compose/components/upload.js
@@ -108,9 +108,8 @@ class Upload extends ImmutablePureComponent {
                 <label>
                   <span style={{ display: 'none' }}>{intl.formatMessage(messages.description)}</span>
 
-                  <input
+                  <textarea
                     placeholder={intl.formatMessage(messages.description)}
-                    type='text'
                     value={description}
                     maxLength={420}
                     onFocus={this.handleInputFocus}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 8533e4eb5b..d88557559e 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -476,7 +476,7 @@
         opacity: 0;
         transition: opacity .1s ease;
 
-        input {
+        textarea {
           background: transparent;
           color: $secondary-text-color;
           border: 0;
-- 
GitLab


From a5992e58832fdc0199f70ed2fa791a619fcad258 Mon Sep 17 00:00:00 2001
From: nightpool <nightpool@users.noreply.github.com>
Date: Wed, 13 Feb 2019 21:11:47 -0500
Subject: [PATCH 077/192] Change robots.txt to exclude only media proxy URLs
 (#10038)

* Revert "Change robots.txt to exclude some URLs (#10037)"

This reverts commit 80161f43510ad9316c60c9b50dd5c09c2dae4d54.

* Let's block media_proxy

/media_proxy/ is a dynamic route used for requesting uncached media, so it's
probably bad to let crawlers use it

* misleading comment
---
 public/robots.txt | 17 ++++-------------
 1 file changed, 4 insertions(+), 13 deletions(-)

diff --git a/public/robots.txt b/public/robots.txt
index 36afc85eff..d93648beee 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -1,13 +1,4 @@
-User-Agent: *
-Disallow: /users/*/followers
-Disallow: /users/*/following
-Disallow: /@*/media
-Disallow: /@*/with_replies
-Disallow: /@*/tagged/*
-Disallow: /media_proxy/*
-Disallow: /emoji/*
-Disallow: /packs/*
-Disallow: /sounds/*
-Disallow: /system/*
-Disallow: /avatars/*
-Disallow: /headers/*
+# See http://www.robotstxt.org/robotstxt.html for documentation on how to use the robots.txt file
+
+User-agent: *
+Disallow: /media_proxy/
-- 
GitLab


From 99fa1ce93d02ef4ee8bde9311f4cc56a64fe35f4 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Thu, 14 Feb 2019 06:27:54 +0100
Subject: [PATCH 078/192] Add tight rate-limit for API deletions (#10042)

Deletions take a lot of resources to execute and cause a lot of
federation traffic, so it makes sense to decrease the number
someone can queue up through the API.

30 per 30 minutes
---
 config/initializers/rack_attack.rb | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/config/initializers/rack_attack.rb b/config/initializers/rack_attack.rb
index 35302e37b1..28201cc64c 100644
--- a/config/initializers/rack_attack.rb
+++ b/config/initializers/rack_attack.rb
@@ -46,14 +46,14 @@ class Rack::Attack
   end
 
   throttle('throttle_authenticated_api', limit: 300, period: 5.minutes) do |req|
-    req.api_request? && req.authenticated_user_id
+    req.authenticated_user_id if req.api_request?
   end
 
   throttle('throttle_unauthenticated_api', limit: 7_500, period: 5.minutes) do |req|
     req.ip if req.api_request?
   end
 
-  throttle('throttle_media', limit: 30, period: 30.minutes) do |req|
+  throttle('throttle_api_media', limit: 30, period: 30.minutes) do |req|
     req.authenticated_user_id if req.post? && req.path.start_with?('/api/v1/media')
   end
 
@@ -61,6 +61,13 @@ class Rack::Attack
     req.ip if req.post? && req.path == '/api/v1/accounts'
   end
 
+  API_DELETE_REBLOG_REGEX = /\A\/api\/v1\/statuses\/[\d]+\/unreblog/.freeze
+  API_DELETE_STATUS_REGEX = /\A\/api\/v1\/statuses\/[\d]+/.freeze
+
+  throttle('throttle_api_delete', limit: 30, period: 30.minutes) do |req|
+    req.authenticated_user_id if (req.post? && req.path =~ API_DELETE_REBLOG_REGEX) || (req.delete? && req.path =~ API_DELETE_STATUS_REGEX)
+  end
+
   throttle('protected_paths', limit: 25, period: 5.minutes) do |req|
     req.ip if req.post? && req.path =~ PROTECTED_PATHS_REGEX
   end
-- 
GitLab


From aa832198750f99303b1555f412e5405954863a63 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Thu, 14 Feb 2019 15:46:42 +0100
Subject: [PATCH 079/192] Fix hashtag column not subscribing to stream on mount
 (#10040)

Fix #9895
---
 .../mastodon/features/hashtag_timeline/index.js | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/app/javascript/mastodon/features/hashtag_timeline/index.js b/app/javascript/mastodon/features/hashtag_timeline/index.js
index c2e026d136..0d3c97a648 100644
--- a/app/javascript/mastodon/features/hashtag_timeline/index.js
+++ b/app/javascript/mastodon/features/hashtag_timeline/index.js
@@ -41,15 +41,19 @@ class HashtagTimeline extends React.PureComponent {
 
   title = () => {
     let title = [this.props.params.id];
+
     if (this.additionalFor('any')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);
+      title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);
     }
+
     if (this.additionalFor('all')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);
+      title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);
     }
+
     if (this.additionalFor('none')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);
+      title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);
     }
+
     return title;
   }
 
@@ -77,9 +81,10 @@ class HashtagTimeline extends React.PureComponent {
     let all  = (tags.all || []).map(tag => tag.value);
     let none = (tags.none || []).map(tag => tag.value);
 
-    [id, ...any].map((tag) => {
-      this.disconnects.push(dispatch(connectHashtagStream(id, tag, (status) => {
+    [id, ...any].map(tag => {
+      this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => {
         let tags = status.tags.map(tag => tag.name);
+
         return all.filter(tag => tags.includes(tag)).length === all.length &&
                none.filter(tag => tags.includes(tag)).length === 0;
       })));
@@ -95,12 +100,14 @@ class HashtagTimeline extends React.PureComponent {
     const { dispatch } = this.props;
     const { id, tags } = this.props.params;
 
+    this._subscribe(dispatch, id, tags);
     dispatch(expandHashtagTimeline(id, { tags }));
   }
 
   componentWillReceiveProps (nextProps) {
     const { dispatch, params } = this.props;
     const { id, tags } = nextProps.params;
+
     if (id !== params.id || !isEqual(tags, params.tags)) {
       this._unsubscribe();
       this._subscribe(dispatch, id, tags);
-- 
GitLab


From f9a338b473e181dd725f9185d09394624088efac Mon Sep 17 00:00:00 2001
From: rinsuki <428rinsuki+git@gmail.com>
Date: Fri, 15 Feb 2019 01:03:01 +0900
Subject: [PATCH 080/192] Fix breaks when opening a reply tree in WebUI
 (#10046)

fix #10045
---
 app/javascript/mastodon/components/status.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 386404b574..3e98d374b8 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -86,7 +86,7 @@ class Status extends ImmutablePureComponent {
 
   // Track height changes we know about to compensate scrolling
   componentDidMount () {
-    this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status.get('card');
+    this.didShowCard = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card');
   }
 
   getSnapshotBeforeUpdate () {
@@ -99,7 +99,7 @@ class Status extends ImmutablePureComponent {
 
   // Compensate height changes
   componentDidUpdate (prevProps, prevState, snapshot) {
-    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card');
+    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card');
     if (doShowCard && !this.didShowCard) {
       this.didShowCard = true;
       if (snapshot !== null && this.props.updateScrollBottom) {
-- 
GitLab


From 57c2fc8454b84de3b9be49e5f614c9d0df48cbdc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Fri, 15 Feb 2019 15:38:29 +0100
Subject: [PATCH 081/192] Bump better_errors from 2.5.0 to 2.5.1 (#10050)

Bumps [better_errors](https://github.com/BetterErrors/better_errors) from 2.5.0 to 2.5.1.
- [Release notes](https://github.com/BetterErrors/better_errors/releases)
- [Changelog](https://github.com/BetterErrors/better_errors/blob/master/CHANGELOG.md)
- [Commits](https://github.com/BetterErrors/better_errors/compare/v2.5.0...v2.5.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index ee536f2ab6..1e4f085a9a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -92,7 +92,7 @@ GEM
     aws-sigv4 (1.0.3)
     bcrypt (3.1.12)
     benchmark-ips (2.7.2)
-    better_errors (2.5.0)
+    better_errors (2.5.1)
       coderay (>= 1.0.0)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
-- 
GitLab


From b01f26ffbd7cf1ca42a6a16798c1f10e56a8e82e Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 15 Feb 2019 16:08:48 +0100
Subject: [PATCH 082/192] Change conversations to always show names of other
 participants (#10047)

Fix #9190
---
 .../mastodon/components/display_name.js       | 22 ++++++++++++++-----
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js
index acddf77c54..32809778ae 100644
--- a/app/javascript/mastodon/components/display_name.js
+++ b/app/javascript/mastodon/components/display_name.js
@@ -11,26 +11,36 @@ export default class DisplayName extends React.PureComponent {
   };
 
   render () {
-    const { account, others, localDomain } = this.props;
-    const displayNameHtml = { __html: account.get('display_name_html') };
+    const { others, localDomain } = this.props;
 
-    let suffix;
+    let displayName, suffix, account;
 
     if (others && others.size > 1) {
-      suffix = `+${others.size}`;
+      displayName = others.take(2).map(a => <bdi key={a.get('id')}><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: a.get('display_name_html') }} /></bdi>).reduce((prev, cur) => [prev, ', ', cur]);
+
+      if (others.size - 2 > 0) {
+        suffix = `+${others.size - 2}`;
+      }
     } else {
+      if (others) {
+        account = others.first();
+      } else {
+        account = this.props.account;
+      }
+
       let acct = account.get('acct');
 
       if (acct.indexOf('@') === -1 && localDomain) {
         acct = `${acct}@${localDomain}`;
       }
 
-      suffix = <span className='display-name__account'>@{acct}</span>;
+      displayName = <bdi><strong className='display-name__html' dangerouslySetInnerHTML={{ __html: account.get('display_name_html') }} /></bdi>;
+      suffix      = <span className='display-name__account'>@{acct}</span>;
     }
 
     return (
       <span className='display-name'>
-        <bdi><strong className='display-name__html' dangerouslySetInnerHTML={displayNameHtml} /></bdi> {suffix}
+        {displayName} {suffix}
       </span>
     );
   }
-- 
GitLab


From 8ef50706a11e115e8b4aa31b30de93738bc7e754 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 15 Feb 2019 16:08:59 +0100
Subject: [PATCH 083/192] Fix relay enabling/disabling not resetting inbox
 availability status (#10048)

Fix #10033
---
 app/models/relay.rb | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/models/relay.rb b/app/models/relay.rb
index 7478c110d4..6934a5c628 100644
--- a/app/models/relay.rb
+++ b/app/models/relay.rb
@@ -29,6 +29,7 @@ class Relay < ApplicationRecord
     payload     = Oj.dump(follow_activity(activity_id))
 
     update!(state: :pending, follow_activity_id: activity_id)
+    DeliveryFailureTracker.new(inbox_url).track_success!
     ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
   end
 
@@ -37,6 +38,7 @@ class Relay < ApplicationRecord
     payload     = Oj.dump(unfollow_activity(activity_id))
 
     update!(state: :idle, follow_activity_id: nil)
+    DeliveryFailureTracker.new(inbox_url).track_success!
     ActivityPub::DeliveryWorker.perform_async(payload, some_local_account.id, inbox_url)
   end
 
-- 
GitLab


From 2769b5446681898e8332cb505f499dac2a6e5717 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Fri, 15 Feb 2019 17:13:32 +0100
Subject: [PATCH 084/192] [Glitch] Fix occasional crash in detailed toot view

Port f9a338b473e181dd725f9185d09394624088efac to glitch-soc
---
 app/javascript/flavours/glitch/components/status.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 51fee0eec5..349f9c6cc4 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -217,7 +217,7 @@ export default class Status extends ImmutablePureComponent {
       this.setState({ autoCollapsed: true });
     }
 
-    this.didShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
+    this.didShowCard  = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
   }
 
   getSnapshotBeforeUpdate (prevProps, prevState) {
@@ -230,7 +230,7 @@ export default class Status extends ImmutablePureComponent {
 
   //  Hack to fix timeline jumps on second rendering when auto-collapsing
   componentDidUpdate (prevProps, prevState, snapshot) {
-    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
+    const doShowCard  = !this.props.muted && !this.props.hidden && this.props.status && this.props.status.get('card') && this.props.settings.get('inline_preview_cards');
     if (this.state.autoCollapsed || (doShowCard && !this.didShowCard)) {
       if (doShowCard) this.didShowCard = true;
       if (this.state.autoCollapsed) this.setState({ autoCollapsed: false });
-- 
GitLab


From 4dcb04b888dafd9745829f9e4f5665c84523fe5c Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 05:30:49 +0100
Subject: [PATCH 085/192] Fix color of static page links in high contrast theme
 (#10028)

---
 app/javascript/flavours/glitch/styles/contrast/diff.scss | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/javascript/flavours/glitch/styles/contrast/diff.scss b/app/javascript/flavours/glitch/styles/contrast/diff.scss
index 7d8993a508..8429103b8a 100644
--- a/app/javascript/flavours/glitch/styles/contrast/diff.scss
+++ b/app/javascript/flavours/glitch/styles/contrast/diff.scss
@@ -13,6 +13,10 @@
   }
 }
 
+.rich-formatting a,
+.rich-formatting p a,
+.rich-formatting li a,
+.landing-page__short-description p a,
 .status__content a,
 .reply-indicator__content a {
   color: lighten($ui-highlight-color, 12%);
-- 
GitLab


From c417e8c198238f80396c0e4e89c2653e4217108a Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 15 Feb 2019 18:19:45 +0100
Subject: [PATCH 086/192] Filter incoming Announce activities by relation to
 local activity (#10041)

* Filter incoming Announce activities by relation to local activity

Reject if announcer is not followed by local accounts, and is not
from an enabled relay, and the object is not a local status

Follow-up to #10005

* Fix tests
---
 app/lib/activitypub/activity.rb                | 14 ++++++++++++++
 app/lib/activitypub/activity/announce.rb       | 11 ++++++++++-
 app/lib/activitypub/activity/create.rb         | 12 ------------
 spec/lib/activitypub/activity/announce_spec.rb |  1 +
 4 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 7e4e195313..3cf38764a9 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -138,11 +138,13 @@ class ActivityPub::Activity
   def status_from_object
     # If the status is already known, return it
     status = status_from_uri(object_uri)
+
     return status unless status.nil?
 
     # If the boosted toot is embedded and it is a self-boost, handle it like a Create
     unless unsupported_object_type?
       actor_id = value_or_id(first_of_value(@object['attributedTo'])) || @account.uri
+
       if actor_id == @account.uri
         return ActivityPub::Activity.factory({ 'type' => 'Create', 'actor' => actor_id, 'object' => @object }, @account).perform
       end
@@ -166,4 +168,16 @@ class ActivityPub::Activity
   ensure
     redis.del(key)
   end
+
+  def fetch?
+    !@options[:delivery]
+  end
+
+  def followed_by_local_accounts?
+    @account.passive_relationships.exists?
+  end
+
+  def requested_through_relay?
+    @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled?
+  end
 end
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 04afeea202..28a1cda024 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -3,7 +3,8 @@
 class ActivityPub::Activity::Announce < ActivityPub::Activity
   def perform
     original_status = status_from_object
-    return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status)
+
+    return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity?
 
     status = Status.find_by(account: @account, reblog: original_status)
 
@@ -39,4 +40,12 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity
   def announceable?(status)
     status.account_id == @account.id || status.public_visibility? || status.unlisted_visibility?
   end
+
+  def related_to_local_activity?
+    followed_by_local_accounts? || requested_through_relay? || reblog_of_local_status?
+  end
+
+  def reblog_of_local_status?
+    status_from_uri(object_uri)&.account&.local?
+  end
 end
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 1b31768d96..4fc37fb4b5 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -341,18 +341,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
       responds_to_followed_account? || addresses_local_accounts?
   end
 
-  def fetch?
-    !@options[:delivery]
-  end
-
-  def followed_by_local_accounts?
-    @account.passive_relationships.exists?
-  end
-
-  def requested_through_relay?
-    @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled?
-  end
-
   def responds_to_followed_account?
     !replied_to_status.nil? && (replied_to_status.account.local? || replied_to_status.account.passive_relationships.exists?)
   end
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index 1725c2843b..5e6f008ec0 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -18,6 +18,7 @@ RSpec.describe ActivityPub::Activity::Announce do
   subject { described_class.new(json, sender) }
 
   before do
+    Fabricate(:account).follow!(sender)
     sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender))
   end
 
-- 
GitLab


From a151c5566a9268930b4b4728121f8f1692019238 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Fri, 15 Feb 2019 18:21:00 +0100
Subject: [PATCH 087/192] [Glitch] Fix hashtags select styling in default and
 high contrast skins

Port 169b9d4428d8e54d7bee365fd76be9a6e2a92da5 to glitch-soc
---
 .../components/column_settings.js             | 55 +++++++++-------
 .../flavours/glitch/styles/_mixins.scss       | 31 +++++++++
 .../glitch/styles/components/accounts.scss    | 66 ++++++++++++++++++-
 .../glitch/styles/components/drawer.scss      | 24 +------
 4 files changed, 128 insertions(+), 48 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
index 82936c8380..dc0ffee85f 100644
--- a/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
+++ b/app/javascript/flavours/glitch/features/hashtag_timeline/components/column_settings.js
@@ -1,10 +1,15 @@
 import React from 'react';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
-import { injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
 import Toggle from 'react-toggle';
 import AsyncSelect from 'react-select/lib/Async';
 
+const messages = defineMessages({
+  placeholder: { id: 'hashtag.column_settings.select.placeholder', defaultMessage: 'Enter hashtags…' },
+  noOptions: { id: 'hashtag.column_settings.select.no_options_message', defaultMessage: 'No suggestions found' },
+});
+
 @injectIntl
 export default class ColumnSettings extends React.PureComponent {
 
@@ -25,6 +30,7 @@ export default class ColumnSettings extends React.PureComponent {
 
   tags (mode) {
     let tags = this.props.settings.getIn(['tags', mode]) || [];
+
     if (tags.toJSON) {
       return tags.toJSON();
     } else {
@@ -32,33 +38,36 @@ export default class ColumnSettings extends React.PureComponent {
     }
   };
 
-  onSelect = (mode) => {
-    return (value) => {
-      this.props.onChange(['tags', mode], value);
-    };
-  };
+  onSelect = mode => value => this.props.onChange(['tags', mode], value);
 
   onToggle = () => {
     if (this.state.open && this.hasTags()) {
       this.props.onChange('tags', {});
     }
+
     this.setState({ open: !this.state.open });
   };
 
+  noOptionsMessage = () => this.props.intl.formatMessage(messages.noOptions);
+
   modeSelect (mode) {
     return (
-      <div className='column-settings__section'>
-        {this.modeLabel(mode)}
+      <div className='column-settings__row'>
+        <span className='column-settings__section'>
+          {this.modeLabel(mode)}
+        </span>
+
         <AsyncSelect
           isMulti
           autoFocus
           value={this.tags(mode)}
-          settings={this.props.settings}
-          settingPath={['tags', mode]}
           onChange={this.onSelect(mode)}
           loadOptions={this.props.onLoad}
-          classNamePrefix='column-settings__hashtag-select'
+          className='column-select__container'
+          classNamePrefix='column-select'
           name='tags'
+          placeholder={this.props.intl.formatMessage(messages.placeholder)}
+          noOptionsMessage={this.noOptionsMessage}
         />
       </div>
     );
@@ -66,11 +75,15 @@ export default class ColumnSettings extends React.PureComponent {
 
   modeLabel (mode) {
     switch(mode) {
-    case 'any':  return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;
-    case 'all':  return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;
-    case 'none': return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;
+    case 'any':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.any' defaultMessage='Any of these' />;
+    case 'all':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.all' defaultMessage='All of these' />;
+    case 'none':
+      return <FormattedMessage id='hashtag.column_settings.tag_mode.none' defaultMessage='None of these' />;
+    default:
+      return '';
     }
-    return '';
   };
 
   render () {
@@ -78,23 +91,21 @@ export default class ColumnSettings extends React.PureComponent {
       <div>
         <div className='column-settings__row'>
           <div className='setting-toggle'>
-            <Toggle
-              id='hashtag.column_settings.tag_toggle'
-              onChange={this.onToggle}
-              checked={this.state.open}
-            />
+            <Toggle id='hashtag.column_settings.tag_toggle' onChange={this.onToggle} checked={this.state.open} />
+
             <span className='setting-toggle__label'>
               <FormattedMessage id='hashtag.column_settings.tag_toggle' defaultMessage='Include additional tags in this column' />
             </span>
           </div>
         </div>
-        {this.state.open &&
+
+        {this.state.open && (
           <div className='column-settings__hashtags'>
             {this.modeSelect('any')}
             {this.modeSelect('all')}
             {this.modeSelect('none')}
           </div>
-        }
+        )}
       </div>
     );
   }
diff --git a/app/javascript/flavours/glitch/styles/_mixins.scss b/app/javascript/flavours/glitch/styles/_mixins.scss
index c46d7260de..586802185c 100644
--- a/app/javascript/flavours/glitch/styles/_mixins.scss
+++ b/app/javascript/flavours/glitch/styles/_mixins.scss
@@ -82,3 +82,34 @@
     font-size: 16px;
   }
 }
+
+@mixin search-popout() {
+  background: $simple-background-color;
+  border-radius: 4px;
+  padding: 10px 14px;
+  padding-bottom: 14px;
+  margin-top: 10px;
+  color: $light-text-color;
+  box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
+
+  h4 {
+    text-transform: uppercase;
+    color: $light-text-color;
+    font-size: 13px;
+    font-weight: 500;
+    margin-bottom: 10px;
+  }
+
+  li {
+    padding: 4px 0;
+  }
+
+  ul {
+    margin-bottom: 10px;
+  }
+
+  em {
+    font-weight: 500;
+    color: $inverted-text-color;
+  }
+}
diff --git a/app/javascript/flavours/glitch/styles/components/accounts.scss b/app/javascript/flavours/glitch/styles/components/accounts.scss
index ce6cc8b293..0b7b58bb0d 100644
--- a/app/javascript/flavours/glitch/styles/components/accounts.scss
+++ b/app/javascript/flavours/glitch/styles/components/accounts.scss
@@ -339,14 +339,41 @@
   display: block;
   font-weight: 500;
   margin-bottom: 10px;
+}
+
+.column-settings__hashtags {
+  .column-settings__row {
+    margin-bottom: 15px;
+  }
 
-  .column-settings__hashtag-select {
+  .column-select {
     &__control {
       @include search-input();
     }
 
+    &__placeholder {
+      color: $dark-text-color;
+      padding-left: 2px;
+      font-size: 12px;
+    }
+
+    &__value-container {
+      padding-left: 6px;
+    }
+
     &__multi-value {
       background: lighten($ui-base-color, 8%);
+
+      &__remove {
+        cursor: pointer;
+
+        &:hover,
+        &:active,
+        &:focus {
+          background: lighten($ui-base-color, 12%);
+          color: lighten($darker-text-color, 4%);
+        }
+      }
     }
 
     &__multi-value__label,
@@ -354,9 +381,42 @@
       color: $darker-text-color;
     }
 
-    &__indicator-separator,
+    &__clear-indicator,
     &__dropdown-indicator {
-      display: none;
+      cursor: pointer;
+      transition: none;
+      color: $dark-text-color;
+
+      &:hover,
+      &:active,
+      &:focus {
+        color: lighten($dark-text-color, 4%);
+      }
+    }
+
+    &__indicator-separator {
+      background-color: lighten($ui-base-color, 8%);
+    }
+
+    &__menu {
+      @include search-popout();
+      padding: 0;
+      background: $ui-secondary-color;
+    }
+
+    &__menu-list {
+      padding: 6px;
+    }
+
+    &__option {
+      color: $inverted-text-color;
+      border-radius: 4px;
+      font-size: 14px;
+
+      &--is-focused,
+      &--is-selected {
+        background: darken($ui-secondary-color, 10%);
+      }
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index 2821deec72..f4931c36cc 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -157,29 +157,7 @@
 }
 
 .drawer--search--popout {
-  box-sizing: border-box;
-  margin-top: 10px;
-  border-radius: 4px;
-  padding: 10px 14px 14px 14px;
-  box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
-  color: $light-text-color;
-  background: $simple-background-color;
-
-  h4 {
-    margin-bottom: 10px;
-    color: $light-text-color;
-    font-size: 13px;
-    font-weight: 500;
-    text-transform: uppercase;
-  }
-
-  ul { margin-bottom: 10px }
-  li { padding: 4px 0 }
-
-  em {
-    color: $inverted-text-color;
-    font-weight: 500;
-  }
+  @include search-popout();
 }
 
 .drawer--account {
-- 
GitLab


From 59fa38a4f6b9f19d674b3f9da97253b586814f94 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 13 Feb 2019 18:36:40 +0100
Subject: [PATCH 088/192] Fix style regressions on landing page (#10030)

---
 .../flavours/glitch/styles/about.scss         | 19 +++----------------
 1 file changed, 3 insertions(+), 16 deletions(-)

diff --git a/app/javascript/flavours/glitch/styles/about.scss b/app/javascript/flavours/glitch/styles/about.scss
index 302de020bd..329482458c 100644
--- a/app/javascript/flavours/glitch/styles/about.scss
+++ b/app/javascript/flavours/glitch/styles/about.scss
@@ -49,15 +49,9 @@ $small-breakpoint: 960px;
     }
   }
 
+  strong,
   em {
-    display: inline;
-    margin: 0;
-    padding: 0;
     font-weight: 700;
-    background: transparent;
-    font-family: inherit;
-    font-size: inherit;
-    line-height: inherit;
     color: lighten($darker-text-color, 10%);
   }
 
@@ -798,7 +792,7 @@ $small-breakpoint: 960px;
       width: 100%;
       display: flex;
       flex-direction: row-reverse;
-      flex-wrap: wrap;
+      flex-wrap: nowrap;
       justify-content: space-between;
       align-items: center;
     }
@@ -848,14 +842,7 @@ $small-breakpoint: 960px;
     }
 
     strong {
-      display: inline;
-      margin: 0;
-      padding: 0;
-      font-weight: 700;
-      background: transparent;
-      font-family: inherit;
-      font-size: inherit;
-      line-height: inherit;
+      font-weight: 500;
       color: lighten($darker-text-color, 10%);
     }
 
-- 
GitLab


From 71e28ba39993d6eb3c5966e20214214c9d81b173 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 15 Feb 2019 19:43:09 +0100
Subject: [PATCH 089/192] Change buttons on timeline preview to open the
 interaction dialog (#10054)

Fix #9922
---
 .../mastodon/components/status_action_bar.js  | 30 ++++++++++++++-----
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 16c7caf1c1..53d17d4180 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -78,7 +78,11 @@ class StatusActionBar extends ImmutablePureComponent {
   ]
 
   handleReplyClick = () => {
-    this.props.onReply(this.props.status, this.context.router.history);
+    if (me) {
+      this.props.onReply(this.props.status, this.context.router.history);
+    } else {
+      this._openInteractionDialog('reply');
+    }
   }
 
   handleShareClick = () => {
@@ -91,11 +95,23 @@ class StatusActionBar extends ImmutablePureComponent {
   }
 
   handleFavouriteClick = () => {
-    this.props.onFavourite(this.props.status);
+    if (me) {
+      this.props.onFavourite(this.props.status);
+    } else {
+      this._openInteractionDialog('favourite');
+    }
+  }
+
+  handleReblogClick = e => {
+    if (me) {
+      this.props.onReblog(this.props.status, e);
+    } else {
+      this._openInteractionDialog('reblog');
+    }
   }
 
-  handleReblogClick = (e) => {
-    this.props.onReblog(this.props.status, e);
+  _openInteractionDialog = type => {
+    window.open(`/interact/${this.props.status.get('id')}?type=${type}`, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');
   }
 
   handleDeleteClick = () => {
@@ -233,9 +249,9 @@ class StatusActionBar extends ImmutablePureComponent {
 
     return (
       <div className='status__action-bar'>
-        <div className='status__action-bar__counter'><IconButton className='status__action-bar-button' disabled={anonymousAccess} title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div>
-        <IconButton className='status__action-bar-button' disabled={anonymousAccess || !publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
-        <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
+        <div className='status__action-bar__counter'><IconButton className='status__action-bar-button' title={replyTitle} icon={status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) ? 'reply' : replyIcon} onClick={this.handleReplyClick} /><span className='status__action-bar__counter__label' >{obfuscatedCount(status.get('replies_count'))}</span></div>
+        <IconButton className='status__action-bar-button' disabled={!publicStatus} active={status.get('reblogged')} pressed={status.get('reblogged')} title={!publicStatus ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(messages.reblog)} icon={reblogIcon} onClick={this.handleReblogClick} />
+        <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
         {shareButton}
 
         <div className='status__action-bar-dropdown'>
-- 
GitLab


From 80388a3ffe654f5aec0dc94ce9976b4e9fe257ae Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Fri, 15 Feb 2019 23:33:25 +0100
Subject: [PATCH 090/192] Change error graphic to hover-to-play (#10055)

Fix #6060
---
 app/javascript/packs/error.js              |  13 +++++++++++++
 app/javascript/styles/mastodon/basics.scss |  14 ++++++++------
 app/views/layouts/error.html.haml          |   7 +++++--
 public/oops.png                            | Bin 0 -> 20552 bytes
 4 files changed, 26 insertions(+), 8 deletions(-)
 create mode 100644 app/javascript/packs/error.js
 create mode 100644 public/oops.png

diff --git a/app/javascript/packs/error.js b/app/javascript/packs/error.js
new file mode 100644
index 0000000000..685c890658
--- /dev/null
+++ b/app/javascript/packs/error.js
@@ -0,0 +1,13 @@
+import ready from '../mastodon/ready';
+
+ready(() => {
+  const image = document.querySelector('img');
+
+  image.addEventListener('mouseenter', () => {
+    image.src = '/oops.gif';
+  });
+
+  image.addEventListener('mouseleave', () => {
+    image.src = '/oops.png';
+  });
+});
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 746def6251..4411ca0b4c 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -100,12 +100,14 @@ body {
       vertical-align: middle;
       margin: 20px;
 
-      img {
-        display: block;
-        max-width: 470px;
-        width: 100%;
-        height: auto;
-        margin-top: -120px;
+      &__illustration {
+        img {
+          display: block;
+          max-width: 470px;
+          width: 100%;
+          height: auto;
+          margin-top: -120px;
+        }
       }
 
       h1 {
diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml
index 37359b89b9..25c85abf9e 100644
--- a/app/views/layouts/error.html.haml
+++ b/app/views/layouts/error.html.haml
@@ -7,8 +7,11 @@
     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
     = stylesheet_pack_tag 'common', media: 'all'
     = stylesheet_pack_tag Setting.default_settings['theme'], media: 'all'
+    = javascript_pack_tag 'common', integrity: true, crossorigin: 'anonymous'
+    = javascript_pack_tag 'error', integrity: true, crossorigin: 'anonymous'
   %body.error
     .dialog
-      %img{ alt: Setting.default_settings['site_title'], src: '/oops.gif' }/
-      %div
+      .dialog__illustration
+        %img{ alt: Setting.default_settings['site_title'], src: '/oops.png' }/
+      .dialog__message
         %h1= yield :content
diff --git a/public/oops.png b/public/oops.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ac779f2551c4997c06851b0b41d0fb4ad24dee0
GIT binary patch
literal 20552
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

literal 0
HcmV?d00001

-- 
GitLab


From a006d4afbe0b57cba9c7bcbd656131319c5c2965 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 16 Feb 2019 05:23:47 +0100
Subject: [PATCH 091/192] Add registrations attribute to instance entity in
 REST API (#10060)

Fix #9350
---
 app/serializers/rest/instance_serializer.rb | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/app/serializers/rest/instance_serializer.rb b/app/serializers/rest/instance_serializer.rb
index e3e64ea876..216808ffb9 100644
--- a/app/serializers/rest/instance_serializer.rb
+++ b/app/serializers/rest/instance_serializer.rb
@@ -5,7 +5,7 @@ class REST::InstanceSerializer < ActiveModel::Serializer
 
   attributes :uri, :title, :description, :email,
              :version, :urls, :stats, :thumbnail,
-             :languages
+             :languages, :registrations
 
   has_one :contact_account, serializer: REST::AccountSerializer
 
@@ -51,6 +51,10 @@ class REST::InstanceSerializer < ActiveModel::Serializer
     [I18n.default_locale]
   end
 
+  def registrations
+    Setting.open_registrations && !Rails.configuration.x.single_user_mode
+  end
+
   private
 
   def instance_presenter
-- 
GitLab


From cc84a407f4cf8096b08bcd26b7ab4f61e9a47694 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 16 Feb 2019 05:27:05 +0100
Subject: [PATCH 092/192] Add vapid_key to the application entity in the REST
 API (#10058)

Fix #8785
---
 app/controllers/api/v1/apps/credentials_controller.rb | 2 +-
 app/serializers/rest/application_serializer.rb        | 6 +++++-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/controllers/api/v1/apps/credentials_controller.rb b/app/controllers/api/v1/apps/credentials_controller.rb
index e469c7d210..8b63d0490d 100644
--- a/app/controllers/api/v1/apps/credentials_controller.rb
+++ b/app/controllers/api/v1/apps/credentials_controller.rb
@@ -6,6 +6,6 @@ class Api::V1::Apps::CredentialsController < Api::BaseController
   respond_to :json
 
   def show
-    render json: doorkeeper_token.application, serializer: REST::StatusSerializer::ApplicationSerializer
+    render json: doorkeeper_token.application, serializer: REST::ApplicationSerializer, fields: %i(name website vapid_key)
   end
 end
diff --git a/app/serializers/rest/application_serializer.rb b/app/serializers/rest/application_serializer.rb
index a9316cd4b7..ab68219ade 100644
--- a/app/serializers/rest/application_serializer.rb
+++ b/app/serializers/rest/application_serializer.rb
@@ -2,7 +2,7 @@
 
 class REST::ApplicationSerializer < ActiveModel::Serializer
   attributes :id, :name, :website, :redirect_uri,
-             :client_id, :client_secret
+             :client_id, :client_secret, :vapid_key
 
   def id
     object.id.to_s
@@ -19,4 +19,8 @@ class REST::ApplicationSerializer < ActiveModel::Serializer
   def website
     object.website.presence
   end
+
+  def vapid_key
+    Rails.configuration.x.vapid_public_key
+  end
 end
-- 
GitLab


From ea7ad59af20af2aa6817b3b40dca34c8fba3373a Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 16 Feb 2019 11:56:09 +0100
Subject: [PATCH 093/192] Fix mutes, blocks, domain blocks and follow requests
 not paginating (#10057)

Regression from #9581
---
 app/javascript/mastodon/features/blocks/index.js          | 5 ++++-
 app/javascript/mastodon/features/domain_blocks/index.js   | 5 ++++-
 app/javascript/mastodon/features/follow_requests/index.js | 5 ++++-
 app/javascript/mastodon/features/mutes/index.js           | 5 ++++-
 4 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/app/javascript/mastodon/features/blocks/index.js b/app/javascript/mastodon/features/blocks/index.js
index ca7ce6f8ea..96a219c947 100644
--- a/app/javascript/mastodon/features/blocks/index.js
+++ b/app/javascript/mastodon/features/blocks/index.js
@@ -18,6 +18,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   accountIds: state.getIn(['user_lists', 'blocks', 'items']),
+  hasMore: !!state.getIn(['user_lists', 'blocks', 'next']),
 });
 
 export default @connect(mapStateToProps)
@@ -29,6 +30,7 @@ class Blocks extends ImmutablePureComponent {
     dispatch: PropTypes.func.isRequired,
     shouldUpdateScroll: PropTypes.func,
     accountIds: ImmutablePropTypes.list,
+    hasMore: PropTypes.bool,
     intl: PropTypes.object.isRequired,
   };
 
@@ -41,7 +43,7 @@ class Blocks extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { intl, accountIds, shouldUpdateScroll } = this.props;
+    const { intl, accountIds, shouldUpdateScroll, hasMore } = this.props;
 
     if (!accountIds) {
       return (
@@ -59,6 +61,7 @@ class Blocks extends ImmutablePureComponent {
         <ScrollableList
           scrollKey='blocks'
           onLoadMore={this.handleLoadMore}
+          hasMore={hasMore}
           shouldUpdateScroll={shouldUpdateScroll}
           emptyMessage={emptyMessage}
         >
diff --git a/app/javascript/mastodon/features/domain_blocks/index.js b/app/javascript/mastodon/features/domain_blocks/index.js
index 5c1bd11610..7c075f5a5c 100644
--- a/app/javascript/mastodon/features/domain_blocks/index.js
+++ b/app/javascript/mastodon/features/domain_blocks/index.js
@@ -19,6 +19,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   domains: state.getIn(['domain_lists', 'blocks', 'items']),
+  hasMore: !!state.getIn(['domain_lists', 'blocks', 'next']),
 });
 
 export default @connect(mapStateToProps)
@@ -29,6 +30,7 @@ class Blocks extends ImmutablePureComponent {
     params: PropTypes.object.isRequired,
     dispatch: PropTypes.func.isRequired,
     shouldUpdateScroll: PropTypes.func,
+    hasMore: PropTypes.bool,
     domains: ImmutablePropTypes.orderedSet,
     intl: PropTypes.object.isRequired,
   };
@@ -42,7 +44,7 @@ class Blocks extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { intl, domains, shouldUpdateScroll } = this.props;
+    const { intl, domains, shouldUpdateScroll, hasMore } = this.props;
 
     if (!domains) {
       return (
@@ -60,6 +62,7 @@ class Blocks extends ImmutablePureComponent {
         <ScrollableList
           scrollKey='domain_blocks'
           onLoadMore={this.handleLoadMore}
+          hasMore={hasMore}
           shouldUpdateScroll={shouldUpdateScroll}
           emptyMessage={emptyMessage}
         >
diff --git a/app/javascript/mastodon/features/follow_requests/index.js b/app/javascript/mastodon/features/follow_requests/index.js
index 56ae8764b4..3871e0e5d1 100644
--- a/app/javascript/mastodon/features/follow_requests/index.js
+++ b/app/javascript/mastodon/features/follow_requests/index.js
@@ -18,6 +18,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   accountIds: state.getIn(['user_lists', 'follow_requests', 'items']),
+  hasMore: !!state.getIn(['user_lists', 'follow_requests', 'next']),
 });
 
 export default @connect(mapStateToProps)
@@ -28,6 +29,7 @@ class FollowRequests extends ImmutablePureComponent {
     params: PropTypes.object.isRequired,
     dispatch: PropTypes.func.isRequired,
     shouldUpdateScroll: PropTypes.func,
+    hasMore: PropTypes.bool,
     accountIds: ImmutablePropTypes.list,
     intl: PropTypes.object.isRequired,
   };
@@ -41,7 +43,7 @@ class FollowRequests extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { intl, shouldUpdateScroll, accountIds } = this.props;
+    const { intl, shouldUpdateScroll, accountIds, hasMore } = this.props;
 
     if (!accountIds) {
       return (
@@ -59,6 +61,7 @@ class FollowRequests extends ImmutablePureComponent {
         <ScrollableList
           scrollKey='follow_requests'
           onLoadMore={this.handleLoadMore}
+          hasMore={hasMore}
           shouldUpdateScroll={shouldUpdateScroll}
           emptyMessage={emptyMessage}
         >
diff --git a/app/javascript/mastodon/features/mutes/index.js b/app/javascript/mastodon/features/mutes/index.js
index f979ef72f9..4ed29a1ce6 100644
--- a/app/javascript/mastodon/features/mutes/index.js
+++ b/app/javascript/mastodon/features/mutes/index.js
@@ -18,6 +18,7 @@ const messages = defineMessages({
 
 const mapStateToProps = state => ({
   accountIds: state.getIn(['user_lists', 'mutes', 'items']),
+  hasMore: !!state.getIn(['user_lists', 'mutes', 'next']),
 });
 
 export default @connect(mapStateToProps)
@@ -28,6 +29,7 @@ class Mutes extends ImmutablePureComponent {
     params: PropTypes.object.isRequired,
     dispatch: PropTypes.func.isRequired,
     shouldUpdateScroll: PropTypes.func,
+    hasMore: PropTypes.bool,
     accountIds: ImmutablePropTypes.list,
     intl: PropTypes.object.isRequired,
   };
@@ -41,7 +43,7 @@ class Mutes extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { intl, shouldUpdateScroll, accountIds } = this.props;
+    const { intl, shouldUpdateScroll, hasMore, accountIds } = this.props;
 
     if (!accountIds) {
       return (
@@ -59,6 +61,7 @@ class Mutes extends ImmutablePureComponent {
         <ScrollableList
           scrollKey='mutes'
           onLoadMore={this.handleLoadMore}
+          hasMore={hasMore}
           shouldUpdateScroll={shouldUpdateScroll}
           emptyMessage={emptyMessage}
         >
-- 
GitLab


From 041ff5fa9a45f7b8d1048a05a35611622b6f5fdb Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Sat, 16 Feb 2019 14:53:27 +0100
Subject: [PATCH 094/192] Fix crash on public hashtag pages when streaming
 fails (#10061)

---
 .../mastodon/features/status/components/detailed_status.js      | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index 734353c9bd..49bc43a7ba 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -87,7 +87,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
   }
 
   render () {
-    const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status;
+    const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
     const outerStyle = { boxSizing: 'border-box' };
     const { compact } = this.props;
 
-- 
GitLab


From 147b4c2c3afacd6ad9d5c1353c072861eaca5fd2 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sun, 17 Feb 2019 03:38:25 +0100
Subject: [PATCH 095/192] Add logging for rejected ActivityPub payloads and add
 tests (#10062)

---
 app/lib/activitypub/activity.rb               |   5 +
 app/lib/activitypub/activity/announce.rb      |   4 +-
 app/lib/activitypub/activity/create.rb        |   2 +-
 .../lib/activitypub/activity/announce_spec.rb | 117 ++-
 spec/lib/activitypub/activity/create_spec.rb  | 710 ++++++++++--------
 5 files changed, 525 insertions(+), 313 deletions(-)

diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 3cf38764a9..8265810a00 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -180,4 +180,9 @@ class ActivityPub::Activity
   def requested_through_relay?
     @options[:relayed_through_account] && Relay.find_by(inbox_url: @options[:relayed_through_account].inbox_url)&.enabled?
   end
+
+  def reject_payload!
+    Rails.logger.info("Rejected #{@json['type']} activity #{@json['id']} from #{@account.uri}#{@options[:relayed_through_account] && "via #{@options[:relayed_through_account].uri}"}")
+    nil
+  end
 end
diff --git a/app/lib/activitypub/activity/announce.rb b/app/lib/activitypub/activity/announce.rb
index 28a1cda024..9f8ffd9fb7 100644
--- a/app/lib/activitypub/activity/announce.rb
+++ b/app/lib/activitypub/activity/announce.rb
@@ -2,9 +2,11 @@
 
 class ActivityPub::Activity::Announce < ActivityPub::Activity
   def perform
+    return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity?
+
     original_status = status_from_object
 
-    return if original_status.nil? || delete_arrived_first?(@json['id']) || !announceable?(original_status) || !related_to_local_activity?
+    return reject_payload! if original_status.nil? || !announceable?(original_status)
 
     status = Status.find_by(account: @account, reblog: original_status)
 
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 4fc37fb4b5..d7bd65c806 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -2,7 +2,7 @@
 
 class ActivityPub::Activity::Create < ActivityPub::Activity
   def perform
-    return if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity?
+    return reject_payload! if unsupported_object_type? || invalid_origin?(@object['id']) || Tombstone.exists?(uri: @object['id']) || !related_to_local_activity?
 
     RedisLock.acquire(lock_options) do |lock|
       if lock.acquired?
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index 5e6f008ec0..94b9d348d0 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -18,16 +18,63 @@ RSpec.describe ActivityPub::Activity::Announce do
   subject { described_class.new(json, sender) }
 
   before do
-    Fabricate(:account).follow!(sender)
     sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender))
   end
 
   describe '#perform' do
-    before do
-      subject.perform
+    context 'when sender is followed by a local account' do
+      before do
+        Fabricate(:account).follow!(sender)
+        subject.perform
+      end
+
+      context 'a known status' do
+        let(:object_json) do
+          ActivityPub::TagManager.instance.uri_for(status)
+        end
+
+        it 'creates a reblog by sender of status' do
+          expect(sender.reblogged?(status)).to be true
+        end
+      end
+
+      context 'self-boost of a previously unknown status with missing attributedTo' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: 'http://example.com/followers',
+          }
+        end
+
+        it 'creates a reblog by sender of status' do
+          expect(sender.reblogged?(sender.statuses.first)).to be true
+        end
+      end
+
+      context 'self-boost of a previously unknown status with correct attributedTo' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
+            to: 'http://example.com/followers',
+          }
+        end
+
+        it 'creates a reblog by sender of status' do
+          expect(sender.reblogged?(sender.statuses.first)).to be true
+        end
+      end
     end
 
-    context 'a known status' do
+    context 'when the status belongs to a local user' do
+      before do
+        subject.perform
+      end
+
       let(:object_json) do
         ActivityPub::TagManager.instance.uri_for(status)
       end
@@ -37,34 +84,68 @@ RSpec.describe ActivityPub::Activity::Announce do
       end
     end
 
-    context 'self-boost of a previously unknown status with missing attributedTo' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          to: 'http://example.com/followers',
-        }
+    context 'when the sender is relayed' do
+      let!(:relay_account) { Fabricate(:account, inbox_url: 'https://relay.example.com/inbox') }
+      let!(:relay) { Fabricate(:relay, inbox_url: 'https://relay.example.com/inbox') }
+
+      subject { described_class.new(json, sender, relayed_through_account: relay_account) }
+
+      context 'and the relay is enabled' do
+        before do
+          relay.update(state: :accepted)
+          subject.perform
+        end
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: 'http://example.com/followers',
+          }
+        end
+
+        it 'creates a reblog by sender of status' do
+          expect(sender.statuses.count).to eq 2
+        end
       end
 
-      it 'creates a reblog by sender of status' do
-        expect(sender.reblogged?(sender.statuses.first)).to be true
+      context 'and the relay is disabled' do
+        before do
+          subject.perform
+        end
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: 'http://example.com/followers',
+          }
+        end
+
+        it 'does not create anything' do
+          expect(sender.statuses.count).to eq 0
+        end
       end
     end
 
-    context 'self-boost of a previously unknown status with correct attributedTo' do
+    context 'when the sender has no relevance to local activity' do
+      before do
+        subject.perform
+      end
+
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
           to: 'http://example.com/followers',
         }
       end
 
-      it 'creates a reblog by sender of status' do
-        expect(sender.reblogged?(sender.statuses.first)).to be true
+      it 'does not create anything' do
+        expect(sender.statuses.count).to eq 0
       end
     end
   end
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index cd20b7c7cb..26cb84871c 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -13,8 +13,6 @@ RSpec.describe ActivityPub::Activity::Create do
     }.with_indifferent_access
   end
 
-  subject { described_class.new(json, sender) }
-
   before do
     sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender))
 
@@ -23,59 +21,407 @@ RSpec.describe ActivityPub::Activity::Create do
   end
 
   describe '#perform' do
-    before do
-      subject.perform
-    end
-
-    context 'standalone' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-
-        expect(status).to_not be_nil
-        expect(status.text).to eq 'Lorem ipsum'
-      end
-
-      it 'missing to/cc defaults to direct privacy' do
-        status = sender.statuses.first
+    context 'when fetching' do
+      subject { described_class.new(json, sender) }
+
+      before do
+        subject.perform
+      end
+
+      context 'standalone' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.text).to eq 'Lorem ipsum'
+        end
+
+        it 'missing to/cc defaults to direct privacy' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'direct'
+        end
+      end
+
+      context 'public' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: 'https://www.w3.org/ns/activitystreams#Public',
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'public'
+        end
+      end
+
+      context 'unlisted' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            cc: 'https://www.w3.org/ns/activitystreams#Public',
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'unlisted'
+        end
+      end
+
+      context 'private' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: 'http://example.com/followers',
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'private'
+        end
+      end
+
+      context 'limited' do
+        let(:recipient) { Fabricate(:account) }
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: ActivityPub::TagManager.instance.uri_for(recipient),
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'limited'
+        end
+
+        it 'creates silent mention' do
+          status = sender.statuses.first
+          expect(status.mentions.first).to be_silent
+        end
+      end
+
+      context 'direct' do
+        let(:recipient) { Fabricate(:account) }
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            to: ActivityPub::TagManager.instance.uri_for(recipient),
+            tag: {
+              type: 'Mention',
+              href: ActivityPub::TagManager.instance.uri_for(recipient),
+            },
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.visibility).to eq 'direct'
+        end
+      end
+
+      context 'as a reply' do
+        let(:original_status) { Fabricate(:status) }
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status),
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.thread).to eq original_status
+          expect(status.reply?).to be true
+          expect(status.in_reply_to_account).to eq original_status.account
+          expect(status.conversation).to eq original_status.conversation
+        end
+      end
+
+      context 'with mentions' do
+        let(:recipient) { Fabricate(:account) }
+
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            tag: [
+              {
+                type: 'Mention',
+                href: ActivityPub::TagManager.instance.uri_for(recipient),
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.mentions.map(&:account)).to include(recipient)
+        end
+      end
+
+      context 'with mentions missing href' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            tag: [
+              {
+                type: 'Mention',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+          expect(status).to_not be_nil
+        end
+      end
+
+      context 'with media attachments' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            attachment: [
+              {
+                type: 'Document',
+                mediaType: 'image/png',
+                url: 'http://example.com/attachment.png',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png')
+        end
+      end
+
+      context 'with media attachments with focal points' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            attachment: [
+              {
+                type: 'Document',
+                mediaType: 'image/png',
+                url: 'http://example.com/attachment.png',
+                focalPoint: [0.5, -0.7],
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7')
+        end
+      end
+
+      context 'with media attachments missing url' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            attachment: [
+              {
+                type: 'Document',
+                mediaType: 'image/png',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+          expect(status).to_not be_nil
+        end
+      end
+
+      context 'with hashtags' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            tag: [
+              {
+                type: 'Hashtag',
+                href: 'http://example.com/blah',
+                name: '#test',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.tags.map(&:name)).to include('test')
+        end
+      end
+
+      context 'with hashtags missing name' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum',
+            tag: [
+              {
+                type: 'Hashtag',
+                href: 'http://example.com/blah',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+          expect(status).to_not be_nil
+        end
+      end
+
+      context 'with emojis' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum :tinking:',
+            tag: [
+              {
+                type: 'Emoji',
+                icon: {
+                  url: 'http://example.com/emoji.png',
+                },
+                name: 'tinking',
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+
+          expect(status).to_not be_nil
+          expect(status.emojis.map(&:shortcode)).to include('tinking')
+        end
+      end
+
+      context 'with emojis missing name' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum :tinking:',
+            tag: [
+              {
+                type: 'Emoji',
+                icon: {
+                  url: 'http://example.com/emoji.png',
+                },
+              },
+            ],
+          }
+        end
+
+        it 'creates status' do
+          status = sender.statuses.first
+          expect(status).to_not be_nil
+        end
+      end
+
+      context 'with emojis missing icon' do
+        let(:object_json) do
+          {
+            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            type: 'Note',
+            content: 'Lorem ipsum :tinking:',
+            tag: [
+              {
+                type: 'Emoji',
+                name: 'tinking',
+              },
+            ],
+          }
+        end
 
-        expect(status).to_not be_nil
-        expect(status.visibility).to eq 'direct'
+        it 'creates status' do
+          status = sender.statuses.first
+          expect(status).to_not be_nil
+        end
       end
     end
 
-    context 'public' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          to: 'https://www.w3.org/ns/activitystreams#Public',
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
+    context 'when sender is followed by local users' do
+      subject { described_class.new(json, sender, delivery: true) }
 
-        expect(status).to_not be_nil
-        expect(status.visibility).to eq 'public'
+      before do
+        Fabricate(:account).follow!(sender)
+        subject.perform
       end
-    end
 
-    context 'unlisted' do
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          cc: 'https://www.w3.org/ns/activitystreams#Public',
         }
       end
 
@@ -83,66 +429,25 @@ RSpec.describe ActivityPub::Activity::Create do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.visibility).to eq 'unlisted'
-      end
-    end
-
-    context 'private' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          to: 'http://example.com/followers',
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-
-        expect(status).to_not be_nil
-        expect(status.visibility).to eq 'private'
+        expect(status.text).to eq 'Lorem ipsum'
       end
     end
 
-    context 'limited' do
-      let(:recipient) { Fabricate(:account) }
+    context 'when sender replies to local status' do
+      let!(:local_status) { Fabricate(:status) }
 
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          to: ActivityPub::TagManager.instance.uri_for(recipient),
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-
-        expect(status).to_not be_nil
-        expect(status.visibility).to eq 'limited'
-      end
+      subject { described_class.new(json, sender, delivery: true) }
 
-      it 'creates silent mention' do
-        status = sender.statuses.first
-        expect(status.mentions.first).to be_silent
+      before do
+        subject.perform
       end
-    end
-
-    context 'direct' do
-      let(:recipient) { Fabricate(:account) }
 
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          to: ActivityPub::TagManager.instance.uri_for(recipient),
-          tag: {
-            type: 'Mention',
-            href: ActivityPub::TagManager.instance.uri_for(recipient),
-          },
+          inReplyTo: ActivityPub::TagManager.instance.uri_for(local_status),
         }
       end
 
@@ -150,47 +455,25 @@ RSpec.describe ActivityPub::Activity::Create do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.visibility).to eq 'direct'
+        expect(status.text).to eq 'Lorem ipsum'
       end
     end
 
-    context 'as a reply' do
-      let(:original_status) { Fabricate(:status) }
+    context 'when sender targets a local user' do
+      let!(:local_account) { Fabricate(:account) }
 
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          inReplyTo: ActivityPub::TagManager.instance.uri_for(original_status),
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
+      subject { described_class.new(json, sender, delivery: true) }
 
-        expect(status).to_not be_nil
-        expect(status.thread).to eq original_status
-        expect(status.reply?).to be true
-        expect(status.in_reply_to_account).to eq original_status.account
-        expect(status.conversation).to eq original_status.conversation
+      before do
+        subject.perform
       end
-    end
-
-    context 'with mentions' do
-      let(:recipient) { Fabricate(:account) }
 
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          tag: [
-            {
-              type: 'Mention',
-              href: ActivityPub::TagManager.instance.uri_for(recipient),
-            },
-          ],
+          to: ActivityPub::TagManager.instance.uri_for(local_account),
         }
       end
 
@@ -198,68 +481,25 @@ RSpec.describe ActivityPub::Activity::Create do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.mentions.map(&:account)).to include(recipient)
-      end
-    end
-
-    context 'with mentions missing href' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          tag: [
-            {
-              type: 'Mention',
-            },
-          ],
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-        expect(status).to_not be_nil
+        expect(status.text).to eq 'Lorem ipsum'
       end
     end
 
-    context 'with media attachments' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          attachment: [
-            {
-              type: 'Document',
-              mediaType: 'image/png',
-              url: 'http://example.com/attachment.png',
-            },
-          ],
-        }
-      end
+    context 'when sender cc\'s a local user' do
+      let!(:local_account) { Fabricate(:account) }
 
-      it 'creates status' do
-        status = sender.statuses.first
+      subject { described_class.new(json, sender, delivery: true) }
 
-        expect(status).to_not be_nil
-        expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png')
+      before do
+        subject.perform
       end
-    end
 
-    context 'with media attachments with focal points' do
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          attachment: [
-            {
-              type: 'Document',
-              mediaType: 'image/png',
-              url: 'http://example.com/attachment.png',
-              focalPoint: [0.5, -0.7],
-            },
-          ],
+          cc: ActivityPub::TagManager.instance.uri_for(local_account),
         }
       end
 
@@ -267,143 +507,27 @@ RSpec.describe ActivityPub::Activity::Create do
         status = sender.statuses.first
 
         expect(status).to_not be_nil
-        expect(status.media_attachments.map(&:focus)).to include('0.5,-0.7')
+        expect(status.text).to eq 'Lorem ipsum'
       end
     end
 
-    context 'with media attachments missing url' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          attachment: [
-            {
-              type: 'Document',
-              mediaType: 'image/png',
-            },
-          ],
-        }
-      end
+    context 'when the sender has no relevance to local activity' do
+      subject { described_class.new(json, sender, delivery: true) }
 
-      it 'creates status' do
-        status = sender.statuses.first
-        expect(status).to_not be_nil
+      before do
+        subject.perform
       end
-    end
 
-    context 'with hashtags' do
       let(:object_json) do
         {
           id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
           type: 'Note',
           content: 'Lorem ipsum',
-          tag: [
-            {
-              type: 'Hashtag',
-              href: 'http://example.com/blah',
-              name: '#test',
-            },
-          ],
         }
       end
 
-      it 'creates status' do
-        status = sender.statuses.first
-
-        expect(status).to_not be_nil
-        expect(status.tags.map(&:name)).to include('test')
-      end
-    end
-
-    context 'with hashtags missing name' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum',
-          tag: [
-            {
-              type: 'Hashtag',
-              href: 'http://example.com/blah',
-            },
-          ],
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-        expect(status).to_not be_nil
-      end
-    end
-
-    context 'with emojis' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum :tinking:',
-          tag: [
-            {
-              type: 'Emoji',
-              icon: {
-                url: 'http://example.com/emoji.png',
-              },
-              name: 'tinking',
-            },
-          ],
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-
-        expect(status).to_not be_nil
-        expect(status.emojis.map(&:shortcode)).to include('tinking')
-      end
-    end
-
-    context 'with emojis missing name' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum :tinking:',
-          tag: [
-            {
-              type: 'Emoji',
-              icon: {
-                url: 'http://example.com/emoji.png',
-              },
-            },
-          ],
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-        expect(status).to_not be_nil
-      end
-    end
-
-    context 'with emojis missing icon' do
-      let(:object_json) do
-        {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
-          type: 'Note',
-          content: 'Lorem ipsum :tinking:',
-          tag: [
-            {
-              type: 'Emoji',
-              name: 'tinking',
-            },
-          ],
-        }
-      end
-
-      it 'creates status' do
-        status = sender.statuses.first
-        expect(status).to_not be_nil
+      it 'does not create anything' do
+        expect(sender.statuses.count).to eq 0
       end
     end
   end
-- 
GitLab


From 9a47f2cbdf8ef70cb93ac2b5ee2947948d1a1d04 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 12:02:47 +0100
Subject: [PATCH 096/192] Port upstream's javascript to the error page

---
 app/javascript/flavours/glitch/packs/error.js | 13 +++++++++++++
 app/javascript/flavours/glitch/theme.yml      |  2 +-
 2 files changed, 14 insertions(+), 1 deletion(-)
 create mode 100644 app/javascript/flavours/glitch/packs/error.js

diff --git a/app/javascript/flavours/glitch/packs/error.js b/app/javascript/flavours/glitch/packs/error.js
new file mode 100644
index 0000000000..81c86c3abb
--- /dev/null
+++ b/app/javascript/flavours/glitch/packs/error.js
@@ -0,0 +1,13 @@
+import ready from 'flavours/glitch/util/ready';
+
+ready(() => {
+  const image = document.querySelector('img');
+
+  image.addEventListener('mouseenter', () => {
+    image.src = '/oops.gif';
+  });
+
+  image.addEventListener('mouseleave', () => {
+    image.src = '/oops.png';
+  });
+});
diff --git a/app/javascript/flavours/glitch/theme.yml b/app/javascript/flavours/glitch/theme.yml
index 0c8342c443..d8f3133818 100644
--- a/app/javascript/flavours/glitch/theme.yml
+++ b/app/javascript/flavours/glitch/theme.yml
@@ -7,7 +7,7 @@ pack:
     filename: packs/common.js
     stylesheet: true
   embed: packs/public.js
-  error:
+  error: packs/error.js
   home:
     filename: packs/home.js
     preload:
-- 
GitLab


From 91c9cb602215a8feb2e171fadd580dfe4dd75830 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 12:39:44 +0100
Subject: [PATCH 097/192] [Glitch] Change buttons on timeline preview to open
 the interaction dialog

Port 71e28ba39993d6eb3c5966e20214214c9d81b173 to glitch-soc
---
 .../glitch/components/status_action_bar.js    | 29 ++++++++++++++-----
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 7fb84bd1e7..1d3130604c 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -83,7 +83,11 @@ export default class StatusActionBar extends ImmutablePureComponent {
   ]
 
   handleReplyClick = () => {
-    this.props.onReply(this.props.status, this.context.router.history);
+    if (me) {
+      this.props.onReply(this.props.status, this.context.router.history);
+    } else {
+      this._openInteractionDialog('reply');
+    }
   }
 
   handleShareClick = () => {
@@ -94,17 +98,29 @@ export default class StatusActionBar extends ImmutablePureComponent {
   }
 
   handleFavouriteClick = (e) => {
-    this.props.onFavourite(this.props.status, e);
+    if (me) {
+      this.props.onFavourite(this.props.status, e);
+    } else {
+      this._openInteractionDialog('favourite');
+    }
   }
 
   handleBookmarkClick = (e) => {
     this.props.onBookmark(this.props.status, e);
   }
 
-  handleReblogClick = (e) => {
-    this.props.onReblog(this.props.status, e);
+  handleReblogClick = e => {
+    if (me) {
+      this.props.onReblog(this.props.status, e);
+    } else {
+      this._openInteractionDialog('reblog');
+    }
   }
 
+  _openInteractionDialog = type => {
+    window.open(`/interact/${this.props.status.get('id')}?type=${type}`, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');
+   }
+
   handleDeleteClick = () => {
     this.props.onDelete(this.props.status, this.context.router.history);
   }
@@ -174,7 +190,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
     const mutingConversation = status.get('muted');
     const anonymousAccess    = !me;
     const publicStatus       = ['public', 'unlisted'].includes(status.get('visibility'));
-    const reblogDisabled     = anonymousAccess || (status.get('visibility') === 'direct' || (status.get('visibility') === 'private' && me !== status.getIn(['account', 'id'])));
+    const reblogDisabled     = status.get('visibility') === 'direct' || (status.get('visibility') === 'private' && me !== status.getIn(['account', 'id']));
     const reblogMessage      = status.get('visibility') === 'private' ? messages.reblog_private : messages.reblog;
 
     let menu = [];
@@ -243,7 +259,6 @@ export default class StatusActionBar extends ImmutablePureComponent {
     let replyButton = (
       <IconButton
         className='status__action-bar-button'
-        disabled={anonymousAccess}
         title={replyTitle}
         icon={replyIcon}
         onClick={this.handleReplyClick}
@@ -262,7 +277,7 @@ export default class StatusActionBar extends ImmutablePureComponent {
       <div className='status__action-bar'>
         {replyButton}
         <IconButton className='status__action-bar-button' disabled={reblogDisabled} active={status.get('reblogged')} pressed={status.get('reblogged')} title={reblogDisabled ? intl.formatMessage(messages.cannot_reblog) : intl.formatMessage(reblogMessage)} icon={reblogIcon} onClick={this.handleReblogClick} />
-        <IconButton className='status__action-bar-button star-icon' disabled={anonymousAccess} animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
+        <IconButton className='status__action-bar-button star-icon' animate active={status.get('favourited')} pressed={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} />
         {shareButton}
         <IconButton className='status__action-bar-button bookmark-icon' disabled={anonymousAccess} active={status.get('bookmarked')} pressed={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} />
 
-- 
GitLab


From cac75e01b8ba840ddfd09bc6ba1539a03d03880f Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 12:53:51 +0100
Subject: [PATCH 098/192] Fix static error page to use the correct pack

---
 app/views/layouts/error.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/layouts/error.html.haml b/app/views/layouts/error.html.haml
index e9c474082b..f8315afb56 100644
--- a/app/views/layouts/error.html.haml
+++ b/app/views/layouts/error.html.haml
@@ -7,7 +7,7 @@
     %meta{ content: 'width=device-width,initial-scale=1', name: 'viewport' }/
     = javascript_pack_tag "locales", integrity: true, crossorigin: 'anonymous'
     = render partial: 'layouts/theme', object: (@core || { pack: 'common' })
-    = render partial: 'layouts/theme', object: (@theme || { pack: 'common', flavour: 'glitch', skin: 'default' })
+    = render partial: 'layouts/theme', object: (@theme || { pack: 'error', flavour: 'glitch', common: { pack: 'common', flavour: 'glitch', skin: 'default' } })
   %body.error
     .dialog
       .dialog__illustration
-- 
GitLab


From e31fc2b458579fea3602e25a798d1f3cfcac2807 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 14:28:25 +0100
Subject: [PATCH 099/192] [Glitch] Fix crash on public hashtag pages when
 streaming fails

Port 041ff5fa9a45f7b8d1048a05a35611622b6f5fdb to glitch-soc
---
 .../glitch/features/status/components/detailed_status.js        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.js b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
index 8f49a9a301..120ae68172 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -98,7 +98,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
   }
 
   render () {
-    const status = this.props.status.get('reblog') ? this.props.status.get('reblog') : this.props.status;
+    const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
     const { expanded, onToggleHidden, settings } = this.props;
     const outerStyle = { boxSizing: 'border-box' };
     const { compact } = this.props;
-- 
GitLab


From 1a1b8170bbb1e8cfd5591a8ea8085de41fa90cc5 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sun, 17 Feb 2019 15:16:36 +0100
Subject: [PATCH 100/192] Fix Announce activities of unknown statuses not
 fetching those statuses (#10065)

Regression from #9998
---
 app/lib/activitypub/activity.rb               |  3 +-
 .../lib/activitypub/activity/announce_spec.rb | 43 +++++++++++++------
 2 files changed, 32 insertions(+), 14 deletions(-)

diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 8265810a00..11fa3363af 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -150,8 +150,7 @@ class ActivityPub::Activity
       end
     end
 
-    # If the status is not from the actor, try to fetch it
-    return fetch_remote_original_status if value_or_id(first_of_value(@json['attributedTo'])) == @account.uri
+    fetch_remote_original_status
   end
 
   def fetch_remote_original_status
diff --git a/spec/lib/activitypub/activity/announce_spec.rb b/spec/lib/activitypub/activity/announce_spec.rb
index 94b9d348d0..aa58d9e234 100644
--- a/spec/lib/activitypub/activity/announce_spec.rb
+++ b/spec/lib/activitypub/activity/announce_spec.rb
@@ -1,7 +1,7 @@
 require 'rails_helper'
 
 RSpec.describe ActivityPub::Activity::Announce do
-  let(:sender)    { Fabricate(:account, followers_url: 'http://example.com/followers') }
+  let(:sender)    { Fabricate(:account, followers_url: 'http://example.com/followers', uri: 'https://example.com/actor') }
   let(:recipient) { Fabricate(:account) }
   let(:status)    { Fabricate(:status, account: recipient) }
 
@@ -10,21 +10,29 @@ RSpec.describe ActivityPub::Activity::Announce do
       '@context': 'https://www.w3.org/ns/activitystreams',
       id: 'foo',
       type: 'Announce',
-      actor: ActivityPub::TagManager.instance.uri_for(sender),
+      actor: 'https://example.com/actor',
       object: object_json,
     }.with_indifferent_access
   end
 
-  subject { described_class.new(json, sender) }
-
-  before do
-    sender.update(uri: ActivityPub::TagManager.instance.uri_for(sender))
+  let(:unknown_object_json) do
+    {
+      '@context': 'https://www.w3.org/ns/activitystreams',
+      id: 'https://example.com/actor/hello-world',
+      type: 'Note',
+      attributedTo: 'https://example.com/actor',
+      content: 'Hello world',
+      to: 'http://example.com/followers',
+    }
   end
 
+  subject { described_class.new(json, sender) }
+
   describe '#perform' do
     context 'when sender is followed by a local account' do
       before do
         Fabricate(:account).follow!(sender)
+        stub_request(:get, 'https://example.com/actor/hello-world').to_return(body: Oj.dump(unknown_object_json))
         subject.perform
       end
 
@@ -38,10 +46,21 @@ RSpec.describe ActivityPub::Activity::Announce do
         end
       end
 
+      context 'an unknown status' do
+        let(:object_json) { 'https://example.com/actor/hello-world' }
+
+        it 'creates a reblog by sender of status' do
+          reblog = sender.statuses.first
+
+          expect(reblog).to_not be_nil
+          expect(reblog.reblog.text).to eq 'Hello world'
+        end
+      end
+
       context 'self-boost of a previously unknown status with missing attributedTo' do
         let(:object_json) do
           {
-            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            id: 'https://example.com/actor#bar',
             type: 'Note',
             content: 'Lorem ipsum',
             to: 'http://example.com/followers',
@@ -56,10 +75,10 @@ RSpec.describe ActivityPub::Activity::Announce do
       context 'self-boost of a previously unknown status with correct attributedTo' do
         let(:object_json) do
           {
-            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            id: 'https://example.com/actor#bar',
             type: 'Note',
             content: 'Lorem ipsum',
-            attributedTo: ActivityPub::TagManager.instance.uri_for(sender),
+            attributedTo: 'https://example.com/actor',
             to: 'http://example.com/followers',
           }
         end
@@ -98,7 +117,7 @@ RSpec.describe ActivityPub::Activity::Announce do
 
         let(:object_json) do
           {
-            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            id: 'https://example.com/actor#bar',
             type: 'Note',
             content: 'Lorem ipsum',
             to: 'http://example.com/followers',
@@ -117,7 +136,7 @@ RSpec.describe ActivityPub::Activity::Announce do
 
         let(:object_json) do
           {
-            id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+            id: 'https://example.com/actor#bar',
             type: 'Note',
             content: 'Lorem ipsum',
             to: 'http://example.com/followers',
@@ -137,7 +156,7 @@ RSpec.describe ActivityPub::Activity::Announce do
 
       let(:object_json) do
         {
-          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+          id: 'https://example.com/actor#bar',
           type: 'Note',
           content: 'Lorem ipsum',
           to: 'http://example.com/followers',
-- 
GitLab


From fa9635c7417361104342e9c108c08ed821634167 Mon Sep 17 00:00:00 2001
From: Ben Lubar <ben.lubar@gmail.com>
Date: Wed, 13 Feb 2019 12:51:33 -0600
Subject: [PATCH 101/192] Allow multi-line image descriptions. (Glitch)

---
 .../glitch/features/composer/upload_form/item/index.js        | 3 +--
 .../flavours/glitch/styles/components/composer.scss           | 4 ++--
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js
index 93fa4e39e1..4f5f66f04f 100644
--- a/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js
+++ b/app/javascript/flavours/glitch/features/composer/upload_form/item/index.js
@@ -169,13 +169,12 @@ export default class ComposerUploadFormItem extends React.PureComponent {
               </div>
               <label>
                 <span style={{ display: 'none' }}><FormattedMessage {...messages.description} /></span>
-                <input
+                <textarea
                   maxLength={420}
                   onBlur={handleBlur}
                   onChange={handleChange}
                   onFocus={handleFocus}
                   placeholder={intl.formatMessage(messages.description)}
-                  type='text'
                   value={description}
                 />
               </label>
diff --git a/app/javascript/flavours/glitch/styles/components/composer.scss b/app/javascript/flavours/glitch/styles/components/composer.scss
index 2267b798c1..fa24cabf27 100644
--- a/app/javascript/flavours/glitch/styles/components/composer.scss
+++ b/app/javascript/flavours/glitch/styles/components/composer.scss
@@ -262,7 +262,7 @@
     background-repeat: no-repeat;
     overflow: hidden;
 
-    input {
+    textarea {
       display: block;
       position: absolute;
       box-sizing: border-box;
@@ -294,7 +294,7 @@
 
   &.active {
     & > div {
-      input { opacity: 1 }
+      textarea { opacity: 1 }
     }
   }
 }
-- 
GitLab


From ec18359c3d1996d3bb4676b826bceda88f5a535f Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 15:14:22 +0100
Subject: [PATCH 102/192] Fix CW fold/unfold in remote interaction dialog

---
 app/javascript/core/theme.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/core/theme.yml b/app/javascript/core/theme.yml
index f48ab40c06..32787bcab9 100644
--- a/app/javascript/core/theme.yml
+++ b/app/javascript/core/theme.yml
@@ -13,7 +13,7 @@ pack:
   mailer:
     filename: mailer.js
     stylesheet: true
-  modal:
+  modal: public.js
   public: public.js
   settings: settings.js
   share:
-- 
GitLab


From 7853be1f06e2a22582cf664a0957f98c46e00a6d Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sun, 17 Feb 2019 20:24:12 +0100
Subject: [PATCH 103/192] Bump version to 2.7.2 (#10067)

---
 AUTHORS.md              | 70 +++++++++++++++++++++++------------------
 CHANGELOG.md            | 41 ++++++++++++++++++++++++
 lib/mastodon/version.rb |  2 +-
 3 files changed, 82 insertions(+), 31 deletions(-)

diff --git a/AUTHORS.md b/AUTHORS.md
index 1bcf455b11..3171214e0e 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -9,18 +9,18 @@ and provided thanks to the work of the following contributors:
 * [akihikodaki](https://github.com/akihikodaki)
 * [ThibG](https://github.com/ThibG)
 * [mjankowski](https://github.com/mjankowski)
+* [dependabot[bot]](https://github.com/apps/dependabot)
 * [unarist](https://github.com/unarist)
 * [m4sk1n](https://github.com/m4sk1n)
-* [dependabot[bot]](https://github.com/apps/dependabot)
 * [yiskah](https://github.com/yiskah)
 * [nolanlawson](https://github.com/nolanlawson)
-* [sorin-davidoi](https://github.com/sorin-davidoi)
 * [ysksn](https://github.com/ysksn)
+* [sorin-davidoi](https://github.com/sorin-davidoi)
 * [abcang](https://github.com/abcang)
 * [lynlynlynx](https://github.com/lynlynlynx)
-* [alpaca-tc](https://github.com/alpaca-tc)
 * [mayaeh](https://github.com/mayaeh)
 * [renatolond](https://github.com/renatolond)
+* [alpaca-tc](https://github.com/alpaca-tc)
 * [nclm](https://github.com/nclm)
 * [ineffyble](https://github.com/ineffyble)
 * [jeroenpraat](https://github.com/jeroenpraat)
@@ -28,9 +28,9 @@ and provided thanks to the work of the following contributors:
 * [Quent-in](https://github.com/Quent-in)
 * [JantsoP](https://github.com/JantsoP)
 * [mabkenar](https://github.com/mabkenar)
+* [Kjwon15](https://github.com/Kjwon15)
 * [nullkal](https://github.com/nullkal)
 * [yookoala](https://github.com/yookoala)
-* [Kjwon15](https://github.com/Kjwon15)
 * [shuheiktgw](https://github.com/shuheiktgw)
 * [ashfurrow](https://github.com/ashfurrow)
 * [Quenty31](https://github.com/Quenty31)
@@ -48,16 +48,16 @@ and provided thanks to the work of the following contributors:
 * [rkarabut](https://github.com/rkarabut)
 * [yukimochi](https://github.com/yukimochi)
 * [Artoria2e5](https://github.com/Artoria2e5)
+* [nightpool](https://github.com/nightpool)
 * [marrus-sh](https://github.com/marrus-sh)
 * [krainboltgreene](https://github.com/krainboltgreene)
-* [patf](https://github.com/patf)
+* [pfigel](https://github.com/pfigel)
 * [Aldarone](https://github.com/Aldarone)
 * [BoFFire](https://github.com/BoFFire)
 * [clworld](https://github.com/clworld)
 * [dracos](https://github.com/dracos)
 * [SerCom_KC](mailto:sercom-kc@users.noreply.github.com)
 * [Sylvhem](https://github.com/Sylvhem)
-* [nightpool](https://github.com/nightpool)
 * [MasterGroosha](https://github.com/MasterGroosha)
 * [JeanGauthier](https://github.com/JeanGauthier)
 * [kschaper](https://github.com/kschaper)
@@ -77,11 +77,14 @@ and provided thanks to the work of the following contributors:
 * [johnsudaar](https://github.com/johnsudaar)
 * [trebmuh](https://github.com/trebmuh)
 * [Rakib Hasan](mailto:rmhasan@gmail.com)
+* [ashleyhull-versent](https://github.com/ashleyhull-versent)
 * [lindwurm](https://github.com/lindwurm)
 * [victorhck](mailto:victorhck@geeko.site)
 * [voidsatisfaction](https://github.com/voidsatisfaction)
+* [rinsuki](https://github.com/rinsuki)
 * [hikari-no-yume](https://github.com/hikari-no-yume)
 * [angristan](https://github.com/angristan)
+* [hinaloe](https://github.com/hinaloe)
 * [seefood](https://github.com/seefood)
 * [jackjennings](https://github.com/jackjennings)
 * [spla](mailto:spla@mastodont.cat)
@@ -92,20 +95,20 @@ and provided thanks to the work of the following contributors:
 * [dunn](https://github.com/dunn)
 * [xqus](https://github.com/xqus)
 * [hugogameiro](https://github.com/hugogameiro)
+* [ariasuni](https://github.com/ariasuni)
 * [pfm-eyesightjp](https://github.com/pfm-eyesightjp)
 * [fakenine](https://github.com/fakenine)
 * [tsuwatch](https://github.com/tsuwatch)
 * [victorhck](https://github.com/victorhck)
-* [ashleyhull-versent](https://github.com/ashleyhull-versent)
 * [kedamaDQ](https://github.com/kedamaDQ)
 * [puckipedia](https://github.com/puckipedia)
 * [fvh-P](https://github.com/fvh-P)
 * [contraexemplo](https://github.com/contraexemplo)
+* [Aditoo17](https://github.com/Aditoo17)
 * [kazu9su](https://github.com/kazu9su)
 * [Komic](https://github.com/Komic)
 * [lmorchard](https://github.com/lmorchard)
 * [diomed](https://github.com/diomed)
-* [ariasuni](https://github.com/ariasuni)
 * [Neetshin](mailto:neetshin@neetsh.in)
 * [rainyday](https://github.com/rainyday)
 * [ProgVal](https://github.com/ProgVal)
@@ -114,7 +117,8 @@ and provided thanks to the work of the following contributors:
 * [goofy-bz](mailto:goofy@babelzilla.org)
 * [kadiix](https://github.com/kadiix)
 * [kodacs](https://github.com/kodacs)
-* [rtucker](https://github.com/rtucker)
+* [trwnh](https://github.com/trwnh)
+* [JMendyk](https://github.com/JMendyk)
 * [KScl](https://github.com/KScl)
 * [sterdev](https://github.com/sterdev)
 * [TheKinrar](https://github.com/TheKinrar)
@@ -125,16 +129,16 @@ and provided thanks to the work of the following contributors:
 * [fhemberger](https://github.com/fhemberger)
 * [greysteil](https://github.com/greysteil)
 * [hensmith](https://github.com/hensmith)
-* [hinaloe](https://github.com/hinaloe)
 * [d6rkaiz](https://github.com/d6rkaiz)
 * [Reverite](https://github.com/Reverite)
-* [JMendyk](https://github.com/JMendyk)
 * [JohnD28](https://github.com/JohnD28)
 * [znz](https://github.com/znz)
 * [Naouak](https://github.com/Naouak)
 * [pawelngei](https://github.com/pawelngei)
+* [rtucker](https://github.com/rtucker)
 * [reneklacan](https://github.com/reneklacan)
 * [ekiru](https://github.com/ekiru)
+* [noellabo](https://github.com/noellabo)
 * [tcitworld](https://github.com/tcitworld)
 * [geta6](https://github.com/geta6)
 * [happycoloredbanana](https://github.com/happycoloredbanana)
@@ -144,9 +148,9 @@ and provided thanks to the work of the following contributors:
 * [noraworld](https://github.com/noraworld)
 * [theboss](https://github.com/theboss)
 * [178inaba](https://github.com/178inaba)
-* [Aditoo17](https://github.com/Aditoo17)
 * [alyssais](https://github.com/alyssais)
-* [kodnaplakal](https://github.com/kodnaplakal)
+* [hiphref](https://github.com/hiphref)
+* [BenLubar](https://github.com/BenLubar)
 * [stalker314314](https://github.com/stalker314314)
 * [huertanix](https://github.com/huertanix)
 * [genesixx](https://github.com/genesixx)
@@ -157,6 +161,7 @@ and provided thanks to the work of the following contributors:
 * [kmichl](https://github.com/kmichl)
 * [Kurtis Rainbolt-Greene](mailto:me@kurtisrainboltgreene.name)
 * [saper](https://github.com/saper)
+* [marek-lach](https://github.com/marek-lach)
 * [nevillepark](https://github.com/nevillepark)
 * [ornithocoder](https://github.com/ornithocoder)
 * [pierreozoux](https://github.com/pierreozoux)
@@ -164,7 +169,6 @@ and provided thanks to the work of the following contributors:
 * [Ram Lmn](mailto:ramlmn@users.noreply.github.com)
 * [harukasan](https://github.com/harukasan)
 * [stamak](https://github.com/stamak)
-* [noellabo](https://github.com/noellabo)
 * [Technowix](mailto:technowix@users.noreply.github.com)
 * [Eychics](https://github.com/Eychics)
 * [Thor Harald Johansen](mailto:thj@thj.no)
@@ -179,21 +183,20 @@ and provided thanks to the work of the following contributors:
 * [hoodie](mailto:hoodiekitten@outlook.com)
 * [luzi82](https://github.com/luzi82)
 * [duxovni](https://github.com/duxovni)
-* [trwnh](https://github.com/trwnh)
+* [tmm576](https://github.com/tmm576)
 * [unsmell](https://github.com/unsmell)
 * [valerauko](https://github.com/valerauko)
 * [chriswmartin](https://github.com/chriswmartin)
 * [vahnj](https://github.com/vahnj)
 * [ikuradon](https://github.com/ikuradon)
 * [AndreLewin](https://github.com/AndreLewin)
-* [rinsuki](https://github.com/rinsuki)
 * [0xflotus](https://github.com/0xflotus)
 * [redtachyons](https://github.com/redtachyons)
 * [thurloat](https://github.com/thurloat)
 * [aaribaud](https://github.com/aaribaud)
+* [pointlessone](https://github.com/pointlessone)
 * [Andrew](mailto:andrewlchronister@gmail.com)
 * [estuans](https://github.com/estuans)
-* [BenLubar](https://github.com/BenLubar)
 * [dissolve](https://github.com/dissolve)
 * [PurpleBooth](https://github.com/PurpleBooth)
 * [bradurani](https://github.com/bradurani)
@@ -216,6 +219,7 @@ and provided thanks to the work of the following contributors:
 * [ErikXXon](https://github.com/ErikXXon)
 * [ian-kelling](https://github.com/ian-kelling)
 * [immae](https://github.com/immae)
+* [J0WI](https://github.com/J0WI)
 * [foozmeat](https://github.com/foozmeat)
 * [jasonrhodes](https://github.com/jasonrhodes)
 * [Jason Snell](mailto:jason@newrelic.com)
@@ -230,6 +234,7 @@ and provided thanks to the work of the following contributors:
 * [Lorenz Diener](mailto:halcyon@icosahedron.website)
 * [alimony](https://github.com/alimony)
 * [mig5](https://github.com/mig5)
+* [moritzheiber](https://github.com/moritzheiber)
 * [ndarville](https://github.com/ndarville)
 * [Abzol](https://github.com/Abzol)
 * [pwoolcoc](https://github.com/pwoolcoc)
@@ -238,6 +243,7 @@ and provided thanks to the work of the following contributors:
 * [ignisf](https://github.com/ignisf)
 * [raymestalez](https://github.com/raymestalez)
 * [remram44](https://github.com/remram44)
+* [sts10](https://github.com/sts10)
 * [sascha-sl](https://github.com/sascha-sl)
 * [u1-liquid](https://github.com/u1-liquid)
 * [sim6](https://github.com/sim6)
@@ -288,6 +294,7 @@ and provided thanks to the work of the following contributors:
 * [857b](https://github.com/857b)
 * [insom](https://github.com/insom)
 * [tachyons](https://github.com/tachyons)
+* [acid-chicken](https://github.com/acid-chicken)
 * [Esteth](https://github.com/Esteth)
 * [unascribed](https://github.com/unascribed)
 * [Aguay-val](https://github.com/Aguay-val)
@@ -297,7 +304,6 @@ and provided thanks to the work of the following contributors:
 * [unleashed](https://github.com/unleashed)
 * [alxrcs](https://github.com/alxrcs)
 * [console-cowboy](https://github.com/console-cowboy)
-* [pointlessone](https://github.com/pointlessone)
 * [Alkarex](https://github.com/Alkarex)
 * [a2](https://github.com/a2)
 * [0xa](https://github.com/0xa)
@@ -329,6 +335,7 @@ and provided thanks to the work of the following contributors:
 * [Motoma](https://github.com/Motoma)
 * [chriswk](https://github.com/chriswk)
 * [csu](https://github.com/csu)
+* [clarcharr](https://github.com/clarcharr)
 * [kklleemm](https://github.com/kklleemm)
 * [colindean](https://github.com/colindean)
 * [dachinat](https://github.com/dachinat)
@@ -356,6 +363,7 @@ and provided thanks to the work of the following contributors:
 * [espenronnevik](https://github.com/espenronnevik)
 * [Finariel](https://github.com/Finariel)
 * [siuying](https://github.com/siuying)
+* [zoc](https://github.com/zoc)
 * [fwenzel](https://github.com/fwenzel)
 * [GenbuHase](https://github.com/GenbuHase)
 * [hattori6789](https://github.com/hattori6789)
@@ -416,6 +424,7 @@ and provided thanks to the work of the following contributors:
 * [martymcguire](https://github.com/martymcguire)
 * [marvinkopf](https://github.com/marvinkopf)
 * [otsune](https://github.com/otsune)
+* [mbugowski](https://github.com/mbugowski)
 * [Mathias B](mailto:10813340+mathias-b@users.noreply.github.com)
 * [matt-auckland](https://github.com/matt-auckland)
 * [webroo](https://github.com/webroo)
@@ -434,7 +443,6 @@ and provided thanks to the work of the following contributors:
 * [premist](https://github.com/premist)
 * [Mnkai](https://github.com/Mnkai)
 * [mitchhentges](https://github.com/mitchhentges)
-* [moritzheiber](https://github.com/moritzheiber)
 * [mouse-reeve](https://github.com/mouse-reeve)
 * [Mozinet-fr](https://github.com/Mozinet-fr)
 * [lae](https://github.com/lae)
@@ -458,17 +466,17 @@ and provided thanks to the work of the following contributors:
 * [Pangoraw](https://github.com/Pangoraw)
 * [peterkeen](https://github.com/peterkeen)
 * [pgate](https://github.com/pgate)
-* [retokromer](https://github.com/retokromer)
-* [rfwatson](https://github.com/rfwatson)
-* [rfreebern](https://github.com/rfreebern)
+* [Reto Kromer](mailto:retokromer@users.noreply.github.com)
+* [Rey Tucker](mailto:git@reytucker.us)
+* [Rob Watson](mailto:rfwatson@users.noreply.github.com)
+* [Ryan Freebern](mailto:ryan@freebern.org)
 * [Ryan Wade](mailto:ryan.wade@protonmail.com)
-* [sylph01](https://github.com/sylph01)
-* [S-H-GAMELINKS](https://github.com/S-H-GAMELINKS)
-* [staticsafe](https://github.com/staticsafe)
-* [snwh](https://github.com/snwh)
-* [sts10](https://github.com/sts10)
-* [skoji](https://github.com/skoji)
-* [ScienJus](https://github.com/ScienJus)
+* [Ryo Kajiwara](mailto:kfe-fecn6.prussian@s01.info)
+* [S.H](mailto:gamelinks007@gmail.com)
+* [Sadiq Saif](mailto:staticsafe@users.noreply.github.com)
+* [Sam Hewitt](mailto:hewittsamuel@gmail.com)
+* [Satoshi KOJIMA](mailto:skoji@mac.com)
+* [ScienJus](mailto:i@scienjus.com)
 * [Scott Larkin](mailto:scott@codeclimate.com)
 * [Sebastian Hübner](mailto:imolein@users.noreply.github.com)
 * [Sebastian Morr](mailto:sebastian@morr.cc)
@@ -483,6 +491,7 @@ and provided thanks to the work of the following contributors:
 * [Sir-Boops](mailto:admin@boops.me)
 * [Soshi Kato](mailto:mail@sossii.com)
 * [Spanky](mailto:2788886+spankyworks@users.noreply.github.com)
+* [Stanislas](mailto:angristan@pm.me)
 * [StefOfficiel](mailto:pichard.stephane@free.fr)
 * [Steven Tappert](mailto:admin@dark-it.net)
 * [Svetlozar Todorov](mailto:svetlik@users.noreply.github.com)
@@ -532,6 +541,7 @@ and provided thanks to the work of the following contributors:
 * [fsubal](mailto:fsubal@users.noreply.github.com)
 * [fusshi-](mailto:dikky1218@users.noreply.github.com)
 * [gentaro](mailto:gentaroooo@gmail.com)
+* [gol-cha](mailto:info@mevo.xyz)
 * [hakoai](mailto:hk--76@qa2.so-net.ne.jp)
 * [haosbvnker](mailto:github@chaosbunker.com)
 * [isati](mailto:phil@juchnowi.cz)
@@ -549,12 +559,12 @@ and provided thanks to the work of the following contributors:
 * [luzpaz](mailto:luzpaz@users.noreply.github.com)
 * [maxypy](mailto:maxime@mpigou.fr)
 * [mhe](mailto:mail@marcus-herrmann.com)
+* [mike castleman](mailto:m@mlcastle.net)
 * [mimikun](mailto:dzdzble_effort_311@outlook.jp)
 * [mshrtkch](mailto:mshrtkch@users.noreply.github.com)
 * [muan](mailto:muan@github.com)
 * [namelessGonbai](mailto:43787036+namelessgonbai@users.noreply.github.com)
 * [neetshin](mailto:neetshin@neetsh.in)
-* [nightpool](mailto:nightpool@users.noreply.github.com)
 * [rch850](mailto:rich850@gmail.com)
 * [roikale](mailto:roikale@users.noreply.github.com)
 * [rysiekpl](mailto:rysiek@hackerspace.pl)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cfb6b15f5a..f3356d5422 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,47 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## [2.7.2] - 2019-02-17
+### Added
+
+- Add support for IPv6 in e-mail validation ([zoc](https://github.com/tootsuite/mastodon/pull/10009))
+- Add record of IP address used for signing up ([ThibG](https://github.com/tootsuite/mastodon/pull/10026))
+- Add tight rate-limit for API deletions (30 per 30 minutes) ([Gargron](https://github.com/tootsuite/mastodon/pull/10042))
+- Add support for embedded `Announce` objects attributed to the same actor ([ThibG](https://github.com/tootsuite/mastodon/pull/9998), [Gargron](https://github.com/tootsuite/mastodon/pull/10065))
+- Add spam filter for `Create` and `Announce` activities ([Gargron](https://github.com/tootsuite/mastodon/pull/10005), [Gargron](https://github.com/tootsuite/mastodon/pull/10041), [Gargron](https://github.com/tootsuite/mastodon/pull/10062))
+- Add `registrations` attribute to `GET /api/v1/instance` ([Gargron](https://github.com/tootsuite/mastodon/pull/10060))
+- Add `vapid_key` to `POST /api/v1/apps` and `GET /api/v1/apps/verify_credentials` ([Gargron](https://github.com/tootsuite/mastodon/pull/10058))
+
+### Fixed
+
+- Fix link color and add link underlines in high-contrast theme ([Gargron](https://github.com/tootsuite/mastodon/pull/9949), [Gargron](https://github.com/tootsuite/mastodon/pull/10028))
+- Fix unicode characters in URLs not being linkified ([JMendyk](https://github.com/tootsuite/mastodon/pull/8447), [hinaloe](https://github.com/tootsuite/mastodon/pull/9991))
+- Fix URLs linkifier grabbing ending quotation as part of the link ([Gargron](https://github.com/tootsuite/mastodon/pull/9997))
+- Fix authorized applications page design ([rinsuki](https://github.com/tootsuite/mastodon/pull/9969))
+- Fix custom emojis not showing up in share page emoji picker ([rinsuki](https://github.com/tootsuite/mastodon/pull/9970))
+- Fix too liberal application of whitespace in toots ([trwnh](https://github.com/tootsuite/mastodon/pull/9968))
+- Fix misleading e-mail hint being displayed in admin view ([ThibG](https://github.com/tootsuite/mastodon/pull/9973))
+- Fix tombstones not being cleared out ([abcang](https://github.com/tootsuite/mastodon/pull/9978))
+- Fix some timeline jumps ([ThibG](https://github.com/tootsuite/mastodon/pull/9982), [ThibG](https://github.com/tootsuite/mastodon/pull/10001), [rinsuki](https://github.com/tootsuite/mastodon/pull/10046))
+- Fix content warning input taking keyboard focus even when hidden ([hinaloe](https://github.com/tootsuite/mastodon/pull/10017))
+- Fix hashtags select styling in default and high-contrast themes ([Gargron](https://github.com/tootsuite/mastodon/pull/10029))
+- Fix style regressions on landing page ([Gargron](https://github.com/tootsuite/mastodon/pull/10030))
+- Fix hashtag column not subscribing to stream on mount ([Gargron](https://github.com/tootsuite/mastodon/pull/10040))
+- Fix relay enabling/disabling not resetting inbox availability status ([Gargron](https://github.com/tootsuite/mastodon/pull/10048))
+- Fix mutes, blocks, domain blocks and follow requests not paginating ([Gargron](https://github.com/tootsuite/mastodon/pull/10057))
+- Fix crash on public hashtag pages when streaming fails ([ThibG](https://github.com/tootsuite/mastodon/pull/10061))
+
+### Changed
+
+- Change icon for unlisted visibility level ([clarcharr](https://github.com/tootsuite/mastodon/pull/9952))
+- Change queue of actor deletes from push to pull for non-follower recipients ([ThibG](https://github.com/tootsuite/mastodon/pull/10016))
+- Change robots.txt to exclude media proxy URLs ([nightpool](https://github.com/tootsuite/mastodon/pull/10038))
+- Change upload description input to allow line breaks ([BenLubar](https://github.com/tootsuite/mastodon/pull/10036))
+- Change `dist/mastodon-streaming.service` to recommend running node without intermediary npm command ([nolanlawson](https://github.com/tootsuite/mastodon/pull/10032))
+- Change conversations to always show names of other participants ([Gargron](https://github.com/tootsuite/mastodon/pull/10047))
+- Change buttons on timeline preview to open the interaction dialog ([Gargron](https://github.com/tootsuite/mastodon/pull/10054))
+- Change error graphic to hover-to-play ([Gargron](https://github.com/tootsuite/mastodon/pull/10055))
+
 ## [2.7.1] - 2019-01-28
 ### Fixed
 
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index cf32e2f637..81dd253ae9 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,7 +13,7 @@ module Mastodon
     end
 
     def patch
-      1
+      2
     end
 
     def pre
-- 
GitLab


From d1d7d14f77733be2e0938488752e94d65eedc6aa Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 18 Feb 2019 00:10:21 +0100
Subject: [PATCH 104/192] Fix video player width not being updated to fit
 container width (#10069)

---
 app/javascript/mastodon/features/video/index.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/javascript/mastodon/features/video/index.js b/app/javascript/mastodon/features/video/index.js
index 894fe78d9e..55dd249e14 100644
--- a/app/javascript/mastodon/features/video/index.js
+++ b/app/javascript/mastodon/features/video/index.js
@@ -347,7 +347,6 @@ class Video extends React.PureComponent {
       width  = containerWidth;
       height = containerWidth / (16/9);
 
-      playerStyle.width  = width;
       playerStyle.height = height;
     }
 
-- 
GitLab


From d974988541237419495e86b534f63259a28d0642 Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Sun, 17 Feb 2019 21:58:02 +0100
Subject: [PATCH 105/192] Fix video player width not being updated to fit
 container width

---
 app/javascript/flavours/glitch/features/video/index.js | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/features/video/index.js b/app/javascript/flavours/glitch/features/video/index.js
index a6f651db65..cf66536c41 100644
--- a/app/javascript/flavours/glitch/features/video/index.js
+++ b/app/javascript/flavours/glitch/features/video/index.js
@@ -366,7 +366,6 @@ export default class Video extends React.PureComponent {
       width  = containerWidth;
       height = containerWidth / (16/9);
 
-      playerStyle.width  = width;
       playerStyle.height = height;
     } else if (inline) {
       return (<div className={computedClass} ref={this.setPlayerRef} tabindex={0}></div>);
-- 
GitLab


From 2f7f6af26a40fb9981c99d131cf021c71f24fb99 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 18 Feb 2019 13:37:13 +0100
Subject: [PATCH 106/192] =?UTF-8?q?Hide=20domain=20filter=20in=20admin=20p?=
 =?UTF-8?q?age=20when=20=E2=80=9Clocal=E2=80=9D=20filter=20is=20active=20(?=
 =?UTF-8?q?#10074)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Since the “domain” field is ignored in this case.
---
 app/views/admin/accounts/index.html.haml | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml
index 91fddadf81..345f74f909 100644
--- a/app/views/admin/accounts/index.html.haml
+++ b/app/views/admin/accounts/index.html.haml
@@ -26,8 +26,9 @@
         = hidden_field_tag key, params[key]
 
     - %i(username by_domain display_name email ip).each do |key|
-      .input.string.optional
-        = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}")
+      - unless key == :by_domain && params[:remote].blank?
+        .input.string.optional
+          = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.accounts.#{key}")
 
     .actions
       %button= t('admin.accounts.search')
-- 
GitLab


From 6840a77711b2d536b9227b5a96ec565117d80205 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 18 Feb 2019 14:59:19 +0100
Subject: [PATCH 107/192] Add domain search/filter to the "Federation"
 (/admin/instances) page (#10071)

---
 app/controllers/admin/instances_controller.rb |  2 +-
 app/helpers/admin/filter_helper.rb            |  2 +-
 app/models/domain_block.rb                    |  2 ++
 app/models/instance_filter.rb                 |  8 ++++++--
 app/views/admin/instances/index.html.haml     | 14 ++++++++++++++
 config/locales/en.yml                         |  1 +
 6 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/app/controllers/admin/instances_controller.rb b/app/controllers/admin/instances_controller.rb
index 431ce6f4de..6dd659a304 100644
--- a/app/controllers/admin/instances_controller.rb
+++ b/app/controllers/admin/instances_controller.rb
@@ -38,7 +38,7 @@ module Admin
     end
 
     def filter_params
-      params.permit(:limited)
+      params.permit(:limited, :by_domain)
     end
   end
 end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 97beb587fc..275b5f2fe0 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -6,7 +6,7 @@ module Admin::FilterHelper
   INVITE_FILTER        = %i(available expired).freeze
   CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
   TAGS_FILTERS         = %i(hidden).freeze
-  INSTANCES_FILTERS    = %i(limited).freeze
+  INSTANCES_FILTERS    = %i(limited by_domain).freeze
 
   FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS + INVITE_FILTER + CUSTOM_EMOJI_FILTERS + TAGS_FILTERS + INSTANCES_FILTERS
 
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index 1064ea7c8f..069cda3673 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -24,6 +24,8 @@ class DomainBlock < ApplicationRecord
   has_many :accounts, foreign_key: :domain, primary_key: :domain
   delegate :count, to: :accounts, prefix: true
 
+  scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) }
+
   def self.blocked?(domain)
     where(domain: domain, severity: :suspend).exists?
   end
diff --git a/app/models/instance_filter.rb b/app/models/instance_filter.rb
index 3483d8cd6e..848fff53e1 100644
--- a/app/models/instance_filter.rb
+++ b/app/models/instance_filter.rb
@@ -9,9 +9,13 @@ class InstanceFilter
 
   def results
     if params[:limited].present?
-      DomainBlock.order(id: :desc)
+      scope = DomainBlock
+      scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present?
+      scope.order(id: :desc)
     else
-      Account.remote.by_domain_accounts
+      scope = Account.remote
+      scope = scope.matches_domain(params[:by_domain]) if params[:by_domain].present?
+      scope.by_domain_accounts
     end
   end
 end
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index ce35b5db47..2a5af3b5d6 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -11,6 +11,20 @@
   %div{ style: 'flex: 1 1 auto; text-align: right' }
     = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
 
+= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
+  .fields-group
+    - Admin::FilterHelper::INSTANCES_FILTERS.each do |key|
+      - if params[key].present?
+        = hidden_field_tag key, params[key]
+
+    - %i(by_domain).each do |key|
+      .input.string.optional
+        = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}")
+
+    .actions
+      %button= t('admin.accounts.search')
+      = link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative'
+
 %hr.spacer/
 
 - @instances.each do |instance|
diff --git a/config/locales/en.yml b/config/locales/en.yml
index dacf16d563..7363a7457f 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -302,6 +302,7 @@ en:
       back_to_account: Back To Account
       title: "%{acct}'s Followers"
     instances:
+      by_domain: Domain
       delivery_available: Delivery is available
       known_accounts:
         one: "%{count} known account"
-- 
GitLab


From 3a8cb6c73715919a61709bd7ce67fc5ec8d192f9 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 18 Feb 2019 14:59:46 +0100
Subject: [PATCH 108/192] Add quick link from admin account view to
 block/unblock instance (#10073)

---
 app/views/admin/accounts/show.html.haml | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 280a834ba2..7ac73bd072 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -166,6 +166,12 @@
       - else
         = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@account.id, type: 'suspend'), class: 'button button--destructive' if can?(:suspend, @account)
 
+      - unless @account.local?
+        - if DomainBlock.where(domain: @account.domain).exists?
+          = link_to t('admin.domain_blocks.undo'), admin_instance_path(@account.domain), class: 'button'
+        - else
+          = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @account.domain), class: 'button button--destructive'
+
   %hr.spacer/
 
   - unless @warnings.empty?
-- 
GitLab


From be9352266c9ec7595c6354a8d98c990a2dc91bf8 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Thu, 14 Feb 2019 15:46:42 +0100
Subject: [PATCH 109/192] Fix hashtag column not subscribing to stream on mount
 (#10040)

Fix #9895
---
 .../glitch/features/hashtag_timeline/index.js   | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
index d04e9cafa7..21efaceea6 100644
--- a/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/hashtag_timeline/index.js
@@ -40,15 +40,19 @@ export default class HashtagTimeline extends React.PureComponent {
 
   title = () => {
     let title = [this.props.params.id];
+
     if (this.additionalFor('any')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);
+      title.push(' ', <FormattedMessage key='any' id='hashtag.column_header.tag_mode.any'  values={{ additional: this.additionalFor('any') }} defaultMessage='or {additional}' />);
     }
+
     if (this.additionalFor('all')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);
+      title.push(' ', <FormattedMessage key='all' id='hashtag.column_header.tag_mode.all'  values={{ additional: this.additionalFor('all') }} defaultMessage='and {additional}' />);
     }
+
     if (this.additionalFor('none')) {
-      title.push(' ', <FormattedMessage id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);
+      title.push(' ', <FormattedMessage key='none' id='hashtag.column_header.tag_mode.none' values={{ additional: this.additionalFor('none') }} defaultMessage='without {additional}' />);
     }
+
     return title;
   }
 
@@ -76,9 +80,10 @@ export default class HashtagTimeline extends React.PureComponent {
     let all  = (tags.all || []).map(tag => tag.value);
     let none = (tags.none || []).map(tag => tag.value);
 
-    [id, ...any].map((tag) => {
-      this.disconnects.push(dispatch(connectHashtagStream(id, tag, (status) => {
+    [id, ...any].map(tag => {
+      this.disconnects.push(dispatch(connectHashtagStream(id, tag, status => {
         let tags = status.tags.map(tag => tag.name);
+
         return all.filter(tag => tags.includes(tag)).length === all.length &&
                none.filter(tag => tags.includes(tag)).length === 0;
       })));
@@ -94,12 +99,14 @@ export default class HashtagTimeline extends React.PureComponent {
     const { dispatch } = this.props;
     const { id, tags } = this.props.params;
 
+    this._subscribe(dispatch, id, tags);
     dispatch(expandHashtagTimeline(id, { tags }));
   }
 
   componentWillReceiveProps (nextProps) {
     const { dispatch, params } = this.props;
     const { id, tags } = nextProps.params;
+
     if (id !== params.id || !isEqual(tags, params.tags)) {
       this._unsubscribe();
       this._subscribe(dispatch, id, tags);
-- 
GitLab


From 896beb16c5318b8ce59867a06545ae6a00ccc84c Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Mon, 18 Feb 2019 19:29:32 +0100
Subject: [PATCH 110/192] [Glitch] Internationalize unexpected error message

Port 4e71b104e6d5f02069120c7a56b26888c6f0fef5 to glitch-soc,
fixing a crash in the process
---
 .../ui/containers/notifications_container.js  | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
index 88d482bcf2..283aa2373d 100644
--- a/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
+++ b/app/javascript/flavours/glitch/features/ui/containers/notifications_container.js
@@ -1,11 +1,22 @@
+import { injectIntl } from 'react-intl';
 import { connect } from 'react-redux';
 import { NotificationStack } from 'react-notification';
 import { dismissAlert } from 'flavours/glitch/actions/alerts';
 import { getAlerts } from 'flavours/glitch/selectors';
 
-const mapStateToProps = state => ({
-  notifications: getAlerts(state),
-});
+const mapStateToProps = (state, { intl }) => {
+  const notifications = getAlerts(state);
+
+  notifications.forEach(notification => ['title', 'message'].forEach(key => {
+    const value = notification[key];
+
+    if (typeof value === 'object') {
+      notification[key] = intl.formatMessage(value);
+    }
+  }));
+
+  return { notifications };
+};
 
 const mapDispatchToProps = (dispatch) => {
   return {
@@ -15,4 +26,4 @@ const mapDispatchToProps = (dispatch) => {
   };
 };
 
-export default connect(mapStateToProps, mapDispatchToProps)(NotificationStack);
+export default injectIntl(connect(mapStateToProps, mapDispatchToProps)(NotificationStack));
-- 
GitLab


From 359d26a05345895f295a91b7728fe711cd280f84 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Tue, 19 Feb 2019 14:01:22 +0100
Subject: [PATCH 111/192] =?UTF-8?q?Fix=20=E2=80=9Creset=E2=80=9D=20button?=
 =?UTF-8?q?=20of=20instance=20filter=20switching=20to=20custom=20emoji=20a?=
 =?UTF-8?q?dmin=20panel=20(#10076)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/views/admin/instances/index.html.haml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index 2a5af3b5d6..2359271407 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -23,7 +23,7 @@
 
     .actions
       %button= t('admin.accounts.search')
-      = link_to t('admin.accounts.reset'), admin_custom_emojis_path, class: 'button negative'
+      = link_to t('admin.accounts.reset'), admin_instances_path, class: 'button negative'
 
 %hr.spacer/
 
-- 
GitLab


From 8e7fc7ec73c0743df378403ad2e704c9fae70400 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Tue, 19 Feb 2019 20:00:41 +0100
Subject: [PATCH 112/192] Fix crash when conversations have no valid
 participants (#10078)

* Never return empty participants for conversations

Fixes #10068

* Fix client-side crash when conversations have no participants
---
 app/javascript/mastodon/components/display_name.js | 2 +-
 app/javascript/mastodon/components/status.js       | 2 +-
 app/models/account_conversation.rb                 | 3 ++-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/app/javascript/mastodon/components/display_name.js b/app/javascript/mastodon/components/display_name.js
index 32809778ae..6b9dd6f81b 100644
--- a/app/javascript/mastodon/components/display_name.js
+++ b/app/javascript/mastodon/components/display_name.js
@@ -22,7 +22,7 @@ export default class DisplayName extends React.PureComponent {
         suffix = `+${others.size - 2}`;
       }
     } else {
-      if (others) {
+      if (others && others.size > 0) {
         account = others.first();
       } else {
         account = this.props.account;
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 3e98d374b8..6270d3c92b 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -326,7 +326,7 @@ class Status extends ImmutablePureComponent {
       );
     }
 
-    if (otherAccounts) {
+    if (otherAccounts && otherAccounts.size > 0) {
       statusAvatar = <AvatarComposite accounts={otherAccounts} size={48} />;
     } else if (account === undefined || account === null) {
       statusAvatar = <Avatar account={status.get('account')} size={48} />;
diff --git a/app/models/account_conversation.rb b/app/models/account_conversation.rb
index cc6b392798..0c03747e2a 100644
--- a/app/models/account_conversation.rb
+++ b/app/models/account_conversation.rb
@@ -30,7 +30,8 @@ class AccountConversation < ApplicationRecord
     if participant_account_ids.empty?
       [account]
     else
-      Account.where(id: participant_account_ids)
+      participants = Account.where(id: participant_account_ids)
+      participants.empty? ? [account] : participants
     end
   end
 
-- 
GitLab


From b8acdfedf1ccd4d235eb9bfc2cd3f1e9c8c82c71 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 20 Feb 2019 15:55:50 +0900
Subject: [PATCH 113/192] Bump oj from 3.7.8 to 3.7.9 (#10082)

Bumps [oj](https://github.com/ohler55/oj) from 3.7.8 to 3.7.9.
- [Release notes](https://github.com/ohler55/oj/releases)
- [Changelog](https://github.com/ohler55/oj/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ohler55/oj/compare/v3.7.8...v3.7.9)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 1e4f085a9a..1bfd5a1451 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -363,7 +363,7 @@ GEM
       concurrent-ruby (~> 1.0, >= 1.0.2)
       sidekiq (>= 3.5)
       statsd-ruby (~> 1.4, >= 1.4.0)
-    oj (3.7.8)
+    oj (3.7.9)
     omniauth (1.9.0)
       hashie (>= 3.4.6, < 3.7.0)
       rack (>= 1.6.2, < 3)
-- 
GitLab


From addc8393e27268092980dc30dd589a8f33fe5227 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 20 Feb 2019 15:56:12 +0900
Subject: [PATCH 114/192] Bump pkg-config from 1.3.3 to 1.3.4 (#10081)

Bumps [pkg-config](https://github.com/ruby-gnome2/pkg-config) from 1.3.3 to 1.3.4.
- [Release notes](https://github.com/ruby-gnome2/pkg-config/releases)
- [Changelog](https://github.com/ruby-gnome2/pkg-config/blob/master/NEWS)
- [Commits](https://github.com/ruby-gnome2/pkg-config/compare/1.3.3...1.3.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 1bfd5a1451..dd446869f1 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -400,7 +400,7 @@ GEM
     pg (1.1.4)
     pghero (2.2.0)
       activerecord
-    pkg-config (1.3.3)
+    pkg-config (1.3.4)
     powerpack (0.1.2)
     premailer (1.11.1)
       addressable
-- 
GitLab


From aa6a4b7b8aa55383f7cecbd9bc9cd2db1db13596 Mon Sep 17 00:00:00 2001
From: Daigo 3 Dango <zunda@users.noreply.github.com>
Date: Wed, 20 Feb 2019 10:57:08 +0000
Subject: [PATCH 115/192] Upgrade Ruby to 2.6.1 (#9956)

---
 .ruby-version | 2 +-
 Gemfile.lock  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/.ruby-version b/.ruby-version
index e70b4523ae..6a6a3d8e35 100644
--- a/.ruby-version
+++ b/.ruby-version
@@ -1 +1 @@
-2.6.0
+2.6.1
diff --git a/Gemfile.lock b/Gemfile.lock
index dd446869f1..a4691cbdf0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -771,7 +771,7 @@ DEPENDENCIES
   webpush
 
 RUBY VERSION
-   ruby 2.6.0p0
+   ruby 2.6.1p33
 
 BUNDLED WITH
    1.17.3
-- 
GitLab


From 4340d338fd2aa5665ffb2eb0cd54d689997234fe Mon Sep 17 00:00:00 2001
From: Hinaloe <hina@hinaloe.net>
Date: Thu, 21 Feb 2019 01:47:38 +0900
Subject: [PATCH 116/192] correct opt-out showing application (#10086)

* correct opt-out showing application

refs #9994

* Revert "correct opt-out showing application"

This reverts commit 0e9bb70f145be42962416a6b87c08d59a2896486.

* User#shows_application? calls wrong value
---
 app/models/user.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/models/user.rb b/app/models/user.rb
index 7432e3da88..83816def57 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -245,7 +245,7 @@ class User < ApplicationRecord
   end
 
   def shows_application?
-    @shows_application ||= settings.shows_application
+    @shows_application ||= settings.show_application
   end
 
   def token_for_app(a)
-- 
GitLab


From 738c03421323fdc3b474307961fdaf1dbc0c37f8 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Thu, 21 Feb 2019 19:36:48 +0100
Subject: [PATCH 117/192] Do not error out when performing admin actions on no
 statuses (#10094)

Same as #8220 but for reports
---
 app/controllers/admin/reported_statuses_controller.rb | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/controllers/admin/reported_statuses_controller.rb b/app/controllers/admin/reported_statuses_controller.rb
index d3c2f5e9e9..3ba9f5df21 100644
--- a/app/controllers/admin/reported_statuses_controller.rb
+++ b/app/controllers/admin/reported_statuses_controller.rb
@@ -10,6 +10,10 @@ module Admin
       @form         = Form::StatusBatch.new(form_status_batch_params.merge(current_account: current_account, action: action_from_button))
       flash[:alert] = I18n.t('admin.statuses.failed_to_execute') unless @form.save
 
+      redirect_to admin_report_path(@report)
+    rescue ActionController::ParameterMissing
+      flash[:alert] = I18n.t('admin.statuses.no_status_selected')
+
       redirect_to admin_report_path(@report)
     end
 
-- 
GitLab


From 4532833498aca159e22ba43f47f705da39170cf5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Fri, 22 Feb 2019 20:06:01 +0900
Subject: [PATCH 118/192] Bump pry-byebug from 3.6.0 to 3.7.0 (#10098)

Bumps [pry-byebug](https://github.com/deivid-rodriguez/pry-byebug) from 3.6.0 to 3.7.0.
- [Release notes](https://github.com/deivid-rodriguez/pry-byebug/releases)
- [Changelog](https://github.com/deivid-rodriguez/pry-byebug/blob/master/CHANGELOG.md)
- [Commits](https://github.com/deivid-rodriguez/pry-byebug/compare/v3.6.0...v3.7.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 8 ++++----
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/Gemfile b/Gemfile
index e01d168b63..3309be52be 100644
--- a/Gemfile
+++ b/Gemfile
@@ -97,7 +97,7 @@ group :development, :test do
   gem 'fabrication', '~> 2.20'
   gem 'fuubar', '~> 2.3'
   gem 'i18n-tasks', '~> 0.9', require: false
-  gem 'pry-byebug', '~> 3.6'
+  gem 'pry-byebug', '~> 3.7'
   gem 'pry-rails', '~> 0.3'
   gem 'rspec-rails', '~> 3.8'
 end
diff --git a/Gemfile.lock b/Gemfile.lock
index a4691cbdf0..8d46764e78 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -109,7 +109,7 @@ GEM
     bundler-audit (0.6.1)
       bundler (>= 1.2.0, < 3)
       thor (~> 0.18)
-    byebug (10.0.2)
+    byebug (11.0.0)
     capistrano (3.11.0)
       airbrussh (>= 1.0.0)
       i18n
@@ -413,8 +413,8 @@ GEM
     pry (0.12.2)
       coderay (~> 1.1.0)
       method_source (~> 0.9.0)
-    pry-byebug (3.6.0)
-      byebug (~> 10.0)
+    pry-byebug (3.7.0)
+      byebug (~> 11.0)
       pry (~> 0.10)
     pry-rails (0.3.9)
       pry (>= 0.10.4)
@@ -729,7 +729,7 @@ DEPENDENCIES
   posix-spawn!
   premailer-rails
   private_address_check (~> 0.5)
-  pry-byebug (~> 3.6)
+  pry-byebug (~> 3.7)
   pry-rails (~> 0.3)
   puma (~> 3.12)
   pundit (~> 2.0)
-- 
GitLab


From d7ad42a8884d8d77d4a1c0240e629071e82ed996 Mon Sep 17 00:00:00 2001
From: Hinaloe <hina@hinaloe.net>
Date: Sat, 23 Feb 2019 00:52:04 +0900
Subject: [PATCH 119/192] Randomize emoji filename (#10090)

---
 app/controllers/admin/custom_emojis_controller.rb | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb
index d61bafdf02..f776991667 100644
--- a/app/controllers/admin/custom_emojis_controller.rb
+++ b/app/controllers/admin/custom_emojis_controller.rb
@@ -5,6 +5,9 @@ module Admin
     before_action :set_custom_emoji, except: [:index, :new, :create]
     before_action :set_filter_params
 
+    include ObfuscateFilename
+    obfuscate_filename [:custom_emoji, :image]
+
     def index
       authorize :custom_emoji, :index?
       @custom_emojis = filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page])
-- 
GitLab


From d82de360c13894746d3974d11c9505c8937ebdee Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Thu, 21 Feb 2019 21:13:12 +0100
Subject: [PATCH 120/192] Fix non-numeric account identifiers leading to
 /web/accounts/NaN
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

I'm not sure what purpose these “+” served?!
---
 app/javascript/flavours/glitch/components/status_header.js  | 2 +-
 app/javascript/flavours/glitch/components/status_prepend.js | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status_header.js b/app/javascript/flavours/glitch/components/status_header.js
index 65458e3f03..f9321904ca 100644
--- a/app/javascript/flavours/glitch/components/status_header.js
+++ b/app/javascript/flavours/glitch/components/status_header.js
@@ -19,7 +19,7 @@ export default class StatusHeader extends React.PureComponent {
   //  Handles clicks on account name/image
   handleAccountClick = (e) => {
     const { status, parseClick } = this.props;
-    parseClick(e, `/accounts/${+status.getIn(['account', 'id'])}`);
+    parseClick(e, `/accounts/${status.getIn(['account', 'id'])}`);
   }
 
   //  Rendering.
diff --git a/app/javascript/flavours/glitch/components/status_prepend.js b/app/javascript/flavours/glitch/components/status_prepend.js
index f4ef83135f..4e329f546e 100644
--- a/app/javascript/flavours/glitch/components/status_prepend.js
+++ b/app/javascript/flavours/glitch/components/status_prepend.js
@@ -15,7 +15,7 @@ export default class StatusPrepend extends React.PureComponent {
 
   handleClick = (e) => {
     const { account, parseClick } = this.props;
-    parseClick(e, `/accounts/${+account.get('id')}`);
+    parseClick(e, `/accounts/${account.get('id')}`);
   }
 
   Message = () => {
-- 
GitLab


From 3c86a7856f3e8a35b6bb05d79b4ddf96802ee459 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 23 Feb 2019 18:41:28 +0100
Subject: [PATCH 121/192] Weblate translations (2019-02-23) (#10103)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Translated using Weblate (Japanese)

Currently translated at 98,9% (354 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/

* Translated using Weblate (Greek)

Currently translated at 96,9% (739 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/

* Translated using Weblate (Greek)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/

* Translated using Weblate (Greek)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/

* Translated using Weblate (Greek)

Currently translated at 100,0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/el/

* Translated using Weblate (Czech)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

rename from "instance" to "server"

* Translated using Weblate (Czech)

Currently translated at 99,9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Translated using Weblate (Czech)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/cs/

* Translated using Weblate (Finnish)

Currently translated at 93,7% (59 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fi/

* Translated using Weblate (Finnish)

Currently translated at 87,4% (313 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Finnish)

Currently translated at 72,6% (554 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fi/

* Translated using Weblate (Galician)

Currently translated at 100,0% (763 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/

* Translated using Weblate (Galician)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/

* Translated using Weblate (Galician)

Currently translated at 100,0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/gl/

* Translated using Weblate (Galician)

Currently translated at 100,0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/

* Translated using Weblate (Slovak)

Currently translated at 96,9% (739 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Slovak)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sk/

* Translated using Weblate (Dutch)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Dutch)

Currently translated at 100,0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/

* Translated using Weblate (Dutch)

Currently translated at 100,0% (763 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Lithuanian)

Currently translated at 53.6% (409 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

* Translated using Weblate (Lithuanian)

Currently translated at 62.6% (478 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

Check if "Sign up" is changed.

* Translated using Weblate (Slovak)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sk/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (French)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/

* Translated using Weblate (Finnish)

Currently translated at 73.4% (560 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fi/

* Translated using Weblate (Lithuanian)

Currently translated at 66.7% (509 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

* Translated using Weblate (Finnish)

Currently translated at 89.1% (319 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fi/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Esperanto)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eo/

* Translated using Weblate (Finnish)

Currently translated at 47.7% (53 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fi/

* Translated using Weblate (Esperanto)

Currently translated at 80.2% (89 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eo/

* Translated using Weblate (French)

Currently translated at 97.3% (108 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/

* Translated using Weblate (Corsican)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (French)

Currently translated at 97.8% (746 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (Corsican)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/co/

* Translated using Weblate (Corsican)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/co/

* Translated using Weblate (Corsican)

Currently translated at 99.6% (760 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/

* Translated using Weblate (Corsican)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/co/

* Translated using Weblate (Occitan)

Currently translated at 96.4% (107 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/oc/

* Translated using Weblate (French)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fr/

* Translated using Weblate (Corsican)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/co/

* Translated using Weblate (French)

Currently translated at 99.6% (760 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (French)

Currently translated at 99.6% (760 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Occitan)

Currently translated at 98.2% (109 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/oc/

* Translated using Weblate (French)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/

* Translated using Weblate (Czech)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Translated using Weblate (French)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Turkish)

Currently translated at 29.8% (227 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/

* Added translation using Weblate (Turkish)

* Translated using Weblate (French)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/

* Translated using Weblate (Turkish)

Currently translated at 36.0% (275 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/

* Translated using Weblate (French)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/

* Translated using Weblate (Turkish)

Currently translated at 64.2% (230 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/tr/

* Translated using Weblate (Turkish)

Currently translated at 32.4% (36 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/tr/

* Added translation using Weblate (Turkish)

* Translated using Weblate (Turkish)

Currently translated at 12.7% (8 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/tr/

* Added translation using Weblate (Turkish)

* Translated using Weblate (Turkish)

Currently translated at 100.0% (2 of 2 strings)

Translation: Mastodon/Activerecord
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/tr/

* Translated using Weblate (Turkish)

Currently translated at 36.8% (281 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/

* Translated using Weblate (Turkish)

Currently translated at 9.2% (9 of 98 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/tr/

* Translated using Weblate (Turkish)

Currently translated at 64.2% (230 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/tr/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Turkish)

Currently translated at 40.0% (305 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/tr/

* Translated using Weblate (Basque)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/eu/

* Translated using Weblate (Greek)

Currently translated at 96.9% (739 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/el/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Basque)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/eu/

* Translated using Weblate (Basque)

Currently translated at 100.0% (763 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/eu/

* Translated using Weblate (Basque)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/eu/

* Translated using Weblate (German)

Currently translated at 100,0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/de/

* Translated using Weblate (German)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/

* Translated using Weblate (German)

Currently translated at 100,0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/

* Translated using Weblate (German)

Currently translated at 100,0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/de/

* Translated using Weblate (Arabic)

Currently translated at 95.5% (106 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

* Translated using Weblate (German)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/de/

* Translated using Weblate (German)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/de/

* Translated using Weblate (Danish)

Currently translated at 100,0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/da/

* Translated using Weblate (Arabic)

Currently translated at 95,5% (106 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ar/

يمكن ان تكون هاش تاج ايضا ؟؟

* Translated using Weblate (Arabic)

Currently translated at 98,9% (354 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ar/

* Translated using Weblate (Danish)

Currently translated at 82,9% (92 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/da/

* Translated using Weblate (Albanian)

Currently translated at 63.2% (482 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/sq/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Albanian)

Currently translated at 92.7% (332 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Albanian)

Currently translated at 93.9% (336 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Albanian)

Currently translated at 94.1% (337 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Albanian)

Currently translated at 66.7% (74 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/

* Translated using Weblate (Albanian)

Currently translated at 94.4% (338 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Greek)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/el/

* Translated using Weblate (Albanian)

Currently translated at 89.2% (99 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/

* Translated using Weblate (Albanian)

Currently translated at 92.8% (103 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/

* Translated using Weblate (Albanian)

Currently translated at 93.7% (104 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/

* Translated using Weblate (Albanian)

Currently translated at 79.9% (610 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Galician)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/

* Translated using Weblate (Albanian)

Currently translated at 88.9% (678 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Albanian)

Currently translated at 89.1% (680 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (763 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/

* Translated using Weblate (Albanian)

Currently translated at 93.1% (710 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Korean)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ko/

* Translated using Weblate (Korean)

Currently translated at 99.0% (755 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/

* Translated using Weblate (Korean)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ko/

* Translated using Weblate (Korean)

Currently translated at 100.0% (763 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ko/

* Translated using Weblate (Korean)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ko/

* Translated using Weblate (Albanian)

Currently translated at 96.1% (733 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Persian)

Currently translated at 94.1% (337 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/

* Translated using Weblate (Lithuanian)

Currently translated at 91.0% (694 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

* Translated using Weblate (Persian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/

* Translated using Weblate (Czech)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/cs/

* Translated using Weblate (Lithuanian)

Currently translated at 99.9% (762 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/lt/

* Translated using Weblate (Persian)

Currently translated at 85.3% (651 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/

* Translated using Weblate (Czech)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/cs/

* Translated using Weblate (Persian)

Currently translated at 100.0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fa/

* Translated using Weblate (Persian)

Currently translated at 88.7% (677 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/sq/

* Translated using Weblate (Albanian)

Currently translated at 97.5% (744 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Albanian)

Currently translated at 99.6% (760 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sq/

* Translated using Weblate (Albanian)

Currently translated at 100.0% (111 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/sq/

* Translated using Weblate (Slovak)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/sk/

* Translated using Weblate (Persian)

Currently translated at 99.7% (761 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fa/

* Translated using Weblate (Persian)

Currently translated at 100.0% (358 of 358 strings)

Translation: Mastodon/React
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fa/

* Translated using Weblate (Persian)

Currently translated at 81.1% (90 of 111 strings)

Translation: Mastodon/Preferences
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/fa/

* Added translation using Weblate (Kazakh)

* Added translation using Weblate (Kazakh)

* Translated using Weblate (Kazakh)

Currently translated at 48,5% (370 of 763 strings)

Translation: Mastodon/Backend
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/kk/

* Translated using Weblate (Kazakh)

Currently translated at 100,0% (2 of 2 strings)

Translation: Mastodon/Activerecord
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/activerecord/kk/

* Added translation using Weblate (Kazakh)

* Translated using Weblate (Kazakh)

Currently translated at 100,0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/kk/

* Added translation using Weblate (Kazakh)

* Added translation using Weblate (Kazakh)

* Translated using Weblate (Kazakh)

Currently translated at 100,0% (63 of 63 strings)

Translation: Mastodon/Devise
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/kk/

* Translated using Weblate (Kazakh)

Currently translated at 100,0% (98 of 98 strings)

Translation: Mastodon/Doorkeeper
Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/doorkeeper/kk/

* i18n-tasks normalize

* yarn manage:translations

* Fix inconsistent interpolations

* Add missing plural forms
---
 app/javascript/mastodon/locales/ar.json       |  33 +-
 app/javascript/mastodon/locales/ast.json      |   3 +
 app/javascript/mastodon/locales/bg.json       |   3 +
 app/javascript/mastodon/locales/ca.json       |   3 +
 app/javascript/mastodon/locales/co.json       |  13 +-
 app/javascript/mastodon/locales/cs.json       |  11 +-
 app/javascript/mastodon/locales/cy.json       |   3 +
 app/javascript/mastodon/locales/da.json       |   3 +
 app/javascript/mastodon/locales/de.json       |  13 +-
 .../mastodon/locales/defaultMessages.json     |  17 +
 app/javascript/mastodon/locales/el.json       |  13 +-
 app/javascript/mastodon/locales/en.json       |   3 +
 app/javascript/mastodon/locales/eo.json       |  63 +-
 app/javascript/mastodon/locales/es.json       |   3 +
 app/javascript/mastodon/locales/eu.json       |  13 +-
 app/javascript/mastodon/locales/fa.json       |  93 +-
 app/javascript/mastodon/locales/fi.json       |  27 +-
 app/javascript/mastodon/locales/fr.json       |  75 +-
 app/javascript/mastodon/locales/gl.json       |  11 +-
 app/javascript/mastodon/locales/he.json       |   3 +
 app/javascript/mastodon/locales/hr.json       |   3 +
 app/javascript/mastodon/locales/hu.json       |   3 +
 app/javascript/mastodon/locales/hy.json       |   3 +
 app/javascript/mastodon/locales/id.json       |   3 +
 app/javascript/mastodon/locales/io.json       |   3 +
 app/javascript/mastodon/locales/it.json       |   3 +
 app/javascript/mastodon/locales/ja.json       |   5 +-
 app/javascript/mastodon/locales/ka.json       |   3 +
 app/javascript/mastodon/locales/kk.json       | 363 ++++++++
 app/javascript/mastodon/locales/ko.json       |  11 +-
 app/javascript/mastodon/locales/lv.json       |   3 +
 app/javascript/mastodon/locales/ms.json       |   3 +
 app/javascript/mastodon/locales/nl.json       |  15 +-
 app/javascript/mastodon/locales/no.json       |   3 +
 app/javascript/mastodon/locales/oc.json       |   3 +
 app/javascript/mastodon/locales/pl.json       |   3 +
 app/javascript/mastodon/locales/pt-BR.json    |   3 +
 app/javascript/mastodon/locales/pt.json       |   3 +
 app/javascript/mastodon/locales/ro.json       |   3 +
 app/javascript/mastodon/locales/ru.json       |   3 +
 app/javascript/mastodon/locales/sk.json       |   7 +-
 app/javascript/mastodon/locales/sl.json       |   3 +
 app/javascript/mastodon/locales/sq.json       | 705 +++++++--------
 app/javascript/mastodon/locales/sr-Latn.json  |   3 +
 app/javascript/mastodon/locales/sr.json       |   3 +
 app/javascript/mastodon/locales/sv.json       |   3 +
 app/javascript/mastodon/locales/ta.json       |   3 +
 app/javascript/mastodon/locales/te.json       |   3 +
 app/javascript/mastodon/locales/th.json       |   3 +
 app/javascript/mastodon/locales/tr.json       | 195 ++--
 app/javascript/mastodon/locales/uk.json       |   3 +
 .../mastodon/locales/whitelist_kk.json        |   2 +
 app/javascript/mastodon/locales/zh-CN.json    |   3 +
 app/javascript/mastodon/locales/zh-HK.json    |   3 +
 app/javascript/mastodon/locales/zh-TW.json    |   3 +
 config/locales/activerecord.kk.yml            |  13 +
 config/locales/activerecord.tr.yml            |  13 +
 config/locales/co.yml                         |  53 +-
 config/locales/cs.yml                         |  31 +-
 config/locales/de.yml                         |  57 +-
 config/locales/devise.co.yml                  |   6 +-
 config/locales/devise.da.yml                  |   6 +-
 config/locales/devise.de.yml                  |   6 +-
 config/locales/devise.eu.yml                  |   6 +-
 config/locales/devise.fa.yml                  |   1 +
 config/locales/devise.fi.yml                  |   1 +
 config/locales/devise.fr.yml                  |  16 +-
 config/locales/devise.gl.yml                  |   6 +-
 config/locales/devise.kk.yml                  |  83 ++
 config/locales/devise.sq.yml                  |   6 +-
 config/locales/devise.tr.yml                  |  15 +
 config/locales/doorkeeper.kk.yml              | 142 +++
 config/locales/doorkeeper.tr.yml              |  19 +
 config/locales/el.yml                         |  13 +-
 config/locales/eu.yml                         |  53 +-
 config/locales/fa.yml                         | 133 ++-
 config/locales/fi.yml                         |  28 +-
 config/locales/fr.yml                         |  45 +-
 config/locales/gl.yml                         |  57 +-
 config/locales/kk.yml                         | 445 +++++++++
 config/locales/ko.yml                         |  49 +-
 config/locales/lt.yml                         | 849 +++++++++++++++++-
 config/locales/nl.yml                         |  21 +-
 config/locales/simple_form.ar.yml             |   7 +-
 config/locales/simple_form.co.yml             |   8 +-
 config/locales/simple_form.cs.yml             |   6 +
 config/locales/simple_form.da.yml             |   2 +-
 config/locales/simple_form.de.yml             |  10 +-
 config/locales/simple_form.el.yml             |   6 +
 config/locales/simple_form.eo.yml             |   4 +
 config/locales/simple_form.eu.yml             |   8 +-
 config/locales/simple_form.fa.yml             |   2 +
 config/locales/simple_form.fi.yml             |   3 +
 config/locales/simple_form.fr.yml             |   6 +
 config/locales/simple_form.gl.yml             |   8 +-
 config/locales/simple_form.ko.yml             |   8 +-
 config/locales/simple_form.nl.yml             |   6 +
 config/locales/simple_form.oc.yml             |   5 +-
 config/locales/simple_form.sk.yml             |   8 +-
 config/locales/simple_form.sq.yml             | 134 ++-
 config/locales/simple_form.tr.yml             |   4 +
 config/locales/sk.yml                         |  68 +-
 config/locales/sq.yml                         | 442 ++++++++-
 config/locales/tr.yml                         | 132 ++-
 104 files changed, 3959 insertions(+), 881 deletions(-)
 create mode 100644 app/javascript/mastodon/locales/kk.json
 create mode 100644 app/javascript/mastodon/locales/whitelist_kk.json
 create mode 100644 config/locales/activerecord.kk.yml
 create mode 100644 config/locales/activerecord.tr.yml
 create mode 100644 config/locales/devise.kk.yml
 create mode 100644 config/locales/devise.tr.yml
 create mode 100644 config/locales/doorkeeper.kk.yml
 create mode 100644 config/locales/doorkeeper.tr.yml
 create mode 100644 config/locales/kk.yml

diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 78e63e5e68..7de65f91fa 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "اضافو أو حذف مِن القوائم",
+  "account.add_or_remove_from_list": "أضيف/ي أو أحذف/ي من القائمة",
   "account.badges.bot": "روبوت",
   "account.block": "حظر @{name}",
   "account.block_domain": "إخفاء كل شيئ قادم من إسم النطاق {domain}",
@@ -8,30 +8,30 @@
   "account.disclaimer_full": "قد لا تعكس المعلومات أدناه الملف الشخصي الكامل للمستخدم.",
   "account.domain_blocked": "النطاق مخفي",
   "account.edit_profile": "تعديل الملف الشخصي",
-  "account.endorse": "إبرازه على الملف الشخصي",
+  "account.endorse": "خاصّية على الملف الشخصي",
   "account.follow": "تابِع",
-  "account.followers": "المتابعون",
+  "account.followers": "متابعون",
   "account.followers.empty": "لا أحد يتبع هذا الحساب بعد.",
   "account.follows": "يتبع",
-  "account.follows.empty": "هذا المستخدِم لا يتبع أحدًا بعد.",
+  "account.follows.empty": "هذا الحساب لا يتبع أحدًا بعد.",
   "account.follows_you": "يتابعك",
   "account.hide_reblogs": "إخفاء ترقيات @{name}",
-  "account.link_verified_on": "تم التحقق مِن مالك هذا الرابط بتاريخ {date}",
-  "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قُفل. فصاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.",
+  "account.link_verified_on": "تم التحقق مِن مِلْكية هذا الرابط بتاريخ {date}",
+  "account.locked_info": "تم تأمين خصوصية هذا الحساب عبر قفل. صاحب الحساب يُراجِع يدويا طلبات المتابَعة و الاشتراك بحسابه.",
   "account.media": "وسائط",
-  "account.mention": "أُذكُر @{name}",
+  "account.mention": "أُذكُر/ي @{name}",
   "account.moved_to": "{name} إنتقل إلى :",
-  "account.mute": "أكتم @{name}",
-  "account.mute_notifications": "كتم إخطارات @{name}",
+  "account.mute": "كتم @{name}",
+  "account.mute_notifications": "كتم الإخطارات من @{name}",
   "account.muted": "مكتوم",
   "account.posts": "التبويقات",
   "account.posts_with_replies": "التبويقات و الردود",
-  "account.report": "أبلغ عن @{name}",
-  "account.requested": "في انتظار الموافقة",
-  "account.share": "مشاركة @{name}'s profile",
+  "account.report": "أبلغ/ي عن @{name}",
+  "account.requested": "في انتظار الموافقة. اضْغَطْ/ي لإلغاء طلب المتابعة",
+  "account.share": "مشاركة حساب @{name}",
   "account.show_reblogs": "عرض ترقيات @{name}",
   "account.unblock": "إلغاء الحظر عن @{name}",
-  "account.unblock_domain": "فك حظر {domain}",
+  "account.unblock_domain": "فك الخْفى عن {domain}",
   "account.unendorse": "إزالة ترويجه مِن الملف الشخصي",
   "account.unfollow": "إلغاء المتابعة",
   "account.unmute": "إلغاء الكتم عن @{name}",
@@ -39,7 +39,7 @@
   "account.view_full_profile": "عرض الملف الشخصي كاملا",
   "alert.unexpected.message": "لقد طرأ هناك خطأ غير متوقّع.",
   "alert.unexpected.title": "المعذرة !",
-  "boost_modal.combo": "يمكنك ضغط {combo} لتخطّي هذه في المرّة القادمة",
+  "boost_modal.combo": "يمكنك/ي ضغط {combo} لتخطّي هذه في المرّة القادمة",
   "bundle_column_error.body": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.",
   "bundle_column_error.retry": "إعادة المحاولة",
   "bundle_column_error.title": "خطأ في الشبكة",
@@ -47,7 +47,7 @@
   "bundle_modal_error.message": "لقد وقع هناك خطأ أثناء عملية تحميل هذا العنصر.",
   "bundle_modal_error.retry": "إعادة المحاولة",
   "column.blocks": "الحسابات المحجوبة",
-  "column.community": "الخيط العام المحلي",
+  "column.community": "التَسَلْسُل الزَمني المحلي",
   "column.direct": "الرسائل المباشرة",
   "column.domain_blocks": "النطاقات المخفية",
   "column.favourites": "المفضلة",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "Ùˆ {additional}",
   "hashtag.column_header.tag_mode.any": "أو {additional}",
   "hashtag.column_header.tag_mode.none": "بدون {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "كلها",
   "hashtag.column_settings.tag_mode.any": "أي كان مِن هذه",
   "hashtag.column_settings.tag_mode.none": "لا شيء مِن هذه",
@@ -204,6 +206,7 @@
   "lists.account.remove": "إحذف من القائمة",
   "lists.delete": "Delete list",
   "lists.edit": "تعديل القائمة",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "إنشاء قائمة",
   "lists.new.title_placeholder": "عنوان القائمة الجديدة",
   "lists.search": "إبحث في قائمة الحسابات التي تُتابِعها",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index a94e235722..1e7ecb550b 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Desaniciar de la llista",
   "lists.delete": "Desaniciar la llista",
   "lists.edit": "Editar la llista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "Títulu nuevu de la llista",
   "lists.search": "Guetar ente la xente que sigues",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index a5ab165b75..9e5d46503d 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 8519590b75..8d1d4777b9 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "i {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_header.tag_mode.none": "sense {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Tots aquests",
   "hashtag.column_settings.tag_mode.any": "Qualsevol d’aquests",
   "hashtag.column_settings.tag_mode.none": "Cap d’aquests",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Treure de la llista",
   "lists.delete": "Delete list",
   "lists.edit": "Editar llista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Afegir llista",
   "lists.new.title_placeholder": "Nova llista",
   "lists.search": "Cercar entre les persones que segueixes",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index b4d8f9781f..c308d807a6 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Ùn avete manc'una lista. Quandu farete una, sarà mustrata quì.",
   "empty_column.mutes": "Per avà ùn avete manc'un utilizatore piattatu.",
   "empty_column.notifications": "Ùn avete ancu nisuna nutificazione. Interact with others to start the conversation.",
-  "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altre istanze per empie a linea pubblica",
+  "empty_column.public": "Ùn c'hè nunda quì! Scrivete qualcosa in pubblicu o seguitate utilizatori d'altri servori per empie a linea pubblica",
   "follow_request.authorize": "Auturizà",
   "follow_request.reject": "Righjittà",
   "getting_started.developers": "Sviluppatori",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "è {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_header.tag_mode.none": "senza {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Tutti quessi",
   "hashtag.column_settings.tag_mode.any": "Unu di quessi",
   "hashtag.column_settings.tag_mode.none": "Nisunu di quessi",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Toglie di a lista",
   "lists.delete": "Supprime a lista",
   "lists.edit": "Mudificà a lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Aghjustà una lista",
   "lists.new.title_placeholder": "Titulu di a lista",
   "lists.search": "Circà indè i vostr'abbunamenti",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "Favuriti",
   "navigation_bar.filters": "Parolle silenzate",
   "navigation_bar.follow_requests": "Dumande d'abbunamentu",
-  "navigation_bar.info": "À prupositu di l'istanza",
+  "navigation_bar.info": "À prupositu di u servore",
   "navigation_bar.keyboard_shortcuts": "Accorte cù a tastera",
   "navigation_bar.lists": "Liste",
   "navigation_bar.logout": "Scunnettassi",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Annullà",
   "report.forward": "Trasferisce à {target}",
   "report.forward_hint": "U contu hè nant'à un'altru servore. Vulete ancu mandà una copia anonima di u signalamentu quallà?",
-  "report.hint": "U signalamentu sarà mandatu à i muderatori di l'istanza. Pudete spiegà perchè avete palisatu stu contu quì sottu:",
+  "report.hint": "U signalamentu sarà mandatu à i muderatori di u servore. Pudete spiegà perchè avete palisatu stu contu quì sottu:",
   "report.placeholder": "Altri cummenti",
   "report.submit": "Mandà",
   "report.target": "Signalamentu",
@@ -297,7 +300,7 @@
   "status.block": "Bluccà @{name}",
   "status.cancel_reblog_private": "Ùn sparte più",
   "status.cannot_reblog": "Stu statutu ùn pò micca esse spartutu",
-  "status.copy": "Copy link to status",
+  "status.copy": "Cupià ligame indè u statutu",
   "status.delete": "Toglie",
   "status.detailed_status": "Vista in ditagliu di a cunversazione",
   "status.direct": "Mandà un missaghju @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.",
   "upload_area.title": "Drag & drop per caricà un fugliale",
   "upload_button.label": "Aghjunghje un media (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Limita di caricamentu di fugliali trapassata.",
   "upload_form.description": "Discrive per i malvistosi",
   "upload_form.focus": "Cambià a vista",
   "upload_form.undo": "Sguassà",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 508b5debeb..d26ef82845 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -105,7 +105,7 @@
   "emoji_button.food": "Jídla a nápoje",
   "emoji_button.label": "Vložit emoji",
   "emoji_button.nature": "Příroda",
-  "emoji_button.not_found": "Žádné emoji!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "Žádná emoji!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Předměty",
   "emoji_button.people": "Lidé",
   "emoji_button.recent": "Často používané",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "a {additional}",
   "hashtag.column_header.tag_mode.any": "nebo {additional}",
   "hashtag.column_header.tag_mode.none": "bez {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Všechny z těchto",
   "hashtag.column_settings.tag_mode.any": "Jakékoliv z těchto",
   "hashtag.column_settings.tag_mode.none": "Žádné z těchto",
@@ -155,7 +157,7 @@
   "introduction.federation.home.headline": "Domů",
   "introduction.federation.home.text": "Příspěvky od lidí, které sledujete, se objeví ve vašem domovském proudu. Můžete sledovat kohokoliv na jakémkoliv serveru!",
   "introduction.federation.local.headline": "Místní",
-  "introduction.federation.local.text": "Veřejné příspěvky od lidí ze stejného serveru, jako vy, se zobrazí na místní časové ose.",
+  "introduction.federation.local.text": "Veřejné příspěvky od lidí ze stejného serveru jako vy se zobrazí na místní časové ose.",
   "introduction.interactions.action": "Dokončit tutoriál!",
   "introduction.interactions.favourite.headline": "Oblíbení",
   "introduction.interactions.favourite.text": "Oblíbením si můžete uložit toot na později a dát jeho autorovi vědět, že se vám líbí.",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Odebrat ze seznamu",
   "lists.delete": "Smazat seznam",
   "lists.edit": "Upravit seznam",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Přidat seznam",
   "lists.new.title_placeholder": "Název nového seznamu",
   "lists.search": "Hledejte mezi lidmi, které sledujete",
@@ -297,7 +300,7 @@
   "status.block": "Zablokovat uživatele @{name}",
   "status.cancel_reblog_private": "Zrušit boost",
   "status.cannot_reblog": "Tento příspěvek nemůže být boostnutý",
-  "status.copy": "Copy link to status",
+  "status.copy": "Kopírovat odkaz k příspěvku",
   "status.delete": "Smazat",
   "status.detailed_status": "Detailní zobrazení konverzace",
   "status.direct": "Poslat přímou zprávu uživateli @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Váš koncept se ztratí, pokud Mastodon opustíte.",
   "upload_area.title": "Přetažením nahrajete",
   "upload_button.label": "Přidat média (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Byl překročen limit nahraných souborů.",
   "upload_form.description": "Popis pro zrakově postižené",
   "upload_form.focus": "Změnit náhled",
   "upload_form.undo": "Smazat",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index df08b907c1..95c8632f73 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "a {additional}",
   "hashtag.column_header.tag_mode.any": "neu {additional}",
   "hashtag.column_header.tag_mode.none": "heb {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Pob un o'r rhain",
   "hashtag.column_settings.tag_mode.any": "Unrhyw un o'r rhain",
   "hashtag.column_settings.tag_mode.none": "Dim o'r rhain",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Dileu o'r rhestr",
   "lists.delete": "Dileu rhestr",
   "lists.edit": "Golygwch rhestr",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Ychwanegu rhestr",
   "lists.new.title_placeholder": "Teitl rhestr newydd",
   "lists.search": "Chwilio ymysg pobl yr ydych yn ei ddilyn",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index f418d26f79..f383f2c9c2 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Fjern fra liste",
   "lists.delete": "Slet liste",
   "lists.edit": "Rediger liste",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Tilføj liste",
   "lists.new.title_placeholder": "Ny liste titel",
   "lists.search": "Søg iblandt folk du følger",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index e7cfd48b72..18e496b0ed 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Du hast noch keine Listen. Wenn du eine anlegst, wird sie hier angezeigt.",
   "empty_column.mutes": "Du hast keine Profile stummgeschaltet.",
   "empty_column.notifications": "Du hast noch keine Mitteilungen. Interagiere mit anderen, um ins Gespräch zu kommen.",
-  "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Instanzen, um die Zeitleiste aufzufüllen",
+  "empty_column.public": "Hier ist nichts zu sehen! Schreibe etwas öffentlich oder folge Profilen von anderen Servern, um die Zeitleiste aufzufüllen",
   "follow_request.authorize": "Erlauben",
   "follow_request.reject": "Ablehnen",
   "getting_started.developers": "Entwickler",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "und {additional}",
   "hashtag.column_header.tag_mode.any": "oder {additional}",
   "hashtag.column_header.tag_mode.none": "ohne {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All diese",
   "hashtag.column_settings.tag_mode.any": "Eine von diesen",
   "hashtag.column_settings.tag_mode.none": "Keine von diesen",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Von der Liste entfernen",
   "lists.delete": "Delete list",
   "lists.edit": "Liste bearbeiten",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Liste hinzufügen",
   "lists.new.title_placeholder": "Neuer Titel der Liste",
   "lists.search": "Suche nach Leuten denen du folgst",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "Favoriten",
   "navigation_bar.filters": "Stummgeschaltene Wörter",
   "navigation_bar.follow_requests": "Folgeanfragen",
-  "navigation_bar.info": "Ãœber diese Instanz",
+  "navigation_bar.info": "Ãœber diesen Server",
   "navigation_bar.keyboard_shortcuts": "Tastenkombinationen",
   "navigation_bar.lists": "Listen",
   "navigation_bar.logout": "Abmelden",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Abbrechen",
   "report.forward": "An {target} weiterleiten",
   "report.forward_hint": "Dieses Konto ist von einem anderen Server. Soll eine anonymisierte Kopie des Berichts auch dorthin geschickt werden?",
-  "report.hint": "Der Bericht wird an die Moderatoren deiner Instanz geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:",
+  "report.hint": "Der Bericht wird an die Moderatoren des Servers geschickt. Du kannst hier eine Erklärung angeben, warum du dieses Konto meldest:",
   "report.placeholder": "Zusätzliche Kommentare",
   "report.submit": "Absenden",
   "report.target": "{target} melden",
@@ -297,7 +300,7 @@
   "status.block": "Blockiere @{name}",
   "status.cancel_reblog_private": "Nicht mehr teilen",
   "status.cannot_reblog": "Dieser Beitrag kann nicht geteilt werden",
-  "status.copy": "Copy link to status",
+  "status.copy": "Kopiere Link zum Status",
   "status.delete": "Löschen",
   "status.detailed_status": "Detaillierte Ansicht der Konversation",
   "status.direct": "Direktnachricht @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.",
   "upload_area.title": "Zum Hochladen hereinziehen",
   "upload_button.label": "Mediendatei hinzufügen (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Dateiupload-Limit erreicht.",
   "upload_form.description": "Für Menschen mit Sehbehinderung beschreiben",
   "upload_form.focus": "Thumbnail bearbeiten",
   "upload_form.undo": "Löschen",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 86b2a4a1d6..157b69847c 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -1320,6 +1320,14 @@
   },
   {
     "descriptors": [
+      {
+        "defaultMessage": "Enter hashtags…",
+        "id": "hashtag.column_settings.select.placeholder"
+      },
+      {
+        "defaultMessage": "No suggestions found",
+        "id": "hashtag.column_settings.select.no_options_message"
+      },
       {
         "defaultMessage": "Any of these",
         "id": "hashtag.column_settings.tag_mode.any"
@@ -1622,6 +1630,15 @@
     ],
     "path": "app/javascript/mastodon/features/list_editor/components/account.json"
   },
+  {
+    "descriptors": [
+      {
+        "defaultMessage": "Change title",
+        "id": "lists.edit.submit"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/list_editor/components/edit_list_form.json"
+  },
   {
     "descriptors": [
       {
diff --git a/app/javascript/mastodon/locales/el.json b/app/javascript/mastodon/locales/el.json
index 165f90f0cb..a36f41ce54 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Δεν έχεις καμία λίστα ακόμα. Μόλις φτιάξεις μια, θα εμφανιστεί εδώ.",
   "empty_column.mutes": "Δεν έχεις αποσιωπήσει κανένα χρήστη ακόμα.",
   "empty_column.notifications": "Δεν έχεις ειδοποιήσεις ακόμα. Αλληλεπίδρασε με άλλους χρήστες για να ξεκινήσεις την κουβέντα.",
-  "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλα instances για να τη γεμίσεις",
+  "empty_column.public": "Δεν υπάρχει τίποτα εδώ! Γράψε κάτι δημόσιο, ή ακολούθησε χειροκίνητα χρήστες από άλλους κόμβους για να τη γεμίσεις",
   "follow_request.authorize": "Ενέκρινε",
   "follow_request.reject": "Απέρριψε",
   "getting_started.developers": "Ανάπτυξη",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "και {additional}",
   "hashtag.column_header.tag_mode.any": "ή {additional}",
   "hashtag.column_header.tag_mode.none": "χωρίς {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Όλα αυτα",
   "hashtag.column_settings.tag_mode.any": "Οποιοδήποτε από αυτά",
   "hashtag.column_settings.tag_mode.none": "Κανένα από αυτά",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Βγάλε από τη λίστα",
   "lists.delete": "Διαγραφή λίστας",
   "lists.edit": "Επεξεργασία λίστας",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Προσθήκη λίστας",
   "lists.new.title_placeholder": "Τίτλος νέας λίστα",
   "lists.search": "Αναζήτησε μεταξύ των ανθρώπων που ακουλουθείς",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Άκυρο",
   "report.forward": "Προώθηση προς {target}",
   "report.forward_hint": "Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της καταγγελίας κι εκεί;",
-  "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις το λογαριασμό παρακάτω:",
+  "report.hint": "Η καταγγελία θα σταλεί στους διαχειριστές του κόμβου σου. Μπορείς να περιγράψεις γιατί καταγγέλεις αυτόν το λογαριασμό παρακάτω:",
   "report.placeholder": "Επιπλέον σχόλια",
   "report.submit": "Υποβολή",
   "report.target": "Καταγγελία {target}",
@@ -290,14 +293,14 @@
   "search_results.accounts": "Άνθρωποι",
   "search_results.hashtags": "Ταμπέλες",
   "search_results.statuses": "Τουτ",
-  "search_results.total": "{count, number} {count, plural, ένα {result} υπόλοιπα {results}}",
+  "search_results.total": "{count, number} {count, plural, zero {αποτελέσματα} one {αποτέλεσμα} other {αποτελέσματα}}",
   "standalone.public_title": "Μια πρώτη γεύση...",
   "status.admin_account": "Άνοιγμα λειτουργίας διαμεσολάβησης για τον/την @{name}",
   "status.admin_status": "Άνοιγμα αυτής της δημοσίευσης στη λειτουργία διαμεσολάβησης",
   "status.block": "Αποκλεισμός @{name}",
   "status.cancel_reblog_private": "Ακύρωσε την προώθηση",
   "status.cannot_reblog": "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί",
-  "status.copy": "Copy link to status",
+  "status.copy": "Αντιγραφή συνδέσμου της δημοσίευσης",
   "status.delete": "Διαγραφή",
   "status.detailed_status": "Προβολή λεπτομερειών συζήτησης",
   "status.direct": "Προσωπικό μήνυμα προς @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
   "upload_area.title": "Drag & drop για να ανεβάσεις",
   "upload_button.label": "Πρόσθεσε πολυμέσα (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Υπέρβαση ορίου μεγέθους ανεβασμένων αρχείων.",
   "upload_form.description": "Περιέγραψε για όσους & όσες έχουν προβλήματα όρασης",
   "upload_form.focus": "Αλλαγή προεπισκόπησης",
   "upload_form.undo": "Διαγραφή",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 58e672aa53..7f7abf3720 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index 759eed46a0..f8d427c804 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -128,11 +128,11 @@
   "empty_column.lists": "Vi ankoraŭ ne havas liston. Kiam vi kreos iun, ĝi aperos ĉi tie.",
   "empty_column.mutes": "Vi ne ankoraÅ­ silentigis iun uzanton.",
   "empty_column.notifications": "Vi ankoraÅ­ ne havas sciigojn. Interagu kun aliaj por komenci konversacion.",
-  "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj nodoj por plenigi la publikan tempolinion",
+  "empty_column.public": "Estas nenio ĉi tie! Publike skribu ion, aŭ mane sekvu uzantojn de aliaj serviloj por plenigi la publikan tempolinion",
   "follow_request.authorize": "Rajtigi",
   "follow_request.reject": "Rifuzi",
   "getting_started.developers": "Programistoj",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Profilujo",
   "getting_started.documentation": "Dokumentado",
   "getting_started.heading": "Por komenci",
   "getting_started.invite": "Inviti homojn",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "kaj {additional}",
   "hashtag.column_header.tag_mode.any": "aÅ­ {additional}",
   "hashtag.column_header.tag_mode.none": "sen {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Ĉiuj",
   "hashtag.column_settings.tag_mode.any": "Iu ajn",
   "hashtag.column_settings.tag_mode.none": "Neniu",
@@ -151,21 +153,21 @@
   "home.column_settings.show_replies": "Montri respondojn",
   "introduction.federation.action": "Sekva",
   "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.federated.text": "Publikaj mesaĝoj el aliaj serviloj de la Fediverse aperos en la fratara tempolinio.",
   "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.home.text": "Mesaĝoj de homoj, kiujn vi sekvas, aperos en via hejma fluo. Vi povas sekvi iun ajn de ajna servilo!",
   "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.local.text": "Publikaj mesaĝoj de homoj de via servilo aperos en la loka tempolinio.",
+  "introduction.interactions.action": "Fini la lernilon!",
+  "introduction.interactions.favourite.headline": "Stelumi",
+  "introduction.interactions.favourite.text": "Vi povas konservi mesaĝon por posta uzo, kaj sciigi al ĝia aŭtoro ke vi ŝatis ĝin, per stelumo.",
+  "introduction.interactions.reblog.headline": "Diskonigi",
+  "introduction.interactions.reblog.text": "Vi povas diskonigi mesaĝojn al viaj sekvantoj per diskonigo.",
+  "introduction.interactions.reply.headline": "Respondi",
+  "introduction.interactions.reply.text": "Vi povas respondi al mesaĝoj aliulaj kaj viaj, kio kreos ĉenon de mesaĝoj nomata konversacio.",
+  "introduction.welcome.action": "Ek!",
+  "introduction.welcome.headline": "Unuaj paŝoj",
+  "introduction.welcome.text": "Bonvenon en Fediverse! Tre baldaŭ, vi povos disdoni mesaĝojn kaj paroli al viaj amikoj tra granda servila diverseco. Sed ĉi tiu servilo, {domain}, estas speciala: ĝi enhavas vian profilon, do memoru ĝian nomon.",
   "keyboard_shortcuts.back": "por reveni",
   "keyboard_shortcuts.blocked": "por malfermi la liston de blokitaj uzantoj",
   "keyboard_shortcuts.boost": "por diskonigi",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Forigi de la listo",
   "lists.delete": "Forigi la liston",
   "lists.edit": "Redakti la liston",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Aldoni liston",
   "lists.new.title_placeholder": "Titolo de la nova listo",
   "lists.search": "Serĉi inter la homoj, kiujn vi sekvas",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "Stelumoj",
   "navigation_bar.filters": "Silentigitaj vortoj",
   "navigation_bar.follow_requests": "Petoj de sekvado",
-  "navigation_bar.info": "Pri ĉi tiu nodo",
+  "navigation_bar.info": "Pri ĉi tiu servilo",
   "navigation_bar.keyboard_shortcuts": "Rapidklavoj",
   "navigation_bar.lists": "Listoj",
   "navigation_bar.logout": "Elsaluti",
@@ -242,20 +245,20 @@
   "notifications.clear_confirmation": "Ĉu vi certas, ke vi volas porĉiame forviŝi ĉiujn viajn sciigojn?",
   "notifications.column_settings.alert": "Retumilaj sciigoj",
   "notifications.column_settings.favourite": "Stelumoj:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "Montri ĉiujn kategoriojn",
+  "notifications.column_settings.filter_bar.category": "Rapida filtra breto",
+  "notifications.column_settings.filter_bar.show": "Montri",
   "notifications.column_settings.follow": "Novaj sekvantoj:",
   "notifications.column_settings.mention": "Mencioj:",
   "notifications.column_settings.push": "Puŝsciigoj",
   "notifications.column_settings.reblog": "Diskonigoj:",
   "notifications.column_settings.show": "Montri en kolumno",
   "notifications.column_settings.sound": "Eligi sonon",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "Ĉiuj",
+  "notifications.filter.boosts": "Diskonigoj",
+  "notifications.filter.favourites": "Stelumoj",
+  "notifications.filter.follows": "Sekvoj",
+  "notifications.filter.mentions": "Mencioj",
   "notifications.group": "{count} sciigoj",
   "privacy.change": "Agordi mesaĝan privatecon",
   "privacy.direct.long": "Afiŝi nur al menciitaj uzantoj",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Nuligi",
   "report.forward": "Plusendi al {target}",
   "report.forward_hint": "La konto estas en alia servilo. Ĉu sendi sennomigitan kopion de la signalo ankaŭ tien?",
-  "report.hint": "La signalo estos sendita al la kontrolantoj de via nodo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:",
+  "report.hint": "La signalo estos sendita al la kontrolantoj de via servilo. Vi povas doni klarigon pri kial vi signalas ĉi tiun konton sube:",
   "report.placeholder": "Pliaj komentoj",
   "report.submit": "Sendi",
   "report.target": "Signali {target}",
@@ -292,12 +295,12 @@
   "search_results.statuses": "Mesaĝoj",
   "search_results.total": "{count, number} {count, plural, one {rezulto} other {rezultoj}}",
   "standalone.public_title": "Enrigardo…",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "Malfermi la kontrolan interfacon por @{name}",
+  "status.admin_status": "Malfermi ĉi tiun mesaĝon en la kontrola interfaco",
   "status.block": "Bloki @{name}",
   "status.cancel_reblog_private": "Eksdiskonigi",
   "status.cannot_reblog": "Ĉi tiu mesaĝo ne diskonigeblas",
-  "status.copy": "Copy link to status",
+  "status.copy": "Kopii la ligilon al la mesaĝo",
   "status.delete": "Forigi",
   "status.detailed_status": "Detala konversacia vido",
   "status.direct": "Rekte mesaĝi @{name}",
@@ -343,9 +346,9 @@
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
   "upload_area.title": "Altreni kaj lasi por alŝuti",
   "upload_button.label": "Aldoni aŭdovidaĵon (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Limo de dosiera alŝutado transpasita.",
   "upload_form.description": "Priskribi por misvidantaj homoj",
-  "upload_form.focus": "Stuci",
+  "upload_form.focus": "Antaŭvido de ŝanĝo",
   "upload_form.undo": "Forigi",
   "upload_progress.label": "Alŝutado…",
   "video.close": "Fermi videon",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index 43bfe039ca..99dce8ffef 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Quitar de lista",
   "lists.delete": "Delete list",
   "lists.edit": "Editar lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Añadir lista",
   "lists.new.title_placeholder": "Título de la nueva lista",
   "lists.search": "Buscar entre la gente a la que sigues",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 747348e718..63a2354aea 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Ez duzu zerrendarik oraindik. Baten bat sortzen duzunean hemen agertuko da.",
   "empty_column.mutes": "Ez duzu erabiltzailerik mututu oraindik.",
   "empty_column.notifications": "Ez duzu jakinarazpenik oraindik. Jarri besteekin harremanetan elkarrizketa abiatzeko.",
-  "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste instantzia batzuetako erabiltzailean hau betetzeko",
+  "empty_column.public": "Ez dago ezer hemen! Idatzi zerbait publikoki edo jarraitu eskuz beste zerbitzari batzuetako erabiltzaileak hau betetzen joateko",
   "follow_request.authorize": "Baimendu",
   "follow_request.reject": "Ukatu",
   "getting_started.developers": "Garatzaileak",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "eta {osagarria}",
   "hashtag.column_header.tag_mode.any": "edo {osagarria}",
   "hashtag.column_header.tag_mode.none": "gabe {osagarria}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Hauetako guztiak",
   "hashtag.column_settings.tag_mode.any": "Hautako edozein",
   "hashtag.column_settings.tag_mode.none": "Hauetako bat ere ez",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Kendu zerrendatik",
   "lists.delete": "Ezabatu zerrenda",
   "lists.edit": "Editatu zerrenda",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Gehitu zerrenda",
   "lists.new.title_placeholder": "Zerrenda berriaren izena",
   "lists.search": "Bilatu jarraitzen dituzun pertsonen artean",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "Gogokoak",
   "navigation_bar.filters": "Mutututako hitzak",
   "navigation_bar.follow_requests": "Jarraitzeko eskariak",
-  "navigation_bar.info": "Instantzia honi buruz",
+  "navigation_bar.info": "Zerbitzari honi buruz",
   "navigation_bar.keyboard_shortcuts": "Laster-teklak",
   "navigation_bar.lists": "Zerrendak",
   "navigation_bar.logout": "Amaitu saioa",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Utzi",
   "report.forward": "Birbidali hona: {target}",
   "report.forward_hint": "Kontu hau beste zerbitzari batekoa da. Bidali txostenaren kopia anonimo hara ere?",
-  "report.hint": "Txostena zure instantziaren moderatzaileei bidaliko zaio. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:",
+  "report.hint": "Txostena zure zerbitzariaren moderatzaileei bidaliko zaie. Kontu hau zergatik salatzen duzun behean azaldu dezakezu:",
   "report.placeholder": "Iruzkin gehigarriak",
   "report.submit": "Submit",
   "report.target": "{target} salatzen",
@@ -297,7 +300,7 @@
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Kendu bultzada",
   "status.cannot_reblog": "Mezu honi ezin zaio bultzada eman",
-  "status.copy": "Copy link to status",
+  "status.copy": "Kopiatu mezuaren esteka",
   "status.delete": "Ezabatu",
   "status.detailed_status": "Elkarrizketaren ikuspegi xehetsua",
   "status.direct": "Mezu zuzena @{name}(r)i",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
   "upload_area.title": "Arrastatu eta jaregin igotzeko",
   "upload_button.label": "Gehitu multimedia  (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Fitxategi igoera muga gaindituta.",
   "upload_form.description": "Deskribatu ikusmen arazoak dituztenentzat",
   "upload_form.focus": "Aldatu aurrebista",
   "upload_form.undo": "Ezabatu",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 44c39802a1..f2f144e782 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "افزودن یا برداشتن از فهرست",
   "account.badges.bot": "ربات",
   "account.block": "مسدودسازی @{name}",
   "account.block_domain": "پنهان‌سازی همه چیز از سرور {domain}",
@@ -17,7 +17,7 @@
   "account.follows_you": "پیگیر شماست",
   "account.hide_reblogs": "پنهان کردن بازبوق‌های @{name}",
   "account.link_verified_on": "مالکیت این نشانی در تایخ {date} بررسی شد",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "این حساب خصوصی است. صاحب این حساب تصمیم می‌گیرد که چه کسی می‌تواند پیگیرش باشد.",
   "account.media": "عکس و ویدیو",
   "account.mention": "نام‌بردن از @{name}",
   "account.moved_to": "{name} منتقل شده است به:",
@@ -113,7 +113,7 @@
   "emoji_button.search_results": "نتایج جستجو",
   "emoji_button.symbols": "نمادها",
   "emoji_button.travel": "سفر و مکان",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "هیچ بوقی این‌جا نیست!",
   "empty_column.blocks": "شما هنوز هیچ کسی را مسدود نکرده‌اید.",
   "empty_column.community": "فهرست نوشته‌های محلی خالی است. چیزی بنویسید تا چرخش بچرخد!",
   "empty_column.direct": "شما هیچ پیغام مستقیمی ندارید. اگر چنین پیغامی بگیرید یا بفرستید این‌جا نمایش خواهد یافت.",
@@ -128,44 +128,46 @@
   "empty_column.lists": "شما هنوز هیچ فهرستی ندارید. اگر فهرستی بسازید، این‌جا نمایش خواهد یافت.",
   "empty_column.mutes": "شما هنوز هیچ کاربری را بی‌صدا نکرده‌اید.",
   "empty_column.notifications": "هنوز هیچ اعلانی ندارید. به نوشته‌های دیگران واکنش نشان دهید تا گفتگو آغاز شود.",
-  "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران دیگر را پی بگیرید تا این‌جا پر شود",
+  "empty_column.public": "این‌جا هنوز چیزی نیست! خودتان چیزی بنویسید یا کاربران سرورهای دیگر را پی بگیرید تا این‌جا پر شود",
   "follow_request.authorize": "اجازه دهید",
   "follow_request.reject": "اجازه ندهید",
   "getting_started.developers": "برای برنامه‌نویسان",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "فهرست گزیدهٔ کاربران",
   "getting_started.documentation": "راهنما",
   "getting_started.heading": "آغاز کنید",
   "getting_started.invite": "دعوت از دوستان",
   "getting_started.open_source_notice": "ماستدون یک نرم‌افزار آزاد است. می‌توانید در ساخت آن مشارکت کنید یا مشکلاتش را در {github} گزارش دهید.",
   "getting_started.security": "امنیت",
   "getting_started.terms": "شرایط استفاده",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "hashtag.column_header.tag_mode.all": "Ùˆ {additional}",
+  "hashtag.column_header.tag_mode.any": "یا {additional}",
+  "hashtag.column_header.tag_mode.none": "بدون {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "همهٔ این‌ها",
+  "hashtag.column_settings.tag_mode.any": "هرکدام از این‌ها",
+  "hashtag.column_settings.tag_mode.none": "هیچ‌کدام از این‌ها",
+  "hashtag.column_settings.tag_toggle": "برچسب‌های بیشتری به این ستون بیفزایید",
   "home.column_settings.basic": "اصلی",
   "home.column_settings.show_reblogs": "نمایش بازبوق‌ها",
   "home.column_settings.show_replies": "نمایش پاسخ‌ها",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "introduction.federation.action": "بعدی",
+  "introduction.federation.federated.headline": "فهرست همهٔ سرورها",
+  "introduction.federation.federated.text": "نوشته‌های عمومی سرورهای دیگر در این فهرست نمایش می‌یابند.",
+  "introduction.federation.home.headline": "خانه",
+  "introduction.federation.home.text": "نوشته‌های کسانی که شما آن‌ها را پی می‌گیرید این‌جا نمایش می‌یابند. شما می‌توانید هر کسی را از هر سروری پی بگیرید!",
+  "introduction.federation.local.headline": "محلی",
+  "introduction.federation.local.text": "نوشته‌های عمومی کسانی که روی سرور شما هستند در فهرست نوشته‌های محلی نمایش می‌یابند.",
+  "introduction.interactions.action": "پایان خودآموز!",
+  "introduction.interactions.favourite.headline": "پسندیدن",
+  "introduction.interactions.favourite.text": "با پسندیدن یک بوق، شما آن را برای آینده ذخیره می‌کنید و به نویسنده می‌گویید که از بوقش خوشتان آمده.",
+  "introduction.interactions.reblog.headline": "بازبوقیدن",
+  "introduction.interactions.reblog.text": "اگر بخواهید نوشته‌ای را با پیگیران خودتان به اشتراک بگذارید، آن را بازمی‌بوقید.",
+  "introduction.interactions.reply.headline": "پاسخ",
+  "introduction.interactions.reply.text": "شما می‌توانید به بوق‌های خودتان و دیگران پاسخ دهید، تا همهٔ این بوق‌ها به شکل رشتهٔ به‌هم‌پیوسته‌ای در یک گفتگو درآیند.",
+  "introduction.welcome.action": "بزن بریم!",
+  "introduction.welcome.headline": "نخستین گام‌ها",
+  "introduction.welcome.text": "به دنیای شبکه‌های اجتماعی غیرمتمرکز خوش آمدید! به زودی می‌توانید نوشته‌های خودتان را منتشر کنید و با دوستانتان که روی سرورهای مختلفی هستند حرف بزنید. ولی این سرور، {domain}، با بقیه فرق دارد زیرا حساب شما روی آن ساخته شده است، پس نامش را یادتان نگه دارید.",
   "keyboard_shortcuts.back": "برای بازگشت",
   "keyboard_shortcuts.blocked": "برای گشودن کاربران بی‌صداشده",
   "keyboard_shortcuts.boost": "برای بازبوقیدن",
@@ -204,6 +206,7 @@
   "lists.account.remove": "پاک‌کردن از فهرست",
   "lists.delete": "حذف فهرست",
   "lists.edit": "ویرایش فهرست",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "افزودن فهرست",
   "lists.new.title_placeholder": "نام فهرست تازه",
   "lists.search": "بین کسانی که پی می‌گیرید بگردید",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "پسندیده‌ها",
   "navigation_bar.filters": "واژگان بی‌صداشده",
   "navigation_bar.follow_requests": "درخواست‌های پیگیری",
-  "navigation_bar.info": "اطلاعات تکمیلی",
+  "navigation_bar.info": "دربارهٔ این سرور",
   "navigation_bar.keyboard_shortcuts": "میان‌برهای صفحه‌کلید",
   "navigation_bar.lists": "فهرست‌ها",
   "navigation_bar.logout": "خروج",
@@ -242,20 +245,20 @@
   "notifications.clear_confirmation": "واقعاً می‌خواهید همهٔ اعلان‌هایتان را برای همیشه پاک کنید؟",
   "notifications.column_settings.alert": "اعلان در کامپیوتر",
   "notifications.column_settings.favourite": "پسندیده‌ها:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.filter_bar.advanced": "نمایش همهٔ گروه‌ها",
+  "notifications.column_settings.filter_bar.category": "فیلتر سریع",
+  "notifications.column_settings.filter_bar.show": "نمایش",
   "notifications.column_settings.follow": "پیگیران تازه:",
   "notifications.column_settings.mention": "نام‌بردن‌ها:",
   "notifications.column_settings.push": "اعلان‌ها از سمت سرور",
   "notifications.column_settings.reblog": "بازبوق‌ها:",
   "notifications.column_settings.show": "نمایش در ستون",
   "notifications.column_settings.sound": "پخش صدا",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
+  "notifications.filter.all": "همه",
+  "notifications.filter.boosts": "بازبوق‌ها",
+  "notifications.filter.favourites": "پسندیده‌ها",
+  "notifications.filter.follows": "پیگیری‌ها",
+  "notifications.filter.mentions": "نام‌بردن‌ها",
   "notifications.group": "{count} اعلان",
   "privacy.change": "تنظیم حریم خصوصی نوشته‌ها",
   "privacy.direct.long": "تنها به کاربران نام‌برده‌شده نشان بده",
@@ -292,12 +295,12 @@
   "search_results.statuses": "بوق‌ها",
   "search_results.total": "{count, number} {count, plural, one {نتیجه} other {نتیجه}}",
   "standalone.public_title": "نگاهی به کاربران این سرور...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "محیط مدیریت مربوط به @{name} را باز کن",
+  "status.admin_status": "این نوشته را در محیط مدیریت باز کن",
   "status.block": "مسدودسازی @{name}",
   "status.cancel_reblog_private": "حذف بازبوق",
   "status.cannot_reblog": "این نوشته را نمی‌شود بازبوقید",
-  "status.copy": "Copy link to status",
+  "status.copy": "رونوشت‌برداری از نشانی این نوشته",
   "status.delete": "پاک‌کردن",
   "status.detailed_status": "نمایش کامل گفتگو",
   "status.direct": "پیغام مستقیم به @{name}",
@@ -329,11 +332,11 @@
   "status.show_less_all": "نمایش کمتر همه",
   "status.show_more": "نمایش",
   "status.show_more_all": "نمایش بیشتر همه",
-  "status.show_thread": "Show thread",
+  "status.show_thread": "نمایش گفتگو",
   "status.unmute_conversation": "باصداکردن گفتگو",
   "status.unpin": "برداشتن نوشتهٔ ثابت نمایه",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
+  "suggestions.dismiss": "پیشنهاد را نادیده بگیر",
+  "suggestions.header": "شاید این هم برایتان جالب باشد…",
   "tabs_bar.federated_timeline": "همگانی",
   "tabs_bar.home": "خانه",
   "tabs_bar.local_timeline": "محلی",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "اگر از ماستدون خارج شوید پیش‌نویس شما پاک خواهد شد.",
   "upload_area.title": "برای بارگذاری به این‌جا بکشید",
   "upload_button.label": "افزودن عکس و ویدیو (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "از حد مجاز باگذاری فراتر رفتید.",
   "upload_form.description": "نوشتهٔ توضیحی برای کم‌بینایان و نابینایان",
   "upload_form.focus": "بریدن لبه‌ها",
   "upload_form.undo": "حذف",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 6e878d7ff6..537280223a 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -1,5 +1,5 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Lisää tai poista listoilta",
   "account.badges.bot": "Botti",
   "account.block": "Estä @{name}",
   "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
@@ -17,7 +17,7 @@
   "account.follows_you": "Seuraa sinua",
   "account.hide_reblogs": "Piilota buustaukset käyttäjältä @{name}",
   "account.link_verified_on": "Tämän linkin omistaja tarkistettiin {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.locked_info": "Tämän tili on yksityinen. Käyttäjä vahvistaa itse kuka voi seurata häntä.",
   "account.media": "Media",
   "account.mention": "Mainitse @{name}",
   "account.moved_to": "{name} on muuttanut instanssiin:",
@@ -113,7 +113,7 @@
   "emoji_button.search_results": "Hakutulokset",
   "emoji_button.symbols": "Symbolit",
   "emoji_button.travel": "Matkailu",
-  "empty_column.account_timeline": "No toots here!",
+  "empty_column.account_timeline": "Ei ole 'toots' täällä!",
   "empty_column.blocks": "Et ole vielä estänyt yhtään käyttäjää.",
   "empty_column.community": "Paikallinen aikajana on tyhjä. Homma lähtee käyntiin, kun kirjoitat jotain julkista!",
   "empty_column.direct": "Sinulla ei ole vielä yhtään viestiä yksittäiselle käyttäjälle. Kun lähetät tai vastaanotat sellaisen, se näkyy täällä.",
@@ -128,28 +128,30 @@
   "empty_column.lists": "Sinulla ei ole vielä yhtään listaa. Kun luot sellaisen, näkyy se tässä.",
   "empty_column.mutes": "Et ole mykistänyt vielä yhtään käyttäjää.",
   "empty_column.notifications": "Sinulle ei ole vielä ilmoituksia. Aloita keskustelu juttelemalla muille.",
-  "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt manuaalisesti seuraamassa muiden instanssien käyttäjiä",
+  "empty_column.public": "Täällä ei ole mitään! Saat sisältöä, kun kirjoitat jotain julkisesti tai käyt seuraamassa muiden instanssien käyttäjiä",
   "follow_request.authorize": "Valtuuta",
   "follow_request.reject": "Hylkää",
   "getting_started.developers": "Kehittäjille",
-  "getting_started.directory": "Profile directory",
+  "getting_started.directory": "Profiili hakemisto",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Aloitus",
   "getting_started.invite": "Kutsu ihmisiä",
   "getting_started.open_source_notice": "Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHubissa: {github}.",
   "getting_started.security": "Tunnukset",
   "getting_started.terms": "Käyttöehdot",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_header.tag_mode.all": "ja {additional}",
+  "hashtag.column_header.tag_mode.any": "tai {additional}",
+  "hashtag.column_header.tag_mode.none": "ilman {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "Kaikki",
+  "hashtag.column_settings.tag_mode.any": "Kaikki",
+  "hashtag.column_settings.tag_mode.none": "Ei mikään",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Perusasetukset",
   "home.column_settings.show_reblogs": "Näytä buustaukset",
   "home.column_settings.show_replies": "Näytä vastaukset",
-  "introduction.federation.action": "Next",
+  "introduction.federation.action": "Seuraava",
   "introduction.federation.federated.headline": "Federated",
   "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
   "introduction.federation.home.headline": "Home",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Poista listasta",
   "lists.delete": "Poista lista",
   "lists.edit": "Muokkaa listaa",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Lisää lista",
   "lists.new.title_placeholder": "Uuden listan nimi",
   "lists.search": "Etsi seuraamistasi henkilöistä",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 24182c00b9..f88f29b110 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -11,33 +11,33 @@
   "account.endorse": "Figure sur le profil",
   "account.follow": "Suivre",
   "account.followers": "Abonné⋅e⋅s",
-  "account.followers.empty": "Personne ne suit cet utilisateur pour l’instant.",
+  "account.followers.empty": "Personne ne suit cet utilisateur·rice pour l’instant.",
   "account.follows": "Abonnements",
-  "account.follows.empty": "Cet utilisateur ne suit personne pour l’instant.",
+  "account.follows.empty": "Cet·te utilisateur·rice ne suit personne pour l’instant.",
   "account.follows_you": "Vous suit",
   "account.hide_reblogs": "Masquer les partages de @{name}",
   "account.link_verified_on": "La propriété de ce lien a été vérifiée le {date}",
   "account.locked_info": "Ce compte est verrouillé. Son propriétaire approuve manuellement qui peut le ou la suivre.",
   "account.media": "Média",
-  "account.mention": "Mentionner",
+  "account.mention": "Mentionner @{name}",
   "account.moved_to": "{name} a déménagé vers :",
   "account.mute": "Masquer @{name}",
   "account.mute_notifications": "Ignorer les notifications de @{name}",
   "account.muted": "Silencé",
   "account.posts": "Pouets",
   "account.posts_with_replies": "Pouets et réponses",
-  "account.report": "Signaler",
+  "account.report": "Signaler @{name}",
   "account.requested": "En attente d’approbation. Cliquez pour annuler la requête",
   "account.share": "Partager le profil de @{name}",
   "account.show_reblogs": "Afficher les partages de @{name}",
-  "account.unblock": "Débloquer",
+  "account.unblock": "Débloquer @{name}",
   "account.unblock_domain": "Ne plus masquer {domain}",
   "account.unendorse": "Ne figure pas sur le profil",
   "account.unfollow": "Ne plus suivre",
-  "account.unmute": "Ne plus masquer",
+  "account.unmute": "Ne plus masquer @{name}",
   "account.unmute_notifications": "Réactiver les notifications de @{name}",
   "account.view_full_profile": "Afficher le profil complet",
-  "alert.unexpected.message": "Une erreur non attendue s’est produite.",
+  "alert.unexpected.message": "Une erreur inattendue s’est produite.",
   "alert.unexpected.title": "Oups !",
   "boost_modal.combo": "Vous pouvez appuyer sur {combo} pour pouvoir passer ceci, la prochaine fois",
   "bundle_column_error.body": "Une erreur s’est produite lors du chargement de ce composant.",
@@ -86,7 +86,7 @@
   "confirmations.delete.confirm": "Supprimer",
   "confirmations.delete.message": "Confirmez-vous la suppression de ce pouet ?",
   "confirmations.delete_list.confirm": "Supprimer",
-  "confirmations.delete_list.message": "Êtes-vous sûr de vouloir supprimer définitivement cette liste ?",
+  "confirmations.delete_list.message": "Êtes-vous sûr·e de vouloir supprimer définitivement cette liste ?",
   "confirmations.domain_block.confirm": "Masquer le domaine entier",
   "confirmations.domain_block.message": "Êtes-vous vraiment, vraiment sûr⋅e de vouloir bloquer {domain} en entier ? Dans la plupart des cas, quelques blocages ou masquages ciblés sont suffisants et préférables. Vous ne verrez plus de contenu provenant de ce domaine, ni dans fils publics, ni dans vos notifications. Vos abonné·e·s utilisant ce domaine seront retiré·e·s.",
   "confirmations.mute.confirm": "Masquer",
@@ -114,7 +114,7 @@
   "emoji_button.symbols": "Symboles",
   "emoji_button.travel": "Lieux & Voyages",
   "empty_column.account_timeline": "Aucun pouet ici !",
-  "empty_column.blocks": "Vous n’avez bloqué aucun utilisateur pour le moment.",
+  "empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.",
   "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !",
   "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
   "empty_column.domain_blocks": "Il n’y a aucun domaine caché pour le moment.",
@@ -126,12 +126,12 @@
   "empty_column.home.public_timeline": "le fil public",
   "empty_column.list": "Il n’y a rien dans cette liste pour l’instant. Dès que des personnes de cette liste publieront de nouveaux statuts, ils apparaîtront ici.",
   "empty_column.lists": "Vous n’avez pas encore de liste. Lorsque vous en créerez une, elle apparaîtra ici.",
-  "empty_column.mutes": "Vous n’avez pas encore mis des utilisateurs en silence.",
+  "empty_column.mutes": "Vous n’avez pas encore mis d'utilisateur·rice·s en silence.",
   "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres personnes pour débuter la conversation.",
   "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des personnes d’autres instances pour remplir le fil public",
   "follow_request.authorize": "Accepter",
   "follow_request.reject": "Rejeter",
-  "getting_started.developers": "Développeurs",
+  "getting_started.developers": "Développeur·euse·s",
   "getting_started.directory": "Annuaire des profils",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Pour commencer",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "et {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sans {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Tous ces éléments",
   "hashtag.column_settings.tag_mode.any": "Au moins un de ces éléments",
   "hashtag.column_settings.tag_mode.none": "Aucun de ces éléments",
@@ -150,32 +152,32 @@
   "home.column_settings.show_reblogs": "Afficher les partages",
   "home.column_settings.show_replies": "Afficher les réponses",
   "introduction.federation.action": "Suivant",
-  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.headline": "Fil public global",
   "introduction.federation.federated.text": "Les messages publics provenant d'autres serveurs du fediverse apparaîtront dans le fil public global.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.headline": "Accueil",
   "introduction.federation.home.text": "Les messages des personnes que vous suivez apparaîtront dans votre fil d'accueil. Vous pouvez suivre n'importe qui sur n'importe quel serveur !",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "Fil public local",
   "introduction.federation.local.text": "Les messages publics de personnes se trouvant sur le même serveur que vous apparaîtront sur le fil public local.",
   "introduction.interactions.action": "Finir le tutoriel !",
   "introduction.interactions.favourite.headline": "Favoris",
-  "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard, et faire savoir à l'auteur que vous l'avez aimé, en le favorisant.",
+  "introduction.interactions.favourite.text": "Vous pouvez garder un pouet pour plus tard, et faire savoir à son auteur·ice que vous l'avez aimé, en le favorisant.",
   "introduction.interactions.reblog.headline": "Repartager",
-  "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos suiveurs en les repartageant.",
+  "introduction.interactions.reblog.text": "Vous pouvez partager les pouets d'autres personnes avec vos abonné·e·s en les repartageant.",
   "introduction.interactions.reply.headline": "Répondre",
   "introduction.interactions.reply.text": "Vous pouvez répondre aux pouets d'autres personnes et à vos propres pouets, ce qui les enchaînera dans une conversation.",
   "introduction.welcome.action": "Allons-y !",
   "introduction.welcome.headline": "Premiers pas",
   "introduction.welcome.text": "Bienvenue dans le fediverse ! Dans quelques instants, vous pourrez diffuser des messages et parler à vos amis sur une grande variété de serveurs. Mais ce serveur, {domain}, est spécial - il héberge votre profil, alors souvenez-vous de son nom.",
-  "keyboard_shortcuts.back": "revenir en arrière",
-  "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateurs bloqués",
-  "keyboard_shortcuts.boost": "partager",
-  "keyboard_shortcuts.column": "focaliser un statut dans l’une des colonnes",
+  "keyboard_shortcuts.back": "pour revenir en arrière",
+  "keyboard_shortcuts.blocked": "pour ouvrir une liste d’utilisateur·rice·s bloqué·e·s",
+  "keyboard_shortcuts.boost": "pour partager",
+  "keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes",
   "keyboard_shortcuts.compose": "pour centrer la zone de rédaction",
   "keyboard_shortcuts.description": "Description",
   "keyboard_shortcuts.direct": "pour ouvrir une colonne des messages directs",
   "keyboard_shortcuts.down": "pour descendre dans la liste",
   "keyboard_shortcuts.enter": "pour ouvrir le statut",
-  "keyboard_shortcuts.favourite": "vers les favoris",
+  "keyboard_shortcuts.favourite": "pour ajouter aux favoris",
   "keyboard_shortcuts.favourites": "pour ouvrir une liste de favoris",
   "keyboard_shortcuts.federated": "pour ouvrir le fil public global",
   "keyboard_shortcuts.heading": "Raccourcis clavier",
@@ -184,7 +186,7 @@
   "keyboard_shortcuts.legend": "pour afficher cette légende",
   "keyboard_shortcuts.local": "pour ouvrir le fil public local",
   "keyboard_shortcuts.mention": "pour mentionner l’auteur·rice",
-  "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateurs rendus muets",
+  "keyboard_shortcuts.muted": "pour ouvrir la liste des utilisateur·rice·s rendu·e·s muet·te·s",
   "keyboard_shortcuts.my_profile": "pour ouvrir votre profil",
   "keyboard_shortcuts.notifications": "pour ouvrir votre colonne de notifications",
   "keyboard_shortcuts.pinned": "pour ouvrir une liste des pouets épinglés",
@@ -195,7 +197,7 @@
   "keyboard_shortcuts.start": "pour ouvrir la colonne \"pour commencer\"",
   "keyboard_shortcuts.toggle_hidden": "pour afficher/cacher un texte derrière CW",
   "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet",
-  "keyboard_shortcuts.unfocus": "pour recentrer composer textarea/search",
+  "keyboard_shortcuts.unfocus": "pour quitter la zone de composition/recherche",
   "keyboard_shortcuts.up": "pour remonter dans la liste",
   "lightbox.close": "Fermer",
   "lightbox.next": "Suivant",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Supprimer de la liste",
   "lists.delete": "Effacer la liste",
   "lists.edit": "Éditer la liste",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Ajouter une liste",
   "lists.new.title_placeholder": "Titre de la nouvelle liste",
   "lists.search": "Rechercher parmi les gens que vous suivez",
@@ -225,25 +228,25 @@
   "navigation_bar.filters": "Mots silenciés",
   "navigation_bar.follow_requests": "Demandes de suivi",
   "navigation_bar.info": "Plus d’informations",
-  "navigation_bar.keyboard_shortcuts": "Raccourcis-clavier",
+  "navigation_bar.keyboard_shortcuts": "Raccourcis clavier",
   "navigation_bar.lists": "Listes",
   "navigation_bar.logout": "Déconnexion",
   "navigation_bar.mutes": "Comptes masqués",
-  "navigation_bar.personal": "Personal",
+  "navigation_bar.personal": "Personnel",
   "navigation_bar.pins": "Pouets épinglés",
   "navigation_bar.preferences": "Préférences",
   "navigation_bar.public_timeline": "Fil public global",
   "navigation_bar.security": "Sécurité",
   "notification.favourite": "{name} a ajouté à ses favoris :",
   "notification.follow": "{name} vous suit",
-  "notification.mention": "{name} vous a mentionné⋅e :",
+  "notification.mention": "{name} vous a mentionné :",
   "notification.reblog": "{name} a partagé votre statut :",
   "notifications.clear": "Nettoyer les notifications",
   "notifications.clear_confirmation": "Voulez-vous vraiment supprimer toutes vos notifications ?",
   "notifications.column_settings.alert": "Notifications locales",
   "notifications.column_settings.favourite": "Favoris :",
   "notifications.column_settings.filter_bar.advanced": "Afficher toutes les catégories",
-  "notifications.column_settings.filter_bar.category": "Barre de recherche rapide",
+  "notifications.column_settings.filter_bar.category": "Barre de filtrage rapide",
   "notifications.column_settings.filter_bar.show": "Afficher",
   "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s :",
   "notifications.column_settings.mention": "Mentions :",
@@ -254,7 +257,7 @@
   "notifications.filter.all": "Tout",
   "notifications.filter.boosts": "Repartages",
   "notifications.filter.favourites": "Favoris",
-  "notifications.filter.follows": "Suiveurs",
+  "notifications.filter.follows": "Abonné·e·s",
   "notifications.filter.mentions": "Mentions",
   "notifications.group": "{count} notifications",
   "privacy.change": "Ajuster la confidentialité du message",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Annuler",
   "report.forward": "Transférer à {target}",
   "report.forward_hint": "Le compte provient d’un autre serveur. Envoyez également une copie anonyme du rapport ?",
-  "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :",
+  "report.hint": "Le rapport sera envoyé aux modérateur·rice·s de votre instance. Vous pouvez expliquer pourquoi vous signalez le compte ci-dessous :",
   "report.placeholder": "Commentaires additionnels",
   "report.submit": "Envoyer",
   "report.target": "Signalement",
@@ -291,13 +294,13 @@
   "search_results.hashtags": "Hashtags",
   "search_results.statuses": "Pouets",
   "search_results.total": "{count, number} {count, plural, one {résultat} other {résultats}}",
-  "standalone.public_title": "Un aperçu …",
+  "standalone.public_title": "Un aperçu…",
   "status.admin_account": "Ouvrir l'interface de modération pour @{name}",
   "status.admin_status": "Ouvrir ce statut dans l'interface de modération",
-  "status.block": "Block @{name}",
+  "status.block": "Bloquer @{name}",
   "status.cancel_reblog_private": "Dé-booster",
   "status.cannot_reblog": "Cette publication ne peut être boostée",
-  "status.copy": "Copy link to status",
+  "status.copy": "Copier le lien vers le pouet",
   "status.delete": "Effacer",
   "status.detailed_status": "Vue détaillée de la conversation",
   "status.direct": "Envoyer un message direct à @{name}",
@@ -306,7 +309,7 @@
   "status.filtered": "Filtré",
   "status.load_more": "Charger plus",
   "status.media_hidden": "Média caché",
-  "status.mention": "Mentionner",
+  "status.mention": "Mentionner @{name}",
   "status.more": "Plus",
   "status.mute": "Masquer @{name}",
   "status.mute_conversation": "Masquer la conversation",
@@ -329,11 +332,11 @@
   "status.show_less_all": "Tout replier",
   "status.show_more": "Déplier",
   "status.show_more_all": "Tout déplier",
-  "status.show_thread": "Afficher le fil",
+  "status.show_thread": "Lire le fil",
   "status.unmute_conversation": "Ne plus masquer la conversation",
   "status.unpin": "Retirer du profil",
   "suggestions.dismiss": "Rejeter la suggestion",
-  "suggestions.header": "Vous pourriez être intéressé par.…",
+  "suggestions.header": "Vous pourriez être intéressé par…",
   "tabs_bar.federated_timeline": "Fil public global",
   "tabs_bar.home": "Accueil",
   "tabs_bar.local_timeline": "Fil public local",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
   "upload_area.title": "Glissez et déposez pour envoyer",
   "upload_button.label": "Joindre un média (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Taille maximale d'envoi de fichier dépassée.",
   "upload_form.description": "Décrire pour les malvoyant·e·s",
   "upload_form.focus": "Modifier l’aperçu",
   "upload_form.undo": "Supprimer",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 45bc2d36c5..789624d388 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Aínda non ten listas. Cando cree unha, mostrarase aquí.",
   "empty_column.mutes": "Non acalou ningunha usuaria polo de agora.",
   "empty_column.notifications": "Aínda non ten notificacións. Interactúe con outras para iniciar unha conversa.",
-  "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outras instancias para ir enchéndoa",
+  "empty_column.public": "Nada por aquí! Escriba algo de xeito público, ou siga manualmente usuarias de outros servidores para ir enchéndoa",
   "follow_request.authorize": "Autorizar",
   "follow_request.reject": "Rexeitar",
   "getting_started.developers": "Desenvolvedoras",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sen {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Todos estos",
   "hashtag.column_settings.tag_mode.any": "Calquera de estos",
   "hashtag.column_settings.tag_mode.none": "Ningún de estos",
@@ -160,7 +162,7 @@
   "introduction.interactions.favourite.headline": "Favorito",
   "introduction.interactions.favourite.text": "Pode gardar un toot para máis tarde, e facerlle saber a autora que lle gustou, dándolle a Favorito.",
   "introduction.interactions.reblog.headline": "Promocionar",
-  "introduction.interactions.reblog.text": "Pode compartir os toots de outra xente coas súas seguirodas promocionándoos.",
+  "introduction.interactions.reblog.text": "Pode compartir os toots de outra xente coas súas seguidoras promocionándoos.",
   "introduction.interactions.reply.headline": "Respostar",
   "introduction.interactions.reply.text": "Pode respostar aos toots de outras persoas e aos seus propios, así quedarán encadeados nunha conversa.",
   "introduction.welcome.action": "Imos!",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Eliminar da lista",
   "lists.delete": "Delete list",
   "lists.edit": "Editar lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Engadir lista",
   "lists.new.title_placeholder": "Novo título da lista",
   "lists.search": "Procurar entre a xente que segues",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "Favoritas",
   "navigation_bar.filters": "Palabras acaladas",
   "navigation_bar.follow_requests": "Peticións de seguimento",
-  "navigation_bar.info": "Sobre esta instancia",
+  "navigation_bar.info": "Sobre este servidor",
   "navigation_bar.keyboard_shortcuts": "Atallos",
   "navigation_bar.lists": "Listas",
   "navigation_bar.logout": "Sair",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Cancelar",
   "report.forward": "Reenviar a {target}",
   "report.forward_hint": "A conta pertence a outro servidor. Enviar unha copia anónima do informe alí tamén?",
-  "report.hint": "O informe enviarase a moderación da súa instancia. Abaixo pode explicar a razón pola que está a información:",
+  "report.hint": "O informe enviarase a moderación do seu servidor. Abaixo pode explicar a razón pola que está a informar:",
   "report.placeholder": "Comentarios adicionais",
   "report.submit": "Enviar",
   "report.target": "Informar {target}",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 13278382fd..56d474170a 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index a4aafd8fbe..cc4f5725a9 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 41734b58da..a82b3e94d4 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Eltávolít a listából",
   "lists.delete": "Lista törlése",
   "lists.edit": "Lista szerkesztése",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Lista hozzáadása",
   "lists.new.title_placeholder": "Új lista cím",
   "lists.search": "Keresés a követtett személyek között",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 2169bb9908..07b239f874 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Հանել ցանկից",
   "lists.delete": "Ջնջել ցանկը",
   "lists.edit": "Փոփոխել ցանկը",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Ավելացնել ցանկ",
   "lists.new.title_placeholder": "Նոր ցանկի վերնագիր",
   "lists.search": "Փնտրել քո հետեւած մարդկանց մեջ",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index c8cd2b3d29..a23c0a5475 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 17f74cbabc..e375314bdd 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 423efdbc3c..6825d8d059 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_header.tag_mode.none": "senza {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Tutti questi",
   "hashtag.column_settings.tag_mode.any": "Uno o più di questi",
   "hashtag.column_settings.tag_mode.none": "Nessuno di questi",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Togli dalla lista",
   "lists.delete": "Delete list",
   "lists.edit": "Modifica lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Aggiungi lista",
   "lists.new.title_placeholder": "Titolo della nuova lista",
   "lists.search": "Cerca tra le persone che segui",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 13364066fa..4fb5d8e27b 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "と {additional}",
   "hashtag.column_header.tag_mode.any": "か {additional}",
   "hashtag.column_header.tag_mode.none": "({additional} を除く)",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "すべてを含む",
   "hashtag.column_settings.tag_mode.any": "いずれかを含む",
   "hashtag.column_settings.tag_mode.none": "これらを除く",
@@ -204,6 +206,7 @@
   "lists.account.remove": "リストから外す",
   "lists.delete": "リストを削除",
   "lists.edit": "リストを編集",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "リストを作成",
   "lists.new.title_placeholder": "新規リスト名",
   "lists.search": "フォローしている人の中から検索",
@@ -297,7 +300,7 @@
   "status.block": "@{name}さんをブロック",
   "status.cancel_reblog_private": "ブースト解除",
   "status.cannot_reblog": "この投稿はブーストできません",
-  "status.copy": "Copy link to status",
+  "status.copy": "トゥートへのリンクをコピー",
   "status.delete": "削除",
   "status.detailed_status": "詳細な会話ビュー",
   "status.direct": "@{name}さんにダイレクトメッセージ",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index e2e7306fd0..2f7cdc70df 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "სიიდან ამოშლა",
   "lists.delete": "სიის წაშლა",
   "lists.edit": "სიის შეცვლა",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "სიის დამატება",
   "lists.new.title_placeholder": "ახალი სიის სათაური",
   "lists.search": "ძებნა ადამიანებს შორის რომელთაც მიჰყვებით",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
new file mode 100644
index 0000000000..fc0c88dd99
--- /dev/null
+++ b/app/javascript/mastodon/locales/kk.json
@@ -0,0 +1,363 @@
+{
+  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.badges.bot": "Bot",
+  "account.block": "Block @{name}",
+  "account.block_domain": "Hide everything from {domain}",
+  "account.blocked": "Blocked",
+  "account.direct": "Direct message @{name}",
+  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
+  "account.domain_blocked": "Domain hidden",
+  "account.edit_profile": "Edit profile",
+  "account.endorse": "Feature on profile",
+  "account.follow": "Follow",
+  "account.followers": "Followers",
+  "account.followers.empty": "No one follows this user yet.",
+  "account.follows": "Follows",
+  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows_you": "Follows you",
+  "account.hide_reblogs": "Hide boosts from @{name}",
+  "account.link_verified_on": "Ownership of this link was checked on {date}",
+  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.media": "Media",
+  "account.mention": "Mention @{name}",
+  "account.moved_to": "{name} has moved to:",
+  "account.mute": "Mute @{name}",
+  "account.mute_notifications": "Mute notifications from @{name}",
+  "account.muted": "Muted",
+  "account.posts": "Toots",
+  "account.posts_with_replies": "Toots and replies",
+  "account.report": "Report @{name}",
+  "account.requested": "Awaiting approval. Click to cancel follow request",
+  "account.share": "Share @{name}'s profile",
+  "account.show_reblogs": "Show boosts from @{name}",
+  "account.unblock": "Unblock @{name}",
+  "account.unblock_domain": "Unhide {domain}",
+  "account.unendorse": "Don't feature on profile",
+  "account.unfollow": "Unfollow",
+  "account.unmute": "Unmute @{name}",
+  "account.unmute_notifications": "Unmute notifications from @{name}",
+  "account.view_full_profile": "View full profile",
+  "alert.unexpected.message": "An unexpected error occurred.",
+  "alert.unexpected.title": "Oops!",
+  "boost_modal.combo": "You can press {combo} to skip this next time",
+  "bundle_column_error.body": "Something went wrong while loading this component.",
+  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.title": "Network error",
+  "bundle_modal_error.close": "Close",
+  "bundle_modal_error.message": "Something went wrong while loading this component.",
+  "bundle_modal_error.retry": "Try again",
+  "column.blocks": "Blocked users",
+  "column.community": "Local timeline",
+  "column.direct": "Direct messages",
+  "column.domain_blocks": "Hidden domains",
+  "column.favourites": "Favourites",
+  "column.follow_requests": "Follow requests",
+  "column.home": "Home",
+  "column.lists": "Lists",
+  "column.mutes": "Muted users",
+  "column.notifications": "Notifications",
+  "column.pins": "Pinned toot",
+  "column.public": "Federated timeline",
+  "column_back_button.label": "Back",
+  "column_header.hide_settings": "Hide settings",
+  "column_header.moveLeft_settings": "Move column to the left",
+  "column_header.moveRight_settings": "Move column to the right",
+  "column_header.pin": "Pin",
+  "column_header.show_settings": "Show settings",
+  "column_header.unpin": "Unpin",
+  "column_subheading.settings": "Settings",
+  "community.column_settings.media_only": "Media Only",
+  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
+  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
+  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
+  "compose_form.lock_disclaimer.lock": "locked",
+  "compose_form.placeholder": "What is on your mind?",
+  "compose_form.publish": "Toot",
+  "compose_form.publish_loud": "{publish}!",
+  "compose_form.sensitive.marked": "Media is marked as sensitive",
+  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
+  "compose_form.spoiler.marked": "Text is hidden behind warning",
+  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.spoiler_placeholder": "Write your warning here",
+  "confirmation_modal.cancel": "Cancel",
+  "confirmations.block.confirm": "Block",
+  "confirmations.block.message": "Are you sure you want to block {name}?",
+  "confirmations.delete.confirm": "Delete",
+  "confirmations.delete.message": "Are you sure you want to delete this status?",
+  "confirmations.delete_list.confirm": "Delete",
+  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
+  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
+  "confirmations.mute.confirm": "Mute",
+  "confirmations.mute.message": "Are you sure you want to mute {name}?",
+  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
+  "confirmations.reply.confirm": "Reply",
+  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
+  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
+  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.preview": "Here is what it will look like:",
+  "emoji_button.activity": "Activity",
+  "emoji_button.custom": "Custom",
+  "emoji_button.flags": "Flags",
+  "emoji_button.food": "Food & Drink",
+  "emoji_button.label": "Insert emoji",
+  "emoji_button.nature": "Nature",
+  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objects",
+  "emoji_button.people": "People",
+  "emoji_button.recent": "Frequently used",
+  "emoji_button.search": "Search...",
+  "emoji_button.search_results": "Search results",
+  "emoji_button.symbols": "Symbols",
+  "emoji_button.travel": "Travel & Places",
+  "empty_column.account_timeline": "No toots here!",
+  "empty_column.blocks": "You haven't blocked any users yet.",
+  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
+  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
+  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
+  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
+  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
+  "empty_column.hashtag": "There is nothing in this hashtag yet.",
+  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
+  "empty_column.home.public_timeline": "the public timeline",
+  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
+  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
+  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
+  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
+  "follow_request.authorize": "Authorize",
+  "follow_request.reject": "Reject",
+  "getting_started.developers": "Developers",
+  "getting_started.directory": "Profile directory",
+  "getting_started.documentation": "Documentation",
+  "getting_started.heading": "Getting started",
+  "getting_started.invite": "Invite people",
+  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.security": "Security",
+  "getting_started.terms": "Terms of service",
+  "hashtag.column_header.tag_mode.all": "and {additional}",
+  "hashtag.column_header.tag_mode.any": "or {additional}",
+  "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "All of these",
+  "hashtag.column_settings.tag_mode.any": "Any of these",
+  "hashtag.column_settings.tag_mode.none": "None of these",
+  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
+  "home.column_settings.basic": "Basic",
+  "home.column_settings.show_reblogs": "Show boosts",
+  "home.column_settings.show_replies": "Show replies",
+  "introduction.federation.action": "Next",
+  "introduction.federation.federated.headline": "Federated",
+  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
+  "introduction.federation.home.headline": "Home",
+  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
+  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
+  "introduction.interactions.action": "Finish toot-orial!",
+  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
+  "introduction.interactions.reblog.headline": "Boost",
+  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
+  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
+  "introduction.welcome.action": "Let's go!",
+  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
+  "keyboard_shortcuts.back": "to navigate back",
+  "keyboard_shortcuts.blocked": "to open blocked users list",
+  "keyboard_shortcuts.boost": "to boost",
+  "keyboard_shortcuts.column": "to focus a status in one of the columns",
+  "keyboard_shortcuts.compose": "to focus the compose textarea",
+  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.direct": "to open direct messages column",
+  "keyboard_shortcuts.down": "to move down in the list",
+  "keyboard_shortcuts.enter": "to open status",
+  "keyboard_shortcuts.favourite": "to favourite",
+  "keyboard_shortcuts.favourites": "to open favourites list",
+  "keyboard_shortcuts.federated": "to open federated timeline",
+  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
+  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.hotkey": "Hotkey",
+  "keyboard_shortcuts.legend": "to display this legend",
+  "keyboard_shortcuts.local": "to open local timeline",
+  "keyboard_shortcuts.mention": "to mention author",
+  "keyboard_shortcuts.muted": "to open muted users list",
+  "keyboard_shortcuts.my_profile": "to open your profile",
+  "keyboard_shortcuts.notifications": "to open notifications column",
+  "keyboard_shortcuts.pinned": "to open pinned toots list",
+  "keyboard_shortcuts.profile": "to open author's profile",
+  "keyboard_shortcuts.reply": "to reply",
+  "keyboard_shortcuts.requests": "to open follow requests list",
+  "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.start": "to open \"get started\" column",
+  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
+  "keyboard_shortcuts.toot": "to start a brand new toot",
+  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
+  "keyboard_shortcuts.up": "to move up in the list",
+  "lightbox.close": "Close",
+  "lightbox.next": "Next",
+  "lightbox.previous": "Previous",
+  "lists.account.add": "Add to list",
+  "lists.account.remove": "Remove from list",
+  "lists.delete": "Delete list",
+  "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Add list",
+  "lists.new.title_placeholder": "New list title",
+  "lists.search": "Search among people you follow",
+  "lists.subheading": "Your lists",
+  "loading_indicator.label": "Loading...",
+  "media_gallery.toggle_visible": "Toggle visibility",
+  "missing_indicator.label": "Not found",
+  "missing_indicator.sublabel": "This resource could not be found",
+  "mute_modal.hide_notifications": "Hide notifications from this user?",
+  "navigation_bar.apps": "Mobile apps",
+  "navigation_bar.blocks": "Blocked users",
+  "navigation_bar.community_timeline": "Local timeline",
+  "navigation_bar.compose": "Compose new toot",
+  "navigation_bar.direct": "Direct messages",
+  "navigation_bar.discover": "Discover",
+  "navigation_bar.domain_blocks": "Hidden domains",
+  "navigation_bar.edit_profile": "Edit profile",
+  "navigation_bar.favourites": "Favourites",
+  "navigation_bar.filters": "Muted words",
+  "navigation_bar.follow_requests": "Follow requests",
+  "navigation_bar.info": "About this server",
+  "navigation_bar.keyboard_shortcuts": "Hotkeys",
+  "navigation_bar.lists": "Lists",
+  "navigation_bar.logout": "Logout",
+  "navigation_bar.mutes": "Muted users",
+  "navigation_bar.personal": "Personal",
+  "navigation_bar.pins": "Pinned toots",
+  "navigation_bar.preferences": "Preferences",
+  "navigation_bar.public_timeline": "Federated timeline",
+  "navigation_bar.security": "Security",
+  "notification.favourite": "{name} favourited your status",
+  "notification.follow": "{name} followed you",
+  "notification.mention": "{name} mentioned you",
+  "notification.reblog": "{name} boosted your status",
+  "notifications.clear": "Clear notifications",
+  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
+  "notifications.column_settings.alert": "Desktop notifications",
+  "notifications.column_settings.favourite": "Favourites:",
+  "notifications.column_settings.filter_bar.advanced": "Display all categories",
+  "notifications.column_settings.filter_bar.category": "Quick filter bar",
+  "notifications.column_settings.filter_bar.show": "Show",
+  "notifications.column_settings.follow": "New followers:",
+  "notifications.column_settings.mention": "Mentions:",
+  "notifications.column_settings.push": "Push notifications",
+  "notifications.column_settings.reblog": "Boosts:",
+  "notifications.column_settings.show": "Show in column",
+  "notifications.column_settings.sound": "Play sound",
+  "notifications.filter.all": "All",
+  "notifications.filter.boosts": "Boosts",
+  "notifications.filter.favourites": "Favourites",
+  "notifications.filter.follows": "Follows",
+  "notifications.filter.mentions": "Mentions",
+  "notifications.group": "{count} notifications",
+  "privacy.change": "Adjust status privacy",
+  "privacy.direct.long": "Post to mentioned users only",
+  "privacy.direct.short": "Direct",
+  "privacy.private.long": "Post to followers only",
+  "privacy.private.short": "Followers-only",
+  "privacy.public.long": "Post to public timelines",
+  "privacy.public.short": "Public",
+  "privacy.unlisted.long": "Do not show in public timelines",
+  "privacy.unlisted.short": "Unlisted",
+  "regeneration_indicator.label": "Loading…",
+  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "relative_time.days": "{number}d",
+  "relative_time.hours": "{number}h",
+  "relative_time.just_now": "now",
+  "relative_time.minutes": "{number}m",
+  "relative_time.seconds": "{number}s",
+  "reply_indicator.cancel": "Cancel",
+  "report.forward": "Forward to {target}",
+  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
+  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
+  "report.placeholder": "Additional comments",
+  "report.submit": "Submit",
+  "report.target": "Report {target}",
+  "search.placeholder": "Search",
+  "search_popout.search_format": "Advanced search format",
+  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "search_popout.tips.hashtag": "hashtag",
+  "search_popout.tips.status": "status",
+  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
+  "search_popout.tips.user": "user",
+  "search_results.accounts": "People",
+  "search_results.hashtags": "Hashtags",
+  "search_results.statuses": "Toots",
+  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
+  "standalone.public_title": "A look inside...",
+  "status.admin_account": "Open moderation interface for @{name}",
+  "status.admin_status": "Open this status in the moderation interface",
+  "status.block": "Block @{name}",
+  "status.cancel_reblog_private": "Unboost",
+  "status.cannot_reblog": "This post cannot be boosted",
+  "status.copy": "Copy link to status",
+  "status.delete": "Delete",
+  "status.detailed_status": "Detailed conversation view",
+  "status.direct": "Direct message @{name}",
+  "status.embed": "Embed",
+  "status.favourite": "Favourite",
+  "status.filtered": "Filtered",
+  "status.load_more": "Load more",
+  "status.media_hidden": "Media hidden",
+  "status.mention": "Mention @{name}",
+  "status.more": "More",
+  "status.mute": "Mute @{name}",
+  "status.mute_conversation": "Mute conversation",
+  "status.open": "Expand this status",
+  "status.pin": "Pin on profile",
+  "status.pinned": "Pinned toot",
+  "status.read_more": "Read more",
+  "status.reblog": "Boost",
+  "status.reblog_private": "Boost to original audience",
+  "status.reblogged_by": "{name} boosted",
+  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
+  "status.redraft": "Delete & re-draft",
+  "status.reply": "Reply",
+  "status.replyAll": "Reply to thread",
+  "status.report": "Report @{name}",
+  "status.sensitive_toggle": "Click to view",
+  "status.sensitive_warning": "Sensitive content",
+  "status.share": "Share",
+  "status.show_less": "Show less",
+  "status.show_less_all": "Show less for all",
+  "status.show_more": "Show more",
+  "status.show_more_all": "Show more for all",
+  "status.show_thread": "Show thread",
+  "status.unmute_conversation": "Unmute conversation",
+  "status.unpin": "Unpin from profile",
+  "suggestions.dismiss": "Dismiss suggestion",
+  "suggestions.header": "You might be interested in…",
+  "tabs_bar.federated_timeline": "Federated",
+  "tabs_bar.home": "Home",
+  "tabs_bar.local_timeline": "Local",
+  "tabs_bar.notifications": "Notifications",
+  "tabs_bar.search": "Search",
+  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
+  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
+  "upload_area.title": "Drag & drop to upload",
+  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "File upload limit exceeded.",
+  "upload_form.description": "Describe for the visually impaired",
+  "upload_form.focus": "Crop",
+  "upload_form.undo": "Delete",
+  "upload_progress.label": "Uploading...",
+  "video.close": "Close video",
+  "video.exit_fullscreen": "Exit full screen",
+  "video.expand": "Expand video",
+  "video.fullscreen": "Full screen",
+  "video.hide": "Hide video",
+  "video.mute": "Mute sound",
+  "video.pause": "Pause",
+  "video.play": "Play",
+  "video.unmute": "Unmute sound"
+}
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 6d607068e2..040ada2c05 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "아직 리스트가 없습니다. 리스트를 만들면 여기에 나타납니다.",
   "empty_column.mutes": "아직 아무도 뮤트하지 않았습니다.",
   "empty_column.notifications": "아직 알림이 없습니다. 다른 사람과 대화를 시작해 보세요.",
-  "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 인스턴스의 유저를 팔로우 해서 채워보세요",
+  "empty_column.public": "여기엔 아직 아무 것도 없습니다! 공개적으로 무언가 포스팅하거나, 다른 서버의 유저를 팔로우 해서 채워보세요",
   "follow_request.authorize": "허가",
   "follow_request.reject": "거부",
   "getting_started.developers": "개발자",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "그리고 {additional}",
   "hashtag.column_header.tag_mode.any": "또는 {additional}",
   "hashtag.column_header.tag_mode.none": "({additional}를 제외)",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "모두",
   "hashtag.column_settings.tag_mode.any": "아무것이든",
   "hashtag.column_settings.tag_mode.none": "이것들을 제외하고",
@@ -204,6 +206,7 @@
   "lists.account.remove": "리스트에서 제거",
   "lists.delete": "리스트 삭제",
   "lists.edit": "리스트 편집",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "리스트 추가",
   "lists.new.title_placeholder": "새 리스트의 이름",
   "lists.search": "팔로우 중인 사람들 중에서 찾기",
@@ -224,7 +227,7 @@
   "navigation_bar.favourites": "즐겨찾기",
   "navigation_bar.filters": "뮤트",
   "navigation_bar.follow_requests": "팔로우 요청",
-  "navigation_bar.info": "이 인스턴스에 대해서",
+  "navigation_bar.info": "이 서버에 대해서",
   "navigation_bar.keyboard_shortcuts": "단축키",
   "navigation_bar.lists": "리스트",
   "navigation_bar.logout": "로그아웃",
@@ -297,7 +300,7 @@
   "status.block": "@{name} 차단",
   "status.cancel_reblog_private": "부스트 취소",
   "status.cannot_reblog": "이 포스트는 부스트 할 수 없습니다",
-  "status.copy": "Copy link to status",
+  "status.copy": "게시물 링크 복사",
   "status.delete": "삭제",
   "status.detailed_status": "대화 자세히 보기",
   "status.direct": "@{name}에게 다이렉트 메시지",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
   "upload_area.title": "드래그 & 드롭으로 업로드",
   "upload_button.label": "미디어 추가 (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "파일 업로드 제한에 도달했습니다.",
   "upload_form.description": "시각장애인을 위한 설명",
   "upload_form.focus": "미리보기 변경",
   "upload_form.undo": "삭제",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index dbea1d6dc9..eaf3366aa7 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index 602a59ca08..536f654624 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 92f94ddc06..fdc1eed4f0 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -5,7 +5,7 @@
   "account.block_domain": "Verberg alles van {domain}",
   "account.blocked": "Geblokkeerd",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "De informatie hieronder kan mogelijk een incompleet beeld geven van dit gebruikersprofiel.",
+  "account.disclaimer_full": "De informatie hieronder kan een incompleet beeld geven van dit gebruikersprofiel.",
   "account.domain_blocked": "Domein verborgen",
   "account.edit_profile": "Profiel bewerken",
   "account.endorse": "Op profiel weergeven",
@@ -94,7 +94,7 @@
   "confirmations.redraft.confirm": "Verwijderen en herschrijven",
   "confirmations.redraft.message": "Weet je zeker dat je deze toot wilt verwijderen en herschrijven? Je verliest wel de boosts en favorieten, en reacties op de originele toot zitten niet meer aan de nieuwe toot vast.",
   "confirmations.reply.confirm": "Reageren",
-  "confirmations.reply.message": "Door nu  te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
+  "confirmations.reply.message": "Door nu te reageren overschrijf je de toot die je op dit moment aan het schrijven bent. Weet je zeker dat je verder wil gaan?",
   "confirmations.unfollow.confirm": "Ontvolgen",
   "confirmations.unfollow.message": "Weet je het zeker dat je {name} wilt ontvolgen?",
   "embed.instructions": "Embed deze toot op jouw website, door de onderstaande code te kopiëren.",
@@ -117,7 +117,7 @@
   "empty_column.blocks": "Jij hebt nog geen enkele gebruiker geblokkeerd.",
   "empty_column.community": "De lokale tijdlijn is nog leeg. Toot iets in het openbaar om de bal aan het rollen te krijgen!",
   "empty_column.direct": "Je hebt nog geen directe berichten. Wanneer je er een verzend of ontvangt, zijn deze hier te zien.",
-  "empty_column.domain_blocks": "Er zijn nog geen genegeerde domeinen.",
+  "empty_column.domain_blocks": "Er zijn nog geen genegeerde servers.",
   "empty_column.favourited_statuses": "Jij hebt nog geen favoriete toots. Wanneer je er een aan jouw favorieten toevoegt, valt deze hier te zien.",
   "empty_column.favourites": "Niemand heeft deze toot nog aan hun favorieten toegevoegd. Wanneer iemand dit doet, valt dat hier te zien.",
   "empty_column.follow_requests": "Jij hebt nog enkel volgverzoek ontvangen. Wanneer je er eentje ontvangt, valt dat hier te zien.",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "en {additional}",
   "hashtag.column_header.tag_mode.any": "of {additional}",
   "hashtag.column_header.tag_mode.none": "zonder {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Allemaal",
   "hashtag.column_settings.tag_mode.any": "Een van deze",
   "hashtag.column_settings.tag_mode.none": "Geen van deze",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Uit lijst verwijderen",
   "lists.delete": "Lijst verwijderen",
   "lists.edit": "Lijst bewerken",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Lijst toevoegen",
   "lists.new.title_placeholder": "Naam nieuwe lijst",
   "lists.search": "Zoek naar mensen die je volgt",
@@ -219,7 +222,7 @@
   "navigation_bar.compose": "Nieuw toot schrijven",
   "navigation_bar.direct": "Directe berichten",
   "navigation_bar.discover": "Ontdekken",
-  "navigation_bar.domain_blocks": "Genegeerde domeinen",
+  "navigation_bar.domain_blocks": "Genegeerde servers",
   "navigation_bar.edit_profile": "Profiel bewerken",
   "navigation_bar.favourites": "Favorieten",
   "navigation_bar.filters": "Filters",
@@ -297,7 +300,7 @@
   "status.block": "Blokkeer @{name}",
   "status.cancel_reblog_private": "Niet langer boosten",
   "status.cannot_reblog": "Deze toot kan niet geboost worden",
-  "status.copy": "Copy link to status",
+  "status.copy": "Link naar toot kopiëren",
   "status.delete": "Verwijderen",
   "status.detailed_status": "Uitgebreide gespreksweergave",
   "status.direct": "Directe toot @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.",
   "upload_area.title": "Hierin slepen om te uploaden",
   "upload_button.label": "Media toevoegen (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Uploadlimiet van bestand overschreden.",
   "upload_form.description": "Omschrijf dit voor mensen met een visuele beperking",
   "upload_form.focus": "Voorvertoning aanpassen",
   "upload_form.undo": "Verwijderen",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index f6910f0e66..d9504c0c58 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Fjern fra listen",
   "lists.delete": "Slett listen",
   "lists.edit": "Rediger listen",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Ligg til liste",
   "lists.new.title_placeholder": "Ny listetittel",
   "lists.search": "Søk blant personer du følger",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 8250d59bdc..5d4897e2b4 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "o {additional}",
   "hashtag.column_header.tag_mode.none": "sens {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Totes aquestes",
   "hashtag.column_settings.tag_mode.any": "Un d’aquestes",
   "hashtag.column_settings.tag_mode.none": "Cap d’aquestes",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Levar de la lista",
   "lists.delete": "Suprimir la lista",
   "lists.edit": "Modificar la lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Ajustar una lista",
   "lists.new.title_placeholder": "Títol de la nòva lista",
   "lists.search": "Cercar demest lo monde que seguètz",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index 2af261251d..d1d9004479 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "i {additional}",
   "hashtag.column_header.tag_mode.any": "lub {additional}",
   "hashtag.column_header.tag_mode.none": "bez {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Wszystkie",
   "hashtag.column_settings.tag_mode.any": "Dowolne",
   "hashtag.column_settings.tag_mode.none": "Żadne",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Usunąć z listy",
   "lists.delete": "Usuń listę",
   "lists.edit": "Edytuj listÄ™",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Utwórz listę",
   "lists.new.title_placeholder": "Wprowadź tytuł listy",
   "lists.search": "Szukaj wśród osób które śledzisz",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index bc36829210..83c2dd0ce7 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "e {additional}",
   "hashtag.column_header.tag_mode.any": "ou {additional}",
   "hashtag.column_header.tag_mode.none": "sem {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Todas essas",
   "hashtag.column_settings.tag_mode.any": "Qualquer uma dessas",
   "hashtag.column_settings.tag_mode.none": "Nenhuma dessas",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Delete list",
   "lists.edit": "Editar lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Adicionar lista",
   "lists.new.title_placeholder": "Novo título da lista",
   "lists.search": "Procurar entre as pessoas que você segue",
diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json
index edcfd2fa29..af48b323cc 100644
--- a/app/javascript/mastodon/locales/pt.json
+++ b/app/javascript/mastodon/locales/pt.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remover da lista",
   "lists.delete": "Delete list",
   "lists.edit": "Editar lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Adicionar lista",
   "lists.new.title_placeholder": "Novo título da lista",
   "lists.search": "Pesquisa entre as pessoas que segues",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index 3be3214ee9..802e43ce26 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "și {additional}",
   "hashtag.column_header.tag_mode.any": "sau {additional}",
   "hashtag.column_header.tag_mode.none": "fără {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "Toate acestea",
   "hashtag.column_settings.tag_mode.any": "Oricare din acestea",
   "hashtag.column_settings.tag_mode.none": "Niciuna din aceastea",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Elimină din listă",
   "lists.delete": "Șterge lista",
   "lists.edit": "Editează lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Adaugă listă",
   "lists.new.title_placeholder": "Titlu pentru noua listă",
   "lists.search": "Caută printre persoanale pe care le urmărești",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index db9e732c09..7c978bc3f0 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Убрать из списка",
   "lists.delete": "Удалить список",
   "lists.edit": "Изменить список",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Новый список",
   "lists.new.title_placeholder": "Заголовок списка",
   "lists.search": "Искать из ваших подписок",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index 8ca9132454..62677471c2 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -128,7 +128,7 @@
   "empty_column.lists": "Nemáš ešte žiadne zoznamy. Keď nejaký vytvoríš, bude zobrazený práve tu.",
   "empty_column.mutes": "Ešte si nestĺmil žiadných užívateľov.",
   "empty_column.notifications": "Ešte nemáš žiadne oznámenia. Začni komunikovať s ostatnými, aby diskusia mohla začať.",
-  "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných Mastodon serverov, aby tu niečo pribudlo",
+  "empty_column.public": "Ešte tu nič nie je. Napíš niečo verejne, alebo začni sledovať užívateľov z iných serverov, aby tu niečo pribudlo",
   "follow_request.authorize": "Povoľ prístup",
   "follow_request.reject": "Odmietni",
   "getting_started.developers": "Vývojári",
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "a {additional}",
   "hashtag.column_header.tag_mode.any": "alebo {additional}",
   "hashtag.column_header.tag_mode.none": "bez {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "VÅ¡etky tieto",
   "hashtag.column_settings.tag_mode.any": "Hociktorý z týchto",
   "hashtag.column_settings.tag_mode.none": "Žiaden z týchto",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Odobrať zo zoznamu",
   "lists.delete": "Vymazať list",
   "lists.edit": "Uprav zoznam",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Pridaj zoznam",
   "lists.new.title_placeholder": "Názov nového zoznamu",
   "lists.search": "Vyhľadávajte medzi užívateľmi ktorých sledujete",
@@ -276,7 +279,7 @@
   "reply_indicator.cancel": "Zrušiť",
   "report.forward": "Posuň ku {target}",
   "report.forward_hint": "Tento účet je z iného serveru. Chceš poslať anonymnú kópiu reportu aj tam?",
-  "report.hint": "Toto nahlásenie bude zaslané správcom servera. Môžeš napísať odvôvodnenie prečo si nahlásil/a tento účet:",
+  "report.hint": "Toto nahlásenie bude zaslané správcom tvojho servera. Môžeš napísať odvôvodnenie, prečo nahlasuješ tento účet:",
   "report.placeholder": "Ďalšie komentáre",
   "report.submit": "Poslať",
   "report.target": "Nahlásenie {target}",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 8e5e3deb98..213eb82036 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 3dd7fb4435..6e0d7ebb6e 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -1,360 +1,363 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
-  "account.badges.bot": "Bot",
-  "account.block": "Block @{name}",
-  "account.block_domain": "Hide everything from {domain}",
-  "account.blocked": "Blocked",
-  "account.direct": "Direct message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
-  "account.domain_blocked": "Domain hidden",
-  "account.edit_profile": "Edit profile",
-  "account.endorse": "Feature on profile",
-  "account.follow": "Follow",
-  "account.followers": "Followers",
-  "account.followers.empty": "No one follows this user yet.",
-  "account.follows": "Follows",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
-  "account.follows_you": "Follows you",
-  "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
+  "account.add_or_remove_from_list": "Shtoni ose Hiqni prej listash",
+  "account.badges.bot": "Robot",
+  "account.block": "Blloko @{name}",
+  "account.block_domain": "Fshih gjithçka prej {domain}",
+  "account.blocked": "E bllokuar",
+  "account.direct": "Mesazh i drejtpërdrejt për @{name}",
+  "account.disclaimer_full": "Të dhënat më poshtë mund ta pasqyrojnë pjesërisht profilin e përdoruesit.",
+  "account.domain_blocked": "Përkatësi e fshehur",
+  "account.edit_profile": "Përpunoni profilin",
+  "account.endorse": "Pasqyrojeni në profil",
+  "account.follow": "Ndiqeni",
+  "account.followers": "Ndjekës",
+  "account.followers.empty": "Këtë përdorues ende s’e ndjek njeri.",
+  "account.follows": "Ndjekje",
+  "account.follows.empty": "Ky përdorues ende s’ndjek njeri.",
+  "account.follows_you": "Ju ndjek",
+  "account.hide_reblogs": "Fshih përforcime nga @{name}",
+  "account.link_verified_on": "Pronësia e kësaj lidhjeje qe kontrolluar më {date}",
+  "account.locked_info": "Gjendja e privatësisë së kësaj llogarie është caktuar si e kyçur. I zoti merr dorazi në shqyrtim cilët mund ta ndjekin.",
   "account.media": "Media",
-  "account.mention": "Mention @{name}",
-  "account.moved_to": "{name} has moved to:",
-  "account.mute": "Mute @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
-  "account.posts": "Toots",
-  "account.posts_with_replies": "Toots and replies",
-  "account.report": "Report @{name}",
-  "account.requested": "Awaiting approval. Click to cancel follow request",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
-  "account.unblock": "Unblock @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
-  "account.unfollow": "Unfollow",
-  "account.unmute": "Unmute @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
-  "boost_modal.combo": "You can press {combo} to skip this next time",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
-  "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
-  "column.blocks": "Blocked users",
-  "column.community": "Local timeline",
-  "column.direct": "Direct messages",
-  "column.domain_blocks": "Hidden domains",
-  "column.favourites": "Favourites",
-  "column.follow_requests": "Follow requests",
-  "column.home": "Home",
-  "column.lists": "Lists",
-  "column.mutes": "Muted users",
-  "column.notifications": "Notifications",
-  "column.pins": "Pinned toot",
-  "column.public": "Federated timeline",
-  "column_back_button.label": "Back",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
-  "column_subheading.settings": "Settings",
-  "community.column_settings.media_only": "Media Only",
-  "compose_form.direct_message_warning": "This toot will only be sent to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
-  "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
-  "compose_form.lock_disclaimer": "Your account is not {locked}. Anyone can follow you to view your follower-only posts.",
-  "compose_form.lock_disclaimer.lock": "locked",
-  "compose_form.placeholder": "What is on your mind?",
-  "compose_form.publish": "Toot",
+  "account.mention": "Përmendni @{name}",
+  "account.moved_to": "{name} ka kaluar te:",
+  "account.mute": "Heshtoni @{name}",
+  "account.mute_notifications": "Heshtoji njoftimet prej @{name}",
+  "account.muted": "Heshtuar",
+  "account.posts": "Mesazhe",
+  "account.posts_with_replies": "Mesazhe dhe përgjigje",
+  "account.report": "Raportojeni @{name}",
+  "account.requested": "Në pritje të miratimit. Klikoni që të anulohet kërkesa për ndjekje",
+  "account.share": "Ndajeni profilin e @{name} me të tjerët",
+  "account.show_reblogs": "Shfaq përforcime nga @{name}",
+  "account.unblock": "Zhbllokoje @{name}",
+  "account.unblock_domain": "Shfshihe {domain}",
+  "account.unendorse": "Mos e përfshi në profil",
+  "account.unfollow": "Resht së ndjekuri",
+  "account.unmute": "Ktheji zërin @{name}",
+  "account.unmute_notifications": "Hiqua ndalimin e shfaqjes njoftimeve nga @{name}",
+  "account.view_full_profile": "Shihni profilin e plotë",
+  "alert.unexpected.message": "Ndodhi një gabim të papritur.",
+  "alert.unexpected.title": "Hëm!",
+  "boost_modal.combo": "Mund të shtypni {combo}, që të anashkalohet kjo herës tjetër",
+  "bundle_column_error.body": "Diç shkoi ters teksa ngarkohej ky përbërës.",
+  "bundle_column_error.retry": "Riprovoni",
+  "bundle_column_error.title": "Gabim rrjeti",
+  "bundle_modal_error.close": "Mbylle",
+  "bundle_modal_error.message": "Diç shkoi ters teksa ngarkohej ky përbërës.",
+  "bundle_modal_error.retry": "Riprovoni",
+  "column.blocks": "Përdorues të bllokuar",
+  "column.community": "Rrjedhë kohore vendore",
+  "column.direct": "Mesazhe të drejtpërdrejta",
+  "column.domain_blocks": "Përkatësi të fshehura",
+  "column.favourites": "Të parapëlqyer",
+  "column.follow_requests": "Kërkesa për ndjekje",
+  "column.home": "Kreu",
+  "column.lists": "Lista",
+  "column.mutes": "Përdorues të heshtuar",
+  "column.notifications": "Njoftime",
+  "column.pins": "Mesazhe të fiksuar",
+  "column.public": "Rrjedhë kohore e federuar",
+  "column_back_button.label": "Mbrapsht",
+  "column_header.hide_settings": "Fshihi rregullimet",
+  "column_header.moveLeft_settings": "Shpjere shtyllën majtas",
+  "column_header.moveRight_settings": "Shpjere shtyllën djathtas",
+  "column_header.pin": "Fiksoje",
+  "column_header.show_settings": "Shfaq rregullime",
+  "column_header.unpin": "Shfiksoje",
+  "column_subheading.settings": "Rregullime",
+  "community.column_settings.media_only": "Vetëm Media",
+  "compose_form.direct_message_warning": "Ky mesazh do t’u dërgohet përdoruesve të përmendur.",
+  "compose_form.direct_message_warning_learn_more": "Mësoni më tepër",
+  "compose_form.hashtag_warning": "Ky mesazh s’do të paraqitet nën ndonjë hashtag, ngaqë s’i është caktuar ndonjë. Vetëm mesazhet publike mund të kërkohen sipas  hashtagësh.",
+  "compose_form.lock_disclaimer": "Llogaria juaj s’është {locked}. Mund ta ndjekë cilido, për të parë postimet tuaja vetëm për ndjekësit.",
+  "compose_form.lock_disclaimer.lock": "e bllokuar",
+  "compose_form.placeholder": "Ç’bluani në mendje?",
+  "compose_form.publish": "Mesazh",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
-  "compose_form.spoiler_placeholder": "Write your warning here",
-  "confirmation_modal.cancel": "Cancel",
-  "confirmations.block.confirm": "Block",
-  "confirmations.block.message": "Are you sure you want to block {name}?",
-  "confirmations.delete.confirm": "Delete",
-  "confirmations.delete.message": "Are you sure you want to delete this status?",
-  "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
-  "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable. You will not see content from that domain in any public timelines or your notifications. Your followers from that domain will be removed.",
-  "confirmations.mute.confirm": "Mute",
-  "confirmations.mute.message": "Are you sure you want to mute {name}?",
-  "confirmations.redraft.confirm": "Delete & redraft",
-  "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? Favourites and boosts will be lost, and replies to the original post will be orphaned.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
-  "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
-  "emoji_button.activity": "Activity",
-  "emoji_button.custom": "Custom",
-  "emoji_button.flags": "Flags",
-  "emoji_button.food": "Food & Drink",
-  "emoji_button.label": "Insert emoji",
-  "emoji_button.nature": "Nature",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
-  "emoji_button.objects": "Objects",
-  "emoji_button.people": "People",
-  "emoji_button.recent": "Frequently used",
-  "emoji_button.search": "Search...",
-  "emoji_button.search_results": "Search results",
-  "emoji_button.symbols": "Symbols",
-  "emoji_button.travel": "Travel & Places",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "The local timeline is empty. Write something publicly to get the ball rolling!",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
-  "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
-  "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
-  "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
-  "empty_column.hashtag": "There is nothing in this hashtag yet.",
-  "empty_column.home": "Your home timeline is empty! Visit {public} or use search to get started and meet other users.",
-  "empty_column.home.public_timeline": "the public timeline",
-  "empty_column.list": "There is nothing in this list yet. When members of this list post new statuses, they will appear here.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
-  "empty_column.notifications": "You don't have any notifications yet. Interact with others to start the conversation.",
-  "empty_column.public": "There is nothing here! Write something publicly, or manually follow users from other servers to fill it up",
-  "follow_request.authorize": "Authorize",
-  "follow_request.reject": "Reject",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
-  "getting_started.documentation": "Documentation",
-  "getting_started.heading": "Getting started",
-  "getting_started.invite": "Invite people",
-  "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
-  "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
-  "home.column_settings.basic": "Basic",
-  "home.column_settings.show_reblogs": "Show boosts",
-  "home.column_settings.show_replies": "Show replies",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
-  "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
-  "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish toot-orial!",
-  "introduction.interactions.favourite.headline": "Favourite",
-  "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
-  "introduction.interactions.reblog.headline": "Boost",
-  "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
-  "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
-  "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
-  "keyboard_shortcuts.back": "to navigate back",
-  "keyboard_shortcuts.blocked": "to open blocked users list",
-  "keyboard_shortcuts.boost": "to boost",
-  "keyboard_shortcuts.column": "to focus a status in one of the columns",
-  "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
-  "keyboard_shortcuts.direct": "to open direct messages column",
-  "keyboard_shortcuts.down": "to move down in the list",
-  "keyboard_shortcuts.enter": "to open status",
-  "keyboard_shortcuts.favourite": "to favourite",
-  "keyboard_shortcuts.favourites": "to open favourites list",
-  "keyboard_shortcuts.federated": "to open federated timeline",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
-  "keyboard_shortcuts.hotkey": "Hotkey",
-  "keyboard_shortcuts.legend": "to display this legend",
-  "keyboard_shortcuts.local": "to open local timeline",
-  "keyboard_shortcuts.mention": "to mention author",
-  "keyboard_shortcuts.muted": "to open muted users list",
-  "keyboard_shortcuts.my_profile": "to open your profile",
-  "keyboard_shortcuts.notifications": "to open notifications column",
-  "keyboard_shortcuts.pinned": "to open pinned toots list",
-  "keyboard_shortcuts.profile": "to open author's profile",
-  "keyboard_shortcuts.reply": "to reply",
-  "keyboard_shortcuts.requests": "to open follow requests list",
-  "keyboard_shortcuts.search": "to focus search",
-  "keyboard_shortcuts.start": "to open \"get started\" column",
-  "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
-  "keyboard_shortcuts.toot": "to start a brand new toot",
-  "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search",
-  "keyboard_shortcuts.up": "to move up in the list",
-  "lightbox.close": "Close",
-  "lightbox.next": "Next",
-  "lightbox.previous": "Previous",
-  "lists.account.add": "Add to list",
-  "lists.account.remove": "Remove from list",
-  "lists.delete": "Delete list",
-  "lists.edit": "Edit list",
-  "lists.new.create": "Add list",
-  "lists.new.title_placeholder": "New list title",
-  "lists.search": "Search among people you follow",
-  "lists.subheading": "Your lists",
-  "loading_indicator.label": "Loading...",
-  "media_gallery.toggle_visible": "Toggle visibility",
-  "missing_indicator.label": "Not found",
-  "missing_indicator.sublabel": "This resource could not be found",
-  "mute_modal.hide_notifications": "Hide notifications from this user?",
-  "navigation_bar.apps": "Mobile apps",
-  "navigation_bar.blocks": "Blocked users",
-  "navigation_bar.community_timeline": "Local timeline",
-  "navigation_bar.compose": "Compose new toot",
-  "navigation_bar.direct": "Direct messages",
-  "navigation_bar.discover": "Discover",
-  "navigation_bar.domain_blocks": "Hidden domains",
-  "navigation_bar.edit_profile": "Edit profile",
-  "navigation_bar.favourites": "Favourites",
-  "navigation_bar.filters": "Muted words",
-  "navigation_bar.follow_requests": "Follow requests",
-  "navigation_bar.info": "About this server",
-  "navigation_bar.keyboard_shortcuts": "Hotkeys",
-  "navigation_bar.lists": "Lists",
-  "navigation_bar.logout": "Logout",
-  "navigation_bar.mutes": "Muted users",
-  "navigation_bar.personal": "Personal",
-  "navigation_bar.pins": "Pinned toots",
-  "navigation_bar.preferences": "Preferences",
-  "navigation_bar.public_timeline": "Federated timeline",
-  "navigation_bar.security": "Security",
-  "notification.favourite": "{name} favourited your status",
-  "notification.follow": "{name} followed you",
-  "notification.mention": "{name} mentioned you",
-  "notification.reblog": "{name} boosted your status",
-  "notifications.clear": "Clear notifications",
-  "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
-  "notifications.column_settings.alert": "Desktop notifications",
-  "notifications.column_settings.favourite": "Favourites:",
-  "notifications.column_settings.filter_bar.advanced": "Display all categories",
-  "notifications.column_settings.filter_bar.category": "Quick filter bar",
-  "notifications.column_settings.filter_bar.show": "Show",
-  "notifications.column_settings.follow": "New followers:",
-  "notifications.column_settings.mention": "Mentions:",
-  "notifications.column_settings.push": "Push notifications",
-  "notifications.column_settings.reblog": "Boosts:",
-  "notifications.column_settings.show": "Show in column",
-  "notifications.column_settings.sound": "Play sound",
-  "notifications.filter.all": "All",
-  "notifications.filter.boosts": "Boosts",
-  "notifications.filter.favourites": "Favourites",
-  "notifications.filter.follows": "Follows",
-  "notifications.filter.mentions": "Mentions",
-  "notifications.group": "{count} notifications",
-  "privacy.change": "Adjust status privacy",
-  "privacy.direct.long": "Post to mentioned users only",
-  "privacy.direct.short": "Direct",
-  "privacy.private.long": "Post to followers only",
-  "privacy.private.short": "Followers-only",
-  "privacy.public.long": "Post to public timelines",
-  "privacy.public.short": "Public",
-  "privacy.unlisted.long": "Do not show in public timelines",
-  "privacy.unlisted.short": "Unlisted",
-  "regeneration_indicator.label": "Loading…",
-  "regeneration_indicator.sublabel": "Your home feed is being prepared!",
+  "compose_form.sensitive.marked": "Media është shënuar si rezervat",
+  "compose_form.sensitive.unmarked": "Media s’është shënuar si rezervat",
+  "compose_form.spoiler.marked": "Teksti është fshehur pas sinjalizimit",
+  "compose_form.spoiler.unmarked": "Teksti s’është i fshehur",
+  "compose_form.spoiler_placeholder": "Shkruani këtu sinjalizimin tuaj",
+  "confirmation_modal.cancel": "Anuloje",
+  "confirmations.block.confirm": "Bllokoje",
+  "confirmations.block.message": "Jeni i sigurt se doni të bllokohet {name}?",
+  "confirmations.delete.confirm": "Fshije",
+  "confirmations.delete.message": "Jeni i sigurt se doni të fshihet kjo gjendje?",
+  "confirmations.delete_list.confirm": "Fshije",
+  "confirmations.delete_list.message": "Jeni i sigurt që doni të fshihet përgjithmonë kjo listë?",
+  "confirmations.domain_block.confirm": "Fshih krejt përkatësinë",
+  "confirmations.domain_block.message": "Jeni i sigurt, shumë i sigurt se doni të bllokohet krejt {domain}? Në shumicën e rasteve, ndoca bllokime ose heshtime me synim të caktuar janë të mjaftueshme dhe të parapëlqyera. S’keni për të parë lëndë nga kjo përkatësi në ndonjë rrjedhë kohore publike, apo te njoftimet tuaja. Ndjekësit tuaj prej asaj përkatësie do të hiqen.",
+  "confirmations.mute.confirm": "Heshtoje",
+  "confirmations.mute.message": "Jeni i sigurt se doni të heshtohet {name}?",
+  "confirmations.redraft.confirm": "Fshijeni & rihartojeni",
+  "confirmations.redraft.message": "Jeni i sigurt se doni të fshihet kjo gjendje dhe të rihartohet? Parapëlqimet dhe boosts do të humbin, ndërsa përgjigjet te postimi origjinal do të bëhen jetime.",
+  "confirmations.reply.confirm": "Përgjigjuni",
+  "confirmations.reply.message": "Përgjigja tani do të shkaktojë mbishkrimin e mesazhit që po hartoni. Jeni i sigurt se doni të vazhdohet më tej?",
+  "confirmations.unfollow.confirm": "Resht së ndjekuri",
+  "confirmations.unfollow.message": "Jeni i sigurt se doni të mos ndiqet më {name}?",
+  "embed.instructions": "Trupëzojeni këtë gjendje në sajtin tuaj duke kopjuar kodin më poshtë.",
+  "embed.preview": "Ja si do të duket:",
+  "emoji_button.activity": "Veprimtari",
+  "emoji_button.custom": "Vetjak",
+  "emoji_button.flags": "Flamuj",
+  "emoji_button.food": "Ushqim & Pije",
+  "emoji_button.label": "Futni emoji",
+  "emoji_button.nature": "Natyrë",
+  "emoji_button.not_found": "No emojos!!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.objects": "Objekte",
+  "emoji_button.people": "Persona",
+  "emoji_button.recent": "Të përdorur shpesh",
+  "emoji_button.search": "Kërkoni…",
+  "emoji_button.search_results": "Përfundime kërkimi",
+  "emoji_button.symbols": "Simbole",
+  "emoji_button.travel": "Udhëtime & Vende",
+  "empty_column.account_timeline": "S’ka mesazhe këtu!",
+  "empty_column.blocks": "S’keni bllokuar ende ndonjë përdorues.",
+  "empty_column.community": "Rrjedha kohore vendore është e zbrazët. Shkruani diçka publikisht që t’i hyhet valles!",
+  "empty_column.direct": "S’keni ende ndonjë mesazh të drejtpërdrejt. Kur dërgoni ose merrni një të tillë, ai do të shfaqet këtu.",
+  "empty_column.domain_blocks": "Ende s’ka përkatësi të fshehura.",
+  "empty_column.favourited_statuses": "S’keni ende ndonjë mesazh të parapëlqyer. Kur parapëlqeni një të tillë, ai do të shfaqet këtu.",
+  "empty_column.favourites": "Askush s’e ka parapëlqyer ende këtë mesazh. Kur e bën dikush, ai do të shfaqet këtu.",
+  "empty_column.follow_requests": "Ende s’keni ndonjë kërkesë ndjekjeje. Kur të merrni një të tillë, do të shfaqet këtu.",
+  "empty_column.hashtag": "Ende s’ka gjë nën këtë hashtag.",
+  "empty_column.home": "Rrjedha juaj kohore është e zbrazët! Vizitoni {public} ose përdorni kërkimin që t’ia filloni dhe të takoni përdorues të tjerë.",
+  "empty_column.home.public_timeline": "rrjedha kohore publike",
+  "empty_column.list": "Në këtë listë ende s’ka gjë. Kur anëtarë të kësaj liste postojnë gjendje të reja, ato do të shfaqen këtu.",
+  "empty_column.lists": "Ende s’keni ndonjë listë. Kur të krijoni një të tillë, do të duket këtu.",
+  "empty_column.mutes": "S’keni heshtuar ende ndonjë përdorues.",
+  "empty_column.notifications": "Ende s’keni ndonjë njoftim. Ndërveproni me të tjerët që të nisë biseda.",
+  "empty_column.public": "S’ka gjë këtu! Shkruani diçka publikisht, ose ndiqni dorazi përdorues prej instancash të tjera, që ta mbushni këtë zonë",
+  "follow_request.authorize": "Autorizoje",
+  "follow_request.reject": "Hidhe tej",
+  "getting_started.developers": "Zhvillues",
+  "getting_started.directory": "Drejtori profilesh",
+  "getting_started.documentation": "Dokumentim",
+  "getting_started.heading": "Si t’ia fillohet",
+  "getting_started.invite": "Ftoni njerëz",
+  "getting_started.open_source_notice": "Mastodon-i është software me burim të hapur. Mund të jepni ndihmesë ose të njoftoni probleme në GitHub, te {github}.",
+  "getting_started.security": "Siguri",
+  "getting_started.terms": "Kushte shërbimi",
+  "hashtag.column_header.tag_mode.all": "dhe {additional}",
+  "hashtag.column_header.tag_mode.any": "ose {additional}",
+  "hashtag.column_header.tag_mode.none": "pa {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "Krejt këto",
+  "hashtag.column_settings.tag_mode.any": "Cilëndo prej këtyre",
+  "hashtag.column_settings.tag_mode.none": "Asnjë prej këtyre",
+  "hashtag.column_settings.tag_toggle": "Përfshi etiketa shtesë për këtë shtyllë",
+  "home.column_settings.basic": "Bazë",
+  "home.column_settings.show_reblogs": "Shfaq përforcime",
+  "home.column_settings.show_replies": "Shfaq përgjigje",
+  "introduction.federation.action": "Pasuesi",
+  "introduction.federation.federated.headline": "Të federuara",
+  "introduction.federation.federated.text": "Postimet publike nga shërbyes të tjerë të fediversit do të shfaqen te rrjedha kohore e të federuarve.",
+  "introduction.federation.home.headline": "Vatër",
+  "introduction.federation.home.text": "Postime prej personash që ndiqni do të shfaqen te prurja juaj vatër. Mund të ndiqni këdo, në çfarëdo shërbyesi!",
+  "introduction.federation.local.headline": "Vendore",
+  "introduction.federation.local.text": "Postimet publike prej personash në të njëjtin shërbyes me ju do të shfaqen te rrjedha kohore vendore.",
+  "introduction.interactions.action": "Përfundojeni përkujdesoren!",
+  "introduction.interactions.favourite.headline": "Parapëlqejeni",
+  "introduction.interactions.favourite.text": "Duke e parapëlqyer, një mesazh mund ta ruani për më vonë dhe t’i bëni të ditur autorit se e pëlqyet.",
+  "introduction.interactions.reblog.headline": "Përforcime",
+  "introduction.interactions.reblog.text": "Mesazhet e të tjerëve mund t’i ndani me ndjekësit tuaj duke i përforcuar.",
+  "introduction.interactions.reply.headline": "Përgjigjuni",
+  "introduction.interactions.reply.text": "Mund t'u përgjigjeni mesazheve tuaja dhe atyre të personave të tjerë, çka do t’i lidhë ato tok në një bisedë.",
+  "introduction.welcome.action": "Shkojmë!",
+  "introduction.welcome.headline": "Hapat e parë",
+  "introduction.welcome.text": "Mirë se vini në fedivers! Brenda pak çastesh do të jeni në gjendje të transmetoni mesazhe dhe të bisedoni me miqtë tuaj nëpër një larmi të madhe shërbyesish. Po ky shërbyes, {domain}, është i veçantë—strehon profilin tuaj, ndaj mbajeni mend emrin e tij.",
+  "keyboard_shortcuts.back": "për shkuarje mbrapsht",
+  "keyboard_shortcuts.blocked": "për hapje liste përdoruesish të bllokuar",
+  "keyboard_shortcuts.boost": "për përfocim",
+  "keyboard_shortcuts.column": "për kalim fokusi mbi një gjendje te një nga shtyllat",
+  "keyboard_shortcuts.compose": "për kalim fokusi te fusha e hartimit të mesazheve",
+  "keyboard_shortcuts.description": "Përshkrim",
+  "keyboard_shortcuts.direct": "për hapje shtylle mesazhesh të drejtpërdrejtë",
+  "keyboard_shortcuts.down": "për zbritje poshtë nëpër listë",
+  "keyboard_shortcuts.enter": "për hapje gjendjeje",
+  "keyboard_shortcuts.favourite": "për t’i vënë shenjë si të parapëlqyer",
+  "keyboard_shortcuts.favourites": "për hapje liste të parapëlqyerish",
+  "keyboard_shortcuts.federated": "për hapje rrjedhe kohore të të federuarve",
+  "keyboard_shortcuts.heading": "Shkurtore tastiere",
+  "keyboard_shortcuts.home": "për hapje rrjedhe kohore vetjake",
+  "keyboard_shortcuts.hotkey": "Tast përkatës",
+  "keyboard_shortcuts.legend": "për shfaqje të kësaj legjende",
+  "keyboard_shortcuts.local": "për hapje rrjedhe kohore vendore",
+  "keyboard_shortcuts.mention": "për përmendje të autorit",
+  "keyboard_shortcuts.muted": "për hapje liste përdoruesish të heshtuar",
+  "keyboard_shortcuts.my_profile": "për hapjen e profilit tuaj",
+  "keyboard_shortcuts.notifications": "për hapje shtylle njoftimesh",
+  "keyboard_shortcuts.pinned": "për hapje liste mesazhesh të fiksuar",
+  "keyboard_shortcuts.profile": "për hapje të profilit të autorit",
+  "keyboard_shortcuts.reply": "për t’u përgjigjur",
+  "keyboard_shortcuts.requests": "për hapje liste kërkesash për ndjekje",
+  "keyboard_shortcuts.search": "për kalim fokusi te kërkimi",
+  "keyboard_shortcuts.start": "për hapjen e shtyllës \"fillojani\"",
+  "keyboard_shortcuts.toggle_hidden": "për shfaqje/fshehje teksti pas CW",
+  "keyboard_shortcuts.toot": "për të filluar një mesazh fringo të ri",
+  "keyboard_shortcuts.unfocus": "për heqjen e fokusit nga fusha e hartimit të mesazheve apo kërkimeve",
+  "keyboard_shortcuts.up": "për ngjitje sipër nëpër listë",
+  "lightbox.close": "Mbylle",
+  "lightbox.next": "Pasuesja",
+  "lightbox.previous": "E mëparshmja",
+  "lists.account.add": "Shto në listë",
+  "lists.account.remove": "Hiqe nga lista",
+  "lists.delete": "Fshije listën",
+  "lists.edit": "Përpunoni listën",
+  "lists.edit.submit": "Change title",
+  "lists.new.create": "Shtoni listë",
+  "lists.new.title_placeholder": "Titull liste të re",
+  "lists.search": "Kërkoni mes personash që ndiqni",
+  "lists.subheading": "Listat tuaja",
+  "loading_indicator.label": "Po ngarkohet…",
+  "media_gallery.toggle_visible": "Ndërroni dukshmërinë",
+  "missing_indicator.label": "S’u gjet",
+  "missing_indicator.sublabel": "Ky burim s’u gjet dot",
+  "mute_modal.hide_notifications": "Të fshihen njoftimet prej këtij përdoruesi?",
+  "navigation_bar.apps": "Aplikacione për celular",
+  "navigation_bar.blocks": "Përdorues të bllokuar",
+  "navigation_bar.community_timeline": "Rrjedhë kohore vendore",
+  "navigation_bar.compose": "Hartoni mesazh të ri",
+  "navigation_bar.direct": "Mesazhe të drejtpërdrejta",
+  "navigation_bar.discover": "Zbuloni",
+  "navigation_bar.domain_blocks": "Përkatësi të fshehura",
+  "navigation_bar.edit_profile": "Përpunoni profilin",
+  "navigation_bar.favourites": "Të parapëlqyer",
+  "navigation_bar.filters": "Fjalë të heshtuara",
+  "navigation_bar.follow_requests": "Kërkesa për ndjekje",
+  "navigation_bar.info": "Mbi këtë shërbyes",
+  "navigation_bar.keyboard_shortcuts": "Taste përkatës",
+  "navigation_bar.lists": "Lista",
+  "navigation_bar.logout": "Dalje",
+  "navigation_bar.mutes": "Përdorues të heshtuar",
+  "navigation_bar.personal": "Personale",
+  "navigation_bar.pins": "Mesazhe të fiksuar",
+  "navigation_bar.preferences": "Parapëlqime",
+  "navigation_bar.public_timeline": "Rrjedhë kohore të federuarish",
+  "navigation_bar.security": "Siguri",
+  "notification.favourite": "{name} parapëlqeu gjendjen tuaj",
+  "notification.follow": "{name} zuri t’ju ndjekë",
+  "notification.mention": "{name} ju ka përmendur",
+  "notification.reblog": "përforcoi gjendjen tuaj",
+  "notifications.clear": "Pastroji njoftimet",
+  "notifications.clear_confirmation": "Jeni i sigurt se doni të pastrohen përgjithmonë krejt njoftimet tuaja?",
+  "notifications.column_settings.alert": "Njoftime desktopi",
+  "notifications.column_settings.favourite": "Të parapëlqyer:",
+  "notifications.column_settings.filter_bar.advanced": "Shfaq krejt kategoritë",
+  "notifications.column_settings.filter_bar.category": "Shtyllë filtrimesh të shpejta",
+  "notifications.column_settings.filter_bar.show": "Shfaq",
+  "notifications.column_settings.follow": "Ndjekës të rinj:",
+  "notifications.column_settings.mention": "Përmendje:",
+  "notifications.column_settings.push": "Njoftime Push",
+  "notifications.column_settings.reblog": "Përforcime:",
+  "notifications.column_settings.show": "Shfaq në shtylla",
+  "notifications.column_settings.sound": "Luaj një tingull",
+  "notifications.filter.all": "Krejt",
+  "notifications.filter.boosts": "Përforcime",
+  "notifications.filter.favourites": "Të parapëlqyer",
+  "notifications.filter.follows": "Ndjekje",
+  "notifications.filter.mentions": "Përmendje",
+  "notifications.group": "%(count)s njoftime",
+  "privacy.change": "Rregulloni privatësi gjendje",
+  "privacy.direct.long": "Postoja vetëm përdoruesve të përmendur",
+  "privacy.direct.short": "I drejtpërdrejtë",
+  "privacy.private.long": "Postojuani vetëm ndjekësve",
+  "privacy.private.short": "Vetëm ndjekësve",
+  "privacy.public.long": "Postojeni në rrjedha publike kohore",
+  "privacy.public.short": "Publike",
+  "privacy.unlisted.long": "Mos e postoni në rrjedha publike kohore",
+  "privacy.unlisted.short": "Jo në lista",
+  "regeneration_indicator.label": "Po ngarkohet…",
+  "regeneration_indicator.sublabel": "Prurja juaj vetjake po përgatiteet!",
   "relative_time.days": "{number}d",
   "relative_time.hours": "{number}h",
-  "relative_time.just_now": "now",
+  "relative_time.just_now": "tani",
   "relative_time.minutes": "{number}m",
   "relative_time.seconds": "{number}s",
-  "reply_indicator.cancel": "Cancel",
-  "report.forward": "Forward to {target}",
-  "report.forward_hint": "The account is from another server. Send an anonymized copy of the report there as well?",
-  "report.hint": "The report will be sent to your server moderators. You can provide an explanation of why you are reporting this account below:",
-  "report.placeholder": "Additional comments",
-  "report.submit": "Submit",
-  "report.target": "Report {target}",
-  "search.placeholder": "Search",
-  "search_popout.search_format": "Advanced search format",
-  "search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
+  "reply_indicator.cancel": "Anuloje",
+  "report.forward": "Përcillja {target}",
+  "report.forward_hint": "Llogaria është nga një shërbyes tjetër. Të dërgohet edhe një kopje e anonimizuar e raportimit?",
+  "report.hint": "Raportimi do t’u dërgohet moderatorëve të shërbyesit tuaj. Më poshtë mund të jepni një shpjegim se pse po e raportoni këtë llogari:",
+  "report.placeholder": "Komente shtesë",
+  "report.submit": "Parashtroje",
+  "report.target": "Raportim i {target}",
+  "search.placeholder": "Kërkoni",
+  "search_popout.search_format": "Format kërkimi të përparuar",
+  "search_popout.tips.full_text": "Kërkimi për tekst të thjeshtë përgjigjet me gjendje që keni shkruar, parapëlqyer, përforcuar, ose ku jeni përmendur, si dhe emra përdoruesish, emra ekrani dhe hashtagë që kanë përputhje me termin e kërkimit.",
   "search_popout.tips.hashtag": "hashtag",
-  "search_popout.tips.status": "status",
-  "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
-  "search_popout.tips.user": "user",
-  "search_results.accounts": "People",
-  "search_results.hashtags": "Hashtags",
-  "search_results.statuses": "Toots",
-  "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
-  "standalone.public_title": "A look inside...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
-  "status.block": "Block @{name}",
-  "status.cancel_reblog_private": "Unboost",
-  "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
-  "status.delete": "Delete",
-  "status.detailed_status": "Detailed conversation view",
-  "status.direct": "Direct message @{name}",
-  "status.embed": "Embed",
-  "status.favourite": "Favourite",
-  "status.filtered": "Filtered",
-  "status.load_more": "Load more",
-  "status.media_hidden": "Media hidden",
-  "status.mention": "Mention @{name}",
-  "status.more": "More",
-  "status.mute": "Mute @{name}",
-  "status.mute_conversation": "Mute conversation",
-  "status.open": "Expand this status",
-  "status.pin": "Pin on profile",
-  "status.pinned": "Pinned toot",
-  "status.read_more": "Read more",
-  "status.reblog": "Boost",
-  "status.reblog_private": "Boost to original audience",
-  "status.reblogged_by": "{name} boosted",
-  "status.reblogs.empty": "No one has boosted this toot yet. When someone does, they will show up here.",
-  "status.redraft": "Delete & re-draft",
-  "status.reply": "Reply",
-  "status.replyAll": "Reply to thread",
-  "status.report": "Report @{name}",
-  "status.sensitive_toggle": "Click to view",
-  "status.sensitive_warning": "Sensitive content",
-  "status.share": "Share",
-  "status.show_less": "Show less",
-  "status.show_less_all": "Show less for all",
-  "status.show_more": "Show more",
-  "status.show_more_all": "Show more for all",
-  "status.show_thread": "Show thread",
-  "status.unmute_conversation": "Unmute conversation",
-  "status.unpin": "Unpin from profile",
-  "suggestions.dismiss": "Dismiss suggestion",
-  "suggestions.header": "You might be interested in…",
-  "tabs_bar.federated_timeline": "Federated",
-  "tabs_bar.home": "Home",
-  "tabs_bar.local_timeline": "Local",
-  "tabs_bar.notifications": "Notifications",
-  "tabs_bar.search": "Search",
-  "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
-  "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
-  "upload_area.title": "Drag & drop to upload",
-  "upload_button.label": "Add media (JPEG, PNG, GIF, WebM, MP4, MOV)",
-  "upload_error.limit": "File upload limit exceeded.",
-  "upload_form.description": "Describe for the visually impaired",
-  "upload_form.focus": "Crop",
-  "upload_form.undo": "Delete",
-  "upload_progress.label": "Uploading...",
-  "video.close": "Close video",
-  "video.exit_fullscreen": "Exit full screen",
-  "video.expand": "Expand video",
-  "video.fullscreen": "Full screen",
-  "video.hide": "Hide video",
-  "video.mute": "Mute sound",
-  "video.pause": "Pause",
-  "video.play": "Play",
-  "video.unmute": "Unmute sound"
+  "search_popout.tips.status": "gjendje",
+  "search_popout.tips.text": "Kërkim për tekst të thjeshtë përgjigjet me emra, emra përdoruesish dhe hashtagë që kanë përputhje me termin e kërkimit",
+  "search_popout.tips.user": "përdorues",
+  "search_results.accounts": "Persona",
+  "search_results.hashtags": "Hashtagë",
+  "search_results.statuses": "Mesazhe",
+  "search_results.total": "{count, number} {count, plural, një {result} {results} të tjera}",
+  "standalone.public_title": "Një pamje brenda…",
+  "status.admin_account": "Hap ndërfaqe moderimi për @{name}",
+  "status.admin_status": "Hape këtë gjendje te ndërfaqja e moderimit",
+  "status.block": "Blloko @{name}",
+  "status.cancel_reblog_private": "Shpërforcojeni",
+  "status.cannot_reblog": "Ky postim s’mund të përforcohet",
+  "status.copy": "Kopjoje lidhjen te gjendje",
+  "status.delete": "Fshije",
+  "status.detailed_status": "Pamje e hollësishme bisede",
+  "status.direct": "Mesazh i drejtpërdrejt për @{name}",
+  "status.embed": "Trupëzim",
+  "status.favourite": "I parapëlqyer",
+  "status.filtered": "I filtruar",
+  "status.load_more": "Ngarko më tepër",
+  "status.media_hidden": "Me media të fshehur",
+  "status.mention": "Përmendni @{name}",
+  "status.more": "Më tepër",
+  "status.mute": "Heshtoni @{name}",
+  "status.mute_conversation": "Heshtojeni bisedën",
+  "status.open": "Zgjeroje këtë gjendje",
+  "status.pin": "Fiksoje në profil",
+  "status.pinned": "Mesazh i fiksuar",
+  "status.read_more": "Lexoni më tepër",
+  "status.reblog": "Përforcojeni",
+  "status.reblog_private": "Përforcim për publikun origjinal",
+  "status.reblogged_by": "{name} përforcoi",
+  "status.reblogs.empty": "Këtë mesazh s’e ka përforcuar njeri deri tani. Kur ta bëjë dikush, kjo do të duket këtu.",
+  "status.redraft": "Fshijeni & rihartojeni",
+  "status.reply": "Përgjigjuni",
+  "status.replyAll": "Përgjigjuni rrjedhës",
+  "status.report": "Raportojeni @{name}",
+  "status.sensitive_toggle": "Klikoni që ta shihni",
+  "status.sensitive_warning": "Lëndë me spec",
+  "status.share": "Ndajeni me të tjerët",
+  "status.show_less": "Shfaq më pak",
+  "status.show_less_all": "Shfaq më pak për të tërë",
+  "status.show_more": "Shfaq më tepër",
+  "status.show_more_all": "Shfaq më tepër për të tërë",
+  "status.show_thread": "Shfaq rrjedhën",
+  "status.unmute_conversation": "Ktheji zërin bisedës",
+  "status.unpin": "Shfiksoje nga profili",
+  "suggestions.dismiss": "Mos e merr parasysh sugjerimin",
+  "suggestions.header": "Mund t’ju interesonte…",
+  "tabs_bar.federated_timeline": "E federuar",
+  "tabs_bar.home": "Kreu",
+  "tabs_bar.local_timeline": "Vendore",
+  "tabs_bar.notifications": "Njoftime",
+  "tabs_bar.search": "Kërkim",
+  "trends.count_by_accounts": "{count} {rawCount, plural, një {person} {people} të tjerë} po flasin",
+  "ui.beforeunload": "Skica juaj do të humbë nëse dilni nga Mastodon-i.",
+  "upload_area.title": "Merreni & vëreni që të ngarkohet",
+  "upload_button.label": "Shtoni media (JPEG, PNG, GIF, WebM, MP4, MOV)",
+  "upload_error.limit": "U tejkalua kufi ngarkimi kartelash.",
+  "upload_form.description": "Përshkruajeni për persona me probleme shikimi",
+  "upload_form.focus": "Ndryshoni parapamjen",
+  "upload_form.undo": "Fshije",
+  "upload_progress.label": "Po ngarkohet…",
+  "video.close": "Mbylle videon",
+  "video.exit_fullscreen": "Dil nga mënyra Sa Krejt Ekrani",
+  "video.expand": "Zgjeroje videon",
+  "video.fullscreen": "Sa krejt ekrani",
+  "video.hide": "Fshihe videon",
+  "video.mute": "Hiqi zërin",
+  "video.pause": "Ndalesë",
+  "video.play": "Luaje",
+  "video.unmute": "Riktheji zërin"
 }
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index 484e2690dc..79619c9144 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Ukloni sa liste",
   "lists.delete": "Obriši listu",
   "lists.edit": "Izmeni listu",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Dodaj listu",
   "lists.new.title_placeholder": "Naslov nove liste",
   "lists.search": "Pretraži među ljudima koje pratite",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 284ceab47a..b72431b347 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Уклони са листе",
   "lists.delete": "Обриши листу",
   "lists.edit": "Измени листу",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Додај листу",
   "lists.new.title_placeholder": "Наслов нове листе",
   "lists.search": "Претражи међу људима које пратите",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index 9acf2428ee..018fdc85f1 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Ta bort från lista",
   "lists.delete": "Radera lista",
   "lists.edit": "Redigera lista",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Lägg till lista",
   "lists.new.title_placeholder": "Ny listrubrik",
   "lists.search": "Sök bland personer du följer",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 602a59ca08..536f654624 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index b118c189f6..1c27fab811 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "మరియు {additional}",
   "hashtag.column_header.tag_mode.any": "లేదా {additional}",
   "hashtag.column_header.tag_mode.none": "{additional} లేకుండా",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "ఇవన్నీAll of these",
   "hashtag.column_settings.tag_mode.any": "వీటిలో ఏవైనా",
   "hashtag.column_settings.tag_mode.none": "ఇవేవీ కావు",
@@ -204,6 +206,7 @@
   "lists.account.remove": "జాబితా నుండి తొలగించు",
   "lists.delete": "జాబితాను తొలగించు",
   "lists.edit": "జాబితాను సవరించు",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "జాబితాను జోడించు",
   "lists.new.title_placeholder": "కొత్త జాబితా శీర్షిక",
   "lists.search": "మీరు అనుసరించే వ్యక్తులలో శోధించండి",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 2b0fc40e2d..5947b04c21 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index 30dc06d8c4..76949352f1 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -1,84 +1,84 @@
 {
-  "account.add_or_remove_from_list": "Add or Remove from lists",
+  "account.add_or_remove_from_list": "Listelere ekle veya kaldır",
   "account.badges.bot": "Bot",
   "account.block": "Engelle @{name}",
-  "account.block_domain": "Hide everything from {domain}",
-  "account.blocked": "Blocked",
+  "account.block_domain": "{domain} alanından her şeyi gizle",
+  "account.blocked": "EngellenmiÅŸ",
   "account.direct": "Direct Message @{name}",
-  "account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
-  "account.domain_blocked": "Domain hidden",
+  "account.disclaimer_full": "Aşağıdaki bilgiler, kullanıcının profilini tam olarak yansıtmayabilir.",
+  "account.domain_blocked": "Alan adı gizlendi",
   "account.edit_profile": "Profili düzenle",
-  "account.endorse": "Feature on profile",
+  "account.endorse": "Profildeki özellik",
   "account.follow": "Takip et",
   "account.followers": "Takipçiler",
-  "account.followers.empty": "No one follows this user yet.",
+  "account.followers.empty": "Henüz kimse bu kullanıcıyı takip etmiyor.",
   "account.follows": "Takip ettikleri",
-  "account.follows.empty": "This user doesn't follow anyone yet.",
+  "account.follows.empty": "Bu kullanıcı henüz kimseyi takip etmiyor.",
   "account.follows_you": "Seni takip ediyor",
-  "account.hide_reblogs": "Hide boosts from @{name}",
-  "account.link_verified_on": "Ownership of this link was checked on {date}",
-  "account.locked_info": "This account privacy status is set to locked. The owner manually reviews who can follow them.",
-  "account.media": "Media",
-  "account.mention": "Bahset @{name}",
+  "account.hide_reblogs": "@{name} kişisinden boost'ları gizle",
+  "account.link_verified_on": "Bu bağlantının mülkiyeti {date} tarihinde kontrol edildi",
+  "account.locked_info": "Bu hesabın gizlilik durumu kilitli olarak ayarlanmış. Sahibi, onu kimin takip edebileceğini elle inceler.",
+  "account.media": "Medya",
+  "account.mention": "@{name} kullanıcısından bahset",
   "account.moved_to": "{name} has moved to:",
-  "account.mute": "Sustur @{name}",
-  "account.mute_notifications": "Mute notifications from @{name}",
-  "account.muted": "Muted",
+  "account.mute": "@{name} kullanıcısını sessize al",
+  "account.mute_notifications": "@{name} kullanıcısının bildirimlerini kapat",
+  "account.muted": "Sessiz",
   "account.posts": "Gönderiler",
-  "account.posts_with_replies": "Toots with replies",
-  "account.report": "Rapor et @{name}",
-  "account.requested": "Onay bekleniyor",
-  "account.share": "Share @{name}'s profile",
-  "account.show_reblogs": "Show boosts from @{name}",
+  "account.posts_with_replies": "Gönderiler ve yanıtlar",
+  "account.report": "@{name} kullanıcısını bildir",
+  "account.requested": "Onay bekliyor. Takip isteğini iptal etmek için tıklayın",
+  "account.share": "@{name} kullanıcısının profilini paylaş",
+  "account.show_reblogs": "@{name} kullanıcısından boost'ları göster",
   "account.unblock": "Engeli kaldır @{name}",
-  "account.unblock_domain": "Unhide {domain}",
-  "account.unendorse": "Don't feature on profile",
+  "account.unblock_domain": "{domain} göster",
+  "account.unendorse": "Profilde özellik yok",
   "account.unfollow": "Takipten vazgeç",
   "account.unmute": "Sesi aç @{name}",
-  "account.unmute_notifications": "Unmute notifications from @{name}",
-  "account.view_full_profile": "View full profile",
-  "alert.unexpected.message": "An unexpected error occurred.",
-  "alert.unexpected.title": "Oops!",
+  "account.unmute_notifications": "@{name} kullanıcısından bildirimleri aç",
+  "account.view_full_profile": "Tüm profili görüntüle",
+  "alert.unexpected.message": "Beklenmedik bir hata oluÅŸtu.",
+  "alert.unexpected.title": "Hay aksi!",
   "boost_modal.combo": "Bir dahaki sefere {combo} tuÅŸuna basabilirsiniz",
-  "bundle_column_error.body": "Something went wrong while loading this component.",
-  "bundle_column_error.retry": "Try again",
+  "bundle_column_error.body": "Bu bileşen yüklenirken bir şeyler ters gitti.",
+  "bundle_column_error.retry": "Tekrar deneyin",
   "bundle_column_error.title": "Network error",
-  "bundle_modal_error.close": "Close",
-  "bundle_modal_error.message": "Something went wrong while loading this component.",
-  "bundle_modal_error.retry": "Try again",
+  "bundle_modal_error.close": "Kapat",
+  "bundle_modal_error.message": "Bu bileşen yüklenirken bir şeyler ters gitti.",
+  "bundle_modal_error.retry": "Tekrar deneyin",
   "column.blocks": "Engellenen kullanıcılar",
   "column.community": "Yerel zaman tüneli",
-  "column.direct": "Direct messages",
-  "column.domain_blocks": "Hidden domains",
+  "column.direct": "DoÄŸrudan mesajlar",
+  "column.domain_blocks": "Gizli alan adları",
   "column.favourites": "Favoriler",
   "column.follow_requests": "Takip istekleri",
   "column.home": "Anasayfa",
-  "column.lists": "Lists",
+  "column.lists": "Listeler",
   "column.mutes": "Susturulmuş kullanıcılar",
   "column.notifications": "Bildirimler",
   "column.pins": "Pinned toot",
   "column.public": "Federe zaman tüneli",
   "column_back_button.label": "Geri",
-  "column_header.hide_settings": "Hide settings",
-  "column_header.moveLeft_settings": "Move column to the left",
-  "column_header.moveRight_settings": "Move column to the right",
-  "column_header.pin": "Pin",
-  "column_header.show_settings": "Show settings",
-  "column_header.unpin": "Unpin",
+  "column_header.hide_settings": "Ayarları gizle",
+  "column_header.moveLeft_settings": "Sütunu sola taşı",
+  "column_header.moveRight_settings": "Sütunu sağa taşı",
+  "column_header.pin": "Sabitle",
+  "column_header.show_settings": "Ayarları göster",
+  "column_header.unpin": "Sabitlemeyi kaldır",
   "column_subheading.settings": "Ayarlar",
-  "community.column_settings.media_only": "Media Only",
-  "compose_form.direct_message_warning": "This toot will only be visible to all the mentioned users.",
-  "compose_form.direct_message_warning_learn_more": "Learn more",
+  "community.column_settings.media_only": "Sadece medya",
+  "compose_form.direct_message_warning": "Bu gönderi sadece belirtilen kullanıcılara gönderilecektir.",
+  "compose_form.direct_message_warning_learn_more": "Daha fazla bilgi edin",
   "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.",
   "compose_form.lock_disclaimer": "Hesabınız {locked} değil. Sadece takipçilerle paylaştığınız gönderileri görebilmek için sizi herhangi bir kullanıcı takip edebilir.",
   "compose_form.lock_disclaimer.lock": "kilitli",
-  "compose_form.placeholder": "Ne düşünüyorsun?",
+  "compose_form.placeholder": "Aklınızdan ne geçiyor?",
   "compose_form.publish": "Toot",
   "compose_form.publish_loud": "{publish}!",
-  "compose_form.sensitive.marked": "Media is marked as sensitive",
-  "compose_form.sensitive.unmarked": "Media is not marked as sensitive",
-  "compose_form.spoiler.marked": "Text is hidden behind warning",
-  "compose_form.spoiler.unmarked": "Text is not hidden",
+  "compose_form.sensitive.marked": "Medya hassas olarak iÅŸaretlendi",
+  "compose_form.sensitive.unmarked": "Medya hassas olarak iÅŸaretlenmemiÅŸ",
+  "compose_form.spoiler.marked": "Metin uyarının arkasına gizlenir",
+  "compose_form.spoiler.unmarked": "Metin gizli deÄŸil",
   "compose_form.spoiler_placeholder": "İçerik uyarısı",
   "confirmation_modal.cancel": "Ä°ptal",
   "confirmations.block.confirm": "Engelle",
@@ -86,38 +86,38 @@
   "confirmations.delete.confirm": "Sil",
   "confirmations.delete.message": "Bu gönderiyi silmek istiyor musunuz?",
   "confirmations.delete_list.confirm": "Delete",
-  "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
-  "confirmations.domain_block.confirm": "Hide entire domain",
+  "confirmations.delete_list.message": "Bu listeyi kalıcı olarak silmek istediğinize emin misiniz?",
+  "confirmations.domain_block.confirm": "Alan adının tamamını gizle",
   "confirmations.domain_block.message": "Are you really, really sure you want to block the entire {domain}? In most cases a few targeted blocks or mutes are sufficient and preferable.",
   "confirmations.mute.confirm": "Sessize al",
   "confirmations.mute.message": "{name} kullanıcısını sessize almak istiyor musunuz?",
-  "confirmations.redraft.confirm": "Delete & redraft",
+  "confirmations.redraft.confirm": "Sil ve yeniden tasarla",
   "confirmations.redraft.message": "Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.",
-  "confirmations.reply.confirm": "Reply",
-  "confirmations.reply.message": "Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?",
-  "confirmations.unfollow.confirm": "Unfollow",
+  "confirmations.reply.confirm": "Yanıtla",
+  "confirmations.reply.message": "Şimdi yanıtlarken o an oluşturduğunuz mesajın üzerine yazılır. Devam etmek istediğinize emin misiniz?",
+  "confirmations.unfollow.confirm": "Takibi kaldır",
   "confirmations.unfollow.message": "Are you sure you want to unfollow {name}?",
   "embed.instructions": "Embed this status on your website by copying the code below.",
-  "embed.preview": "Here is what it will look like:",
+  "embed.preview": "İşte nasıl görüneceği:",
   "emoji_button.activity": "Aktivite",
-  "emoji_button.custom": "Custom",
+  "emoji_button.custom": "Özel",
   "emoji_button.flags": "Bayraklar",
   "emoji_button.food": "Yiyecek ve İçecek",
   "emoji_button.label": "Emoji ekle",
   "emoji_button.nature": "DoÄŸa",
-  "emoji_button.not_found": "No emojos!! (╯°□°)╯︵ ┻━┻",
+  "emoji_button.not_found": "İfade yok!! (╯°□°)╯︵ ┻━┻",
   "emoji_button.objects": "Nesneler",
   "emoji_button.people": "Ä°nsanlar",
-  "emoji_button.recent": "Frequently used",
+  "emoji_button.recent": "Sık kullanılan",
   "emoji_button.search": "Emoji ara...",
-  "emoji_button.search_results": "Search results",
+  "emoji_button.search_results": "Arama sonuçları",
   "emoji_button.symbols": "Semboller",
   "emoji_button.travel": "Seyahat ve Yerler",
-  "empty_column.account_timeline": "No toots here!",
-  "empty_column.blocks": "You haven't blocked any users yet.",
-  "empty_column.community": "Yerel zaman tüneliniz boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın.",
-  "empty_column.direct": "You don't have any direct messages yet. When you send or receive one, it will show up here.",
-  "empty_column.domain_blocks": "There are no hidden domains yet.",
+  "empty_column.account_timeline": "Burada hiç gönderi yok!",
+  "empty_column.blocks": "Henüz bir kullanıcıyı engellemediniz.",
+  "empty_column.community": "Yerel zaman çizelgesi boş. Daha fazla eğlence için herkese açık bir gönderi paylaşın!",
+  "empty_column.direct": "Henüz doğrudan mesajınız yok. Bir tane gönderdiğinizde veya aldığınızda burada görünecektir.",
+  "empty_column.domain_blocks": "Henüz hiçbir gizli alan adı yok.",
   "empty_column.favourited_statuses": "You don't have any favourite toots yet. When you favourite one, it will show up here.",
   "empty_column.favourites": "No one has favourited this toot yet. When someone does, they will show up here.",
   "empty_column.follow_requests": "You don't have any follow requests yet. When you receive one, it will show up here.",
@@ -125,61 +125,63 @@
   "empty_column.home": "Henüz kimseyi takip etmiyorsunuz. {public} ziyaret edebilir veya arama kısmını kullanarak diğer kullanıcılarla iletişime geçebilirsiniz.",
   "empty_column.home.public_timeline": "herkese açık zaman tüneli",
   "empty_column.list": "There is nothing in this list yet.",
-  "empty_column.lists": "You don't have any lists yet. When you create one, it will show up here.",
-  "empty_column.mutes": "You haven't muted any users yet.",
+  "empty_column.lists": "Henüz hiç listeniz yok. Bir tane oluşturduğunuzda burada görünecek.",
+  "empty_column.mutes": "Henüz hiçbir kullanıcıyı sessize almadınız.",
   "empty_column.notifications": "Henüz hiçbir bildiriminiz yok. Diğer insanlarla sobhet edebilmek için etkileşime geçebilirsiniz.",
-  "empty_column.public": "Burada hiçbir gönderi yok! Herkese açık bir şeyler yazın, veya diğer sunucudaki insanları takip ederek bu alanın dolmasını sağlayın",
+  "empty_column.public": "Burada hiçbir şey yok! Herkese açık bir şeyler yazın veya burayı doldurmak için diğer sunuculardaki kullanıcıları takip edin",
   "follow_request.authorize": "Yetkilendir",
   "follow_request.reject": "Reddet",
-  "getting_started.developers": "Developers",
-  "getting_started.directory": "Profile directory",
+  "getting_started.developers": "GeliÅŸtiriciler",
+  "getting_started.directory": "Profil dizini",
   "getting_started.documentation": "Documentation",
   "getting_started.heading": "Başlangıç",
-  "getting_started.invite": "Invite people",
+  "getting_started.invite": "İnsanları davet edin",
   "getting_started.open_source_notice": "Mastodon açık kaynaklı bir yazılımdır. Github {github}. {apps} üzerinden katkıda bulunabilir, hata raporlayabilirsiniz.",
-  "getting_started.security": "Security",
-  "getting_started.terms": "Terms of service",
-  "hashtag.column_header.tag_mode.all": "and {additional}",
-  "hashtag.column_header.tag_mode.any": "or {additional}",
-  "hashtag.column_header.tag_mode.none": "without {additional}",
-  "hashtag.column_settings.tag_mode.all": "All of these",
-  "hashtag.column_settings.tag_mode.any": "Any of these",
-  "hashtag.column_settings.tag_mode.none": "None of these",
+  "getting_started.security": "Güvenlik",
+  "getting_started.terms": "Hizmet koşulları",
+  "hashtag.column_header.tag_mode.all": "ve {additional}",
+  "hashtag.column_header.tag_mode.any": "ya da {additional}",
+  "hashtag.column_header.tag_mode.none": "{additional} olmadan",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
+  "hashtag.column_settings.tag_mode.all": "Bunların hepsi",
+  "hashtag.column_settings.tag_mode.any": "Bunların hiçbiri",
+  "hashtag.column_settings.tag_mode.none": "Bunların hiçbiri",
   "hashtag.column_settings.tag_toggle": "Include additional tags in this column",
   "home.column_settings.basic": "Temel",
   "home.column_settings.show_reblogs": "Boost edilenleri göster",
   "home.column_settings.show_replies": "Cevapları göster",
-  "introduction.federation.action": "Next",
-  "introduction.federation.federated.headline": "Federated",
-  "introduction.federation.federated.text": "Public posts from other servers of the fediverse will appear in the federated timeline.",
-  "introduction.federation.home.headline": "Home",
+  "introduction.federation.action": "Ä°leri",
+  "introduction.federation.federated.headline": "BirleÅŸik",
+  "introduction.federation.federated.text": "Diğer dosya sunucularından gelen genel yayınlar, birleşik zaman çizelgesinde görünecektir.",
+  "introduction.federation.home.headline": "Ana sayfa",
   "introduction.federation.home.text": "Posts from people you follow will appear in your home feed. You can follow anyone on any server!",
-  "introduction.federation.local.headline": "Local",
+  "introduction.federation.local.headline": "Yerel",
   "introduction.federation.local.text": "Public posts from people on the same server as you will appear in the local timeline.",
-  "introduction.interactions.action": "Finish tutorial!",
-  "introduction.interactions.favourite.headline": "Favourite",
+  "introduction.interactions.action": "Öğreticiyi bitirin!",
+  "introduction.interactions.favourite.headline": "Favori",
   "introduction.interactions.favourite.text": "You can save a toot for later, and let the author know that you liked it, by favouriting it.",
   "introduction.interactions.reblog.headline": "Boost",
   "introduction.interactions.reblog.text": "You can share other people's toots with your followers by boosting them.",
-  "introduction.interactions.reply.headline": "Reply",
+  "introduction.interactions.reply.headline": "Yanıt",
   "introduction.interactions.reply.text": "You can reply to other people's and your own toots, which will chain them together in a conversation.",
-  "introduction.welcome.action": "Let's go!",
-  "introduction.welcome.headline": "First steps",
+  "introduction.welcome.action": "Hadi gidelim!",
+  "introduction.welcome.headline": "İlk adımlar",
   "introduction.welcome.text": "Welcome to the fediverse! In a few moments, you'll be able to broadcast messages and talk to your friends across a wide variety of servers. But this server, {domain}, is special—it hosts your profile, so remember its name.",
   "keyboard_shortcuts.back": "to navigate back",
   "keyboard_shortcuts.blocked": "to open blocked users list",
   "keyboard_shortcuts.boost": "to boost",
   "keyboard_shortcuts.column": "to focus a status in one of the columns",
   "keyboard_shortcuts.compose": "to focus the compose textarea",
-  "keyboard_shortcuts.description": "Description",
+  "keyboard_shortcuts.description": "Açıklama",
   "keyboard_shortcuts.direct": "to open direct messages column",
   "keyboard_shortcuts.down": "to move down in the list",
   "keyboard_shortcuts.enter": "to open status",
   "keyboard_shortcuts.favourite": "to favourite",
   "keyboard_shortcuts.favourites": "to open favourites list",
   "keyboard_shortcuts.federated": "to open federated timeline",
-  "keyboard_shortcuts.heading": "Keyboard Shortcuts",
-  "keyboard_shortcuts.home": "to open home timeline",
+  "keyboard_shortcuts.heading": "Klavye kısayolları",
+  "keyboard_shortcuts.home": "Ana sayfa zaman çizelgesini açmak için",
   "keyboard_shortcuts.hotkey": "Hotkey",
   "keyboard_shortcuts.legend": "to display this legend",
   "keyboard_shortcuts.local": "to open local timeline",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Remove from list",
   "lists.delete": "Delete list",
   "lists.edit": "Edit list",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Add list",
   "lists.new.title_placeholder": "New list title",
   "lists.search": "Search among people you follow",
@@ -292,12 +295,12 @@
   "search_results.statuses": "Toots",
   "search_results.total": "{count, number} {count, plural, one {sonuç} other {sonuçlar}}",
   "standalone.public_title": "A look inside...",
-  "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_account": "@{name} için denetim arayüzünü açın",
+  "status.admin_status": "Denetim arayüzünde bu durumu açın",
   "status.block": "Block @{name}",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "Bu gönderi boost edilemez",
-  "status.copy": "Copy link to status",
+  "status.copy": "Bağlantı durumunu kopyala",
   "status.delete": "Sil",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -343,7 +346,7 @@
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
   "upload_area.title": "Upload için sürükle bırak yapınız",
   "upload_button.label": "Görsel ekle",
-  "upload_error.limit": "File upload limit exceeded.",
+  "upload_error.limit": "Dosya yükleme sınırı aşıldı.",
   "upload_form.description": "Describe for the visually impaired",
   "upload_form.focus": "Crop",
   "upload_form.undo": "Geri al",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 5dfda49335..d6c5317e0f 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "Видалити зі списку",
   "lists.delete": "Видалити список",
   "lists.edit": "Редагувати список",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "Додати список",
   "lists.new.title_placeholder": "Нова назва списку",
   "lists.search": "Шукати серед людей, на яких ви підписані",
diff --git a/app/javascript/mastodon/locales/whitelist_kk.json b/app/javascript/mastodon/locales/whitelist_kk.json
new file mode 100644
index 0000000000..0d4f101c7a
--- /dev/null
+++ b/app/javascript/mastodon/locales/whitelist_kk.json
@@ -0,0 +1,2 @@
+[
+]
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index 0cfa3f7129..27effba4cf 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "从列表中删除",
   "lists.delete": "删除列表",
   "lists.edit": "编辑列表",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "新建列表",
   "lists.new.title_placeholder": "新列表的标题",
   "lists.search": "搜索你关注的人",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 999ca32168..60baffd2ec 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "從列表刪除",
   "lists.delete": "刪除列表",
   "lists.edit": "編輯列表",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "新增列表",
   "lists.new.title_placeholder": "新列表標題",
   "lists.search": "從你關注的用戶中搜索",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index 26328e12e3..c0871d3796 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -142,6 +142,8 @@
   "hashtag.column_header.tag_mode.all": "and {additional}",
   "hashtag.column_header.tag_mode.any": "or {additional}",
   "hashtag.column_header.tag_mode.none": "without {additional}",
+  "hashtag.column_settings.select.no_options_message": "No suggestions found",
+  "hashtag.column_settings.select.placeholder": "Enter hashtags…",
   "hashtag.column_settings.tag_mode.all": "All of these",
   "hashtag.column_settings.tag_mode.any": "Any of these",
   "hashtag.column_settings.tag_mode.none": "None of these",
@@ -204,6 +206,7 @@
   "lists.account.remove": "從名單中移除",
   "lists.delete": "刪除名單",
   "lists.edit": "修改名單",
+  "lists.edit.submit": "Change title",
   "lists.new.create": "新增名單",
   "lists.new.title_placeholder": "名單名稱",
   "lists.search": "搜尋您關注的使用者",
diff --git a/config/locales/activerecord.kk.yml b/config/locales/activerecord.kk.yml
new file mode 100644
index 0000000000..41d3b2525f
--- /dev/null
+++ b/config/locales/activerecord.kk.yml
@@ -0,0 +1,13 @@
+---
+kk:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: тек әріптер, сандар және асты сызылған таңбалар
+        status:
+          attributes:
+            reblog:
+              taken: жазбасы бұрыннан бар
diff --git a/config/locales/activerecord.tr.yml b/config/locales/activerecord.tr.yml
new file mode 100644
index 0000000000..1cc2d98760
--- /dev/null
+++ b/config/locales/activerecord.tr.yml
@@ -0,0 +1,13 @@
+---
+tr:
+  activerecord:
+    errors:
+      models:
+        account:
+          attributes:
+            username:
+              invalid: sadece harfler, sayılar ve alt çizgiler
+        status:
+          attributes:
+            reblog:
+              taken: durum zaten var
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 5f961b4663..8955f7a687 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -7,7 +7,7 @@ co:
     administered_by: 'Amministratu da:'
     api: API
     apps: Applicazione per u telefuninu
-    closed_registrations: Pè avà, l’arregistramenti sò chjosi nant’à st’istanza. Mà pudete truvà un’altr’istanza per fà un contu è avè accessu à listessa reta da quallà.
+    closed_registrations: Pè avà, l’arregistramenti sò chjosi nant’à stu servore. Mà pudete truvà un’altru per fà un contu è avè accessu à listessa reta da quallà.
     contact: Cuntattu
     contact_missing: Mancante
     contact_unavailable: Micca dispunibule
@@ -27,7 +27,7 @@ co:
     generic_description: "%{domain} hè un servore di a rete"
     hosted_on: Mastodon allughjatu nant’à %{domain}
     learn_more: Amparà di più
-    other_instances: Lista di l’istanze
+    other_instances: Lista di i servori
     privacy_policy: Pulitica di vita privata
     source_code: Codice di fonte
     status_count_after:
@@ -386,14 +386,14 @@ co:
         desc_html: Mudificà l'apparenza cù CSS caricatu nant'à ogni pagina
         title: CSS persunalizatu
       hero:
-        desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di l’istanza sarà usata
+        desc_html: Affissatu nant’a pagina d’accolta. Ricumandemu almenu 600x100px. S’ellu ùn hè micca definiti, a vignetta di u servore sarà usata
         title: Ritrattu di cuprendula
       mascot:
         desc_html: Affissata nant'à parechje pagine. Almenu 293x205px ricumandatu. S'ella hè lasciata viota, a mascotta predefinita sarà utilizata
         title: Ritrattu di a mascotta
       peers_api_enabled:
-        desc_html: Indirizzi st’istanza hà vistu indè u fediverse
-        title: Pubblicà a lista d’istanza cunnisciute
+        desc_html: Indirizzi web stu servore hà vistu indè u fediverse
+        title: Pubblicà a lista di servori cunnisciuti
       preview_sensitive_media:
         desc_html: E priviste di i ligami nant'à l'altri siti mustreranu una vignetta ancu s'ellu hè marcatu cum'è sensibile u media
         title: Vede media sensibili in e viste OpenGraph
@@ -421,20 +421,20 @@ co:
         title: Mustrà un badge staff
       site_description:
         desc_html: Paragrafu di prisentazione nant’a pagina d’accolta. Parlate di cio chì rende stu servore speziale, o d'altre cose impurtante. Pudete fà usu di marchi HTML, in particulare <code>&lt;a&gt;</code> è <code>&lt;em&gt;</code>.
-        title: Discrizzione di l’istanza
+        title: Discrizzione di u servore
       site_description_extended:
         desc_html: Una bona piazza per e regule, infurmazione è altre cose chì l’utilizatori duverìanu sapè. Pudete fà usu di marchi HTML
         title: Discrizzione stesa di u situ
       site_short_description:
-        desc_html: Mustratu indè a barra laterala è i tag meta. Spiegate quale hè Mastodon è ciò chì rende u vostru servore speciale in un paragrafu. S'ella hè lasciata viota, a discrizzione di l'istanza sarà utilizata.
-        title: Descrizzione corta di l'istanza
+        desc_html: Mustratu indè a barra laterala è i tag meta. Spiegate quale hè Mastodon è ciò chì rende u vostru servore speciale in un paragrafu. S'ella hè lasciata viota, a discrizzione di u servore sarà utilizata.
+        title: Descrizzione corta di u servore
       site_terms:
         desc_html: Quì pudete scrive e vostre regule di cunfidenzialità, cundizione d’usu o altre menzione legale. Pudete fà usu di marchi HTML
         title: Termini persunalizati
-      site_title: Nome di l’istanza
+      site_title: Nome di u servore
       thumbnail:
         desc_html: Utilizatu per viste cù OpenGraph è l’API. Ricumandemu 1200x630px
-        title: Vignetta di l’istanza
+        title: Vignetta di u servore
       timeline_preview:
         desc_html: Vede a linea pubblica nant’a pagina d’accolta
         title: Vista di e linee
@@ -495,7 +495,7 @@ co:
     warning: Abbadate à quessi dati. Ùn i date à nisunu!
     your_token: Rigenerà a fiscia d’accessu
   auth:
-    agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di l’istanza</a> è <a href="%{terms_path}">e cundizione d’usu</a>.
+    agreement_html: Cliccà "Arregistrassi" quì sottu vole dì chì site d’accunsentu per siguità <a href="%{rules_path}">e regule di u servore</a> è <a href="%{terms_path}">e cundizione d’usu</a>.
     change_password: Chjave d’accessu
     confirm_email: Cunfirmà l’e-mail
     delete_account: Sguassà u contu
@@ -549,7 +549,7 @@ co:
     description_html: U contu sarà deattivatu è u cuntenutu sarà sguassatu di manera <strong>permanente è irreversibile</strong>. Ùn sarà micca pussibule piglià stu cugnome torna per evità l’impusture.
     proceed: Sguassà u contu
     success_msg: U vostru contu hè statu sguassatu
-    warning_html: Pudete esse sicuru·a solu chì u cuntenutu sarà sguassatu di st’istanza. S’ellu hè statu spartutu in altrò, sarà forse sempre quallà.
+    warning_html: Pudete esse sicuru·a solu chì u cuntenutu sarà sguassatu di stu servore. S’ellu hè statu spartutu in altrò, sarà forse sempre quallà. I servori scunettati è quelli ch'ùn sò più abbunati à e vostre pubblicazione ùn anu micca da mette à ghjornu e so database.
     warning_title: Dispunibilità di i cuntenuti sparsi
   directories:
     directory: Annuariu di i prufili
@@ -563,8 +563,8 @@ co:
       other: "%{count} persone"
   errors:
     '403': Ùn site micca auturizatu·a à vede sta pagina.
-    '404': Sta pagina ùn esiste micca.
-    '410': Sta pagina ùn esiste più.
+    '404': Sta pagina ùn esiste micca quì.
+    '410': Sta pagina ùn esiste più quì.
     '422':
       content: C’hè statu un prublemu cù a verificazione di sicurità. Forse bluccate cookies?
       title: Fiascu di verificazione
@@ -577,7 +577,7 @@ co:
     archive_takeout:
       date: Data
       download: Scaricà l’archiviu
-      hint_html: Pudete dumandà un’archiviu di i vostri <strong>statuti è media caricati</strong>. I dati saranu in u furmattu ActivityPub è pudarenu esse letti da tutti i lugiziali chì u supportanu.
+      hint_html: Pudete dumandà un’archiviu di i vostri <strong>statuti è media caricati</strong>. I dati saranu in u furmattu ActivityPub è pudarenu esse letti da tutti i lugiziali chì u supportanu. Pudete richiede un'archiviu ogni 7 ghjorni.
       in_progress: Cumpilazione di l’archiviu...
       request: Dumandà u vostr’archiviu
       size: Pesu
@@ -588,6 +588,10 @@ co:
     lists: Liste
     mutes: Piattate
     storage: I vostri media
+  featured_tags:
+    add_new: Aghjustà novu
+    errors:
+      limit: Avete digià messu in mostra u numeru massimale di hashtag
   filters:
     contexts:
       home: Accolta
@@ -606,7 +610,7 @@ co:
       title: Aghjustà un novu filtru
   followers:
     domain: Duminiu
-    explanation_html: Per assicuravi di a cunfidenzialità di i vostri statuti, duvete avè primura di quale vi seguita. <strong>I vostri statuti privati sò mandati à tutte l’istanze induve avete abbunati</strong>. Pensate à u vostru livellu di cunfidenza in i so amministratori.
+    explanation_html: Per assicuravi di a cunfidenzialità di i vostri statuti, duvete avè primura di quale vi seguita. <strong>I vostri statuti privati sò mandati à tutti i servori induve avete abbunati</strong>. Pensate à u vostru livellu di cunfidenza in i so amministratori.
     followers_count: Numeru d’abbunati
     lock_link: Rendete u contu privatu
     purge: Toglie di a lista d’abbunati
@@ -628,10 +632,16 @@ co:
       one: Qualcosa ùn và bè! Verificate u prublemu quì sottu
       other: Qualcosa ùn và bè! Verificate %{count} prublemi quì sottu
   imports:
-    preface: Pudete impurtà certi dati cumu e persone chì seguitate o bluccate nant’à u vostru contu nant’à st’istanza à partesi di fugliali creati nant’à un’altr’istanza.
+    modes:
+      merge: Unisce
+      merge_long: Cunservà i dati esistenti è aghjustà i novi
+      overwrite: Soprascrive
+      overwrite_long: Rimpiazzà i dati esistenti cù i novi
+    preface: Pudete impurtà certi dati, cumu e persone chì seguitate o bluccate nant’à u vostru contu, nant’à stu servore à partesi di fugliali creati nant’à un’altru.
     success: I vostri dati sò stati impurtati è saranu trattati da quì à pocu
     types:
       blocking: Persone chì bluccate
+      domain_blocking: Lista di blucchimi di duminiu
       following: Persone chì seguitate
       muting: Persone chì piattate
     upload: Impurtà
@@ -653,7 +663,7 @@ co:
       one: 1 usu
       other: "%{count} usi"
     max_uses_prompt: Micca limita
-    prompt: Create è spartete ligami cù altre parsone per dà accessu à l’istanza
+    prompt: Create è spartete ligami cù altre parsone per dà accessu à u servore
     table:
       expires_at: Spira
       uses: Utiliza
@@ -801,6 +811,7 @@ co:
     development: Sviluppu
     edit_profile: Mudificà u prufile
     export: Spurtazione d’infurmazione
+    featured_tags: Hashtag in vista
     followers: Abbunati auturizati
     import: Impurtazione
     migrate: Migrazione di u contu
@@ -929,9 +940,9 @@ co:
       <p>Originellement adapté de la <a href="https://github.com/discourse/discourse">politique de confidentialité de Discourse</a>.</p>
     title: Termini d’usu è di cunfidenzialità per %{instance}
   themes:
-    contrast: Cuntrastu altu
-    default: Mastodon
-    mastodon-light: Mastodon (chjaru)
+    contrast: Mastodon (Cuntrastu altu)
+    default: Mastodon (Scuru)
+    mastodon-light: Mastodon (Chjaru)
   time:
     formats:
       default: "%d %b %Y, %H:%M"
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index c75d0b643c..7a4c3f255b 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -225,15 +225,15 @@ cs:
       emoji: Emoji
       enable: Povolit
       enabled_msg: Emoji bylo úspěšně povoleno
-      image_hint: PNG až do 50KB
-      listed: Uvedené
+      image_hint: PNG až do 50 KB
+      listed: Uvedeno
       new:
         title: Přidat nové vlastní emoji
       overwrite: Přepsat
       shortcode: Zkratka
       shortcode_hint: Alespoň 2 znaky, pouze alfanumerické znaky a podtržítka
       title: Vlastní emoji
-      unlisted: Neuvedené
+      unlisted: Neuvedeno
       update_failed_msg: Nebylo možné aktualizovat toto emoji
       updated_msg: Emoji úspěšně aktualizováno!
       upload: Nahrát
@@ -570,10 +570,10 @@ cs:
       other: "%{count} lidí"
   errors:
     '403': Nemáte povolení zobrazit tuto stránku.
-    '404': Stránka, kterou hledáte, neexistuje.
-    '410': Stránka, kterou hledáte, již neexistuje.
+    '404': Stránka, kterou hledáte, tu není.
+    '410': Stránka, kterou hledáte, tu již neexistuje.
     '422':
-      content: Bezpečnostní ověření selhalo. Neblokujete cookoes?
+      content: Bezpečnostní ověření selhalo. Neblokujete cookies?
       title: Bezpečnostní ověření selhalo
     '429': Příliš mnoho požadavků
     '500':
@@ -584,7 +584,7 @@ cs:
     archive_takeout:
       date: Datum
       download: Stáhnout svůj archiv
-      hint_html: Můžete si vyžádat archiv vašich <strong>tootů a nahraných médií</strong>. Exportovaná data budou ve formátu ActivityPub a budou čitelné kterýmkoliv kompatibilním softwarem. Archiv si můžete vyžádat každých 7 dní.
+      hint_html: Můžete si vyžádat archiv vašich <strong>tootů a nahraných médií</strong>. Exportovaná data budou ve formátu ActivityPub a budou čitelná kterýmkoliv kompatibilním softwarem. Archiv si můžete vyžádat každých 7 dní.
       in_progress: Kompiluji váš archiv...
       request: Vyžádat svůj archiv
       size: Velikost
@@ -595,6 +595,10 @@ cs:
     lists: Seznamy
     mutes: Ignorujete
     storage: Paměť médií
+  featured_tags:
+    add_new: Přidat nový
+    errors:
+      limit: Již jste nastavil/a maximální počet oblíbených hashtagů
   filters:
     contexts:
       home: Domovská časová osa
@@ -637,10 +641,16 @@ cs:
       one: Něco ještě není úplně v pořádku! Prosím zkontrolujte chybu níže
       other: Něco ještě není úplně v pořádku! Prosím zkontrolujte %{count} chyb níže
   imports:
+    modes:
+      merge: Sloučit
+      merge_long: Ponechat existující záznamy a přidat nové
+      overwrite: Přepsat
+      overwrite_long: Nahradit aktuální záznamy novými
     preface: Můžete importovat data, která jste exportoval/a z jiného serveru, jako například seznam lidí, které sledujete či blokujete.
     success: Vaše data byla úspěšně nahrána a nyní budou zpracována v daný čas
     types:
       blocking: Seznam blokovaných
+      domain_blocking: Seznam blokovaných domén
       following: Seznam sledovaných
       muting: Seznam ignorovaných
     upload: Nahrát
@@ -812,6 +822,7 @@ cs:
     development: Vývoj
     edit_profile: Upravit profil
     export: Export dat
+    featured_tags: Oblíbené hashtagy
     followers: Autorizovaní sledující
     import: Import
     migrate: Přesunutí účtu
@@ -854,7 +865,7 @@ cs:
       public: Veřejné
       public_long: Všichni mohou vidět
       unlisted: Neuvedené
-      unlisted_long: Všichni mohou vidět, ale není zahrnut ve veřejných časových osách
+      unlisted_long: Všichni mohou vidět, ale nebudou zahrnuty ve veřejných časových osách
   stream_entries:
     pinned: Připnutý toot
     reblogged: boostnul/a
@@ -943,8 +954,8 @@ cs:
       <p>Původně adaptováno ze <a href="https://github.com/discourse/discourse">zásad soukromí Discourse</a>.</p>
     title: Podmínky používání a zásady soukromí %{instance}
   themes:
-    contrast: Vysoký kontrast
-    default: Mastodon
+    contrast: Mastodon (vysoký kontrast)
+    default: Mastodon (tmavý)
     mastodon-light: Mastodon (světlý)
   time:
     formats:
diff --git a/config/locales/de.yml b/config/locales/de.yml
index f3276b4f75..1dff7156e8 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -7,7 +7,7 @@ de:
     administered_by: 'Administriert von:'
     api: API
     apps: Mobile Apps
-    closed_registrations: Die Registrierung auf dieser Instanz ist momentan geschlossen. Aber du kannst dein Konto auch auf einer anderen Instanz erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk.
+    closed_registrations: Die Registrierung auf diesem Server ist momentan geschlossen. Aber du kannst dein Konto auch auf einem anderen Server erstellen! Von dort hast du genauso Zugriff auf das Mastodon-Netzwerk.
     contact: Kontakt
     contact_missing: Nicht angegeben
     contact_unavailable: N/A
@@ -27,7 +27,7 @@ de:
     generic_description: "%{domain} ist ein Server im Netzwerk"
     hosted_on: Mastodon, beherbergt auf %{domain}
     learn_more: Mehr erfahren
-    other_instances: Andere Instanzen
+    other_instances: Andere Server
     privacy_policy: Datenschutzerklärung
     source_code: Quellcode
     status_count_after:
@@ -386,14 +386,14 @@ de:
         desc_html: Verändere das Aussehen mit CSS, dass auf jeder Seite geladen wird
         title: Benutzerdefiniertes CSS
       hero:
-        desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Instanz-Thumbnail dafür verwendet
+        desc_html: Wird auf der Startseite angezeigt. Mindestens 600x100px sind empfohlen. Wenn es nicht gesetzt wurde, wird das Server-Thumbnail dafür verwendet
         title: Bild für Startseite
       mascot:
         desc_html: Angezeigt auf mehreren Seiten. Mehr als 293x205px empfohlen. Wenn es nicht gesetzt wurde wird es auf das Standard-Maskottchen zurückfallen
         title: Maskottchen-Bild
       peers_api_enabled:
-        desc_html: Domain-Namen dieser Instanz, die im Fediverse gefunden wurden
-        title: Veröffentliche Liste von gefundenen Instanzen
+        desc_html: Domain-Namen, die der Server im Fediverse gefunden hat
+        title: Veröffentliche Liste von gefundenen Servern
       preview_sensitive_media:
         desc_html: Linkvorschauen auf anderen Webseiten werden ein Vorschaubild anzeigen, obwohl die Medien als heikel gekennzeichnet sind
         title: Heikle Medien in OpenGraph-Vorschauen anzeigen
@@ -421,20 +421,20 @@ de:
         title: Zeige Mitarbeiter-Badge
       site_description:
         desc_html: Einleitungsabschnitt auf der Frontseite. Beschreibe, was diese Mastodon-Instanz ausmacht. Du kannst HTML-Tags benutzen, insbesondere <code>&lt;a&gt;</code> und <code>&lt;em&gt;</code>.
-        title: Beschreibung der Instanz
+        title: Beschreibung des Servers
       site_description_extended:
-        desc_html: Bietet sich für Verhaltenskodizes, Regeln, Richtlinien und weiteres an, was deine Instanz auszeichnet. Du kannst HTML-Tags benutzen
+        desc_html: Bietet sich für Verhaltenskodizes, Regeln, Richtlinien und weiteres an, was deinen Server auszeichnet. Du kannst HTML-Tags benutzen
         title: Erweiterte Beschreibung der Instanz
       site_short_description:
-        desc_html: Wird angezeigt in der Seitenleiste und in Meta-Tags. Beschreibe in einem einzigen Abschnitt, was Mastodon ist und was diesen Server ausmacht. Falls leer, wird die Instanz-Beschreibung verwendet.
-        title: Kurze Instanz-Beschreibung
+        desc_html: Wird angezeigt in der Seitenleiste und in Meta-Tags. Beschreibe in einem einzigen Abschnitt, was Mastodon ist und was diesen Server ausmacht. Falls leer, wird die Server-Beschreibung verwendet.
+        title: Kurze Server-Beschreibung
       site_terms:
         desc_html: Hier kannst du deine eigenen Geschäftsbedingungen, Datenschutzerklärung und anderes rechtlich Relevante eintragen. Du kannst HTML-Tags benutzen
         title: Eigene Geschäftsbedingungen
-      site_title: Name der Instanz
+      site_title: Name des Servers
       thumbnail:
         desc_html: Wird für die Vorschau via OpenGraph und API verwendet. 1200×630 px wird empfohlen
-        title: Instanz-Thumbnail
+        title: Server-Thumbnail
       timeline_preview:
         desc_html: Auf der Frontseite die öffentliche Zeitleiste anzeigen
         title: Zeitleisten-Vorschau
@@ -495,7 +495,7 @@ de:
     warning: Sei mit diesen Daten sehr vorsichtig. Teile sie mit niemandem!
     your_token: Dein Zugangs-Token
   auth:
-    agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln dieser Instanz</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden.
+    agreement_html: Indem du dich registrierst, erklärst du dich mit den untenstehenden <a href="%{rules_path}">Regeln des Servers</a> und der <a href="%{terms_path}">Datenschutzerklärung</a> einverstanden.
     change_password: Passwort
     confirm_email: E-Mail bestätigen
     delete_account: Konto löschen
@@ -549,7 +549,7 @@ de:
     description_html: Hiermit wird <strong>dauerhaft und unwiederbringlich</strong> der Inhalt deines Kontos gelöscht und dein Konto deaktiviert. Dein Profilname wird reserviert, um künftige Imitationen zu verhindern.
     proceed: Konto löschen
     success_msg: Dein Konto wurde erfolgreich gelöscht
-    warning_html: Wir können nur dafür garantieren, dass die Inhalte auf dieser einen Instanz gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen.
+    warning_html: Wir können nur dafür garantieren, dass die Inhalte auf diesem einen Server gelöscht werden. Bei Inhalten, die weit verbreitet wurden, ist es wahrscheinlich, dass Spuren bleiben werden. Server, die offline sind oder keine Benachrichtigungen von deinem Konto mehr empfangen, werden ihre Datenbanken nicht bereinigen.
     warning_title: Verfügbarkeit verstreuter Inhalte
   directories:
     directory: Profilverzeichnis
@@ -563,8 +563,8 @@ de:
       other: "%{count} Leute"
   errors:
     '403': Dir fehlt die Befugnis, diese Seite sehen zu können.
-    '404': Diese Seite existiert nicht.
-    '410': Diese Seite existiert nicht mehr.
+    '404': Die Seite nach der du gesucht hast wurde nicht gefunden.
+    '410': Die Seite nach der du gesucht hast existiert hier nicht mehr.
     '422':
       content: Sicherheitsüberprüfung fehlgeschlagen. Blockierst du Cookies?
       title: Sicherheitsüberprüfung fehlgeschlagen
@@ -577,7 +577,7 @@ de:
     archive_takeout:
       date: Datum
       download: Dein Archiv herunterladen
-      hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden im ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist die das Format unterstützt. Du kannst alle 7 Tage ein Archiv anfordern.
+      hint_html: Du kannst ein Archiv deiner <strong>Beiträge und hochgeladenen Medien</strong> anfragen. Die exportierten Daten werden in dem ActivityPub-Format gespeichert, welches mit jeder Software lesbar ist die das Format unterstützt. Du kannst alle 7 Tage ein Archiv anfordern.
       in_progress: Stelle dein Archiv zusammen...
       request: Dein Archiv anfragen
       size: Größe
@@ -588,6 +588,10 @@ de:
     lists: Listen
     mutes: Du hast stummgeschaltet
     storage: Medienspeicher
+  featured_tags:
+    add_new: Neu hinzufügen
+    errors:
+      limit: Du hast bereits die maximale Anzahl an empfohlenen Hashtags erreicht
   filters:
     contexts:
       home: Startseite
@@ -606,7 +610,7 @@ de:
       title: Neuen Filter hinzufügen
   followers:
     domain: Instanz
-    explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. <strong>Deine privaten Beiträge werden an alle Instanzen weitergegeben, auf denen Menschen registriert sind, die dir folgen.</strong> Wenn du den Betreibenden einer Instanz misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen.
+    explanation_html: Wenn du sicherstellen willst, dass deine Beiträge privat sind, musst du wissen, wer dir folgt. <strong>Deine privaten Beiträge werden an alle Server weitergegeben, auf denen Menschen registriert sind, die dir folgen.</strong> Wenn du den Betreibenden eines Servers misstraust und du befürchtest, dass sie deine Privatsphäre missachten könnten, kannst du sie hier entfernen.
     followers_count: Zahl der Folgenden
     lock_link: dein Konto sperrst
     purge: Von der Liste deiner Folgenden löschen
@@ -628,10 +632,16 @@ de:
       one: Etwas ist noch nicht ganz richtig! Bitte korrigiere den Fehler
       other: Etwas ist noch nicht ganz richtig! Bitte korrigiere %{count} Fehler
   imports:
-    preface: Daten, die du aus einer anderen Instanz exportiert hast, kannst du hier importieren. Beispielsweise die Liste derjenigen, denen du folgst oder die du blockiert hast.
+    modes:
+      merge: Zusammenführen
+      merge_long: Behalte existierende Datensätze und füge neue hinzu
+      overwrite: Ãœberschreiben
+      overwrite_long: Ersetze aktuelle Datensätze mit neuen
+    preface: Daten, die du aus einem anderen Server exportiert hast, kannst du hier importieren. Beispielsweise die Liste derjenigen, denen du folgst oder die du blockiert hast.
     success: Deine Daten wurden erfolgreich hochgeladen und werden in Kürze verarbeitet
     types:
       blocking: Blockierliste
+      domain_blocking: Domain-Blockliste
       following: Folgeliste
       muting: Stummschaltungsliste
     upload: Hochladen
@@ -653,7 +663,7 @@ de:
       one: 1 mal verwendet
       other: "%{count} mal verwendet"
     max_uses_prompt: Kein Limit
-    prompt: Generiere und teile Links um Zugang zu dieser Instanz zu geben
+    prompt: Generiere und teile Links um Zugang zu diesem Server zu geben
     table:
       expires_at: Läuft ab
       uses: Verwendungen
@@ -801,6 +811,7 @@ de:
     development: Entwicklung
     edit_profile: Profil bearbeiten
     export: Datenexport
+    featured_tags: Empfohlene Hashtags
     followers: Autorisierte Folgende
     import: Datenimport
     migrate: Konto-Umzug
@@ -931,9 +942,9 @@ de:
       <p>Ursprünglich übernommen von der <a href="https://github.com/discourse/discourse">Discourse-Datenschutzerklärung</a>.</p>
     title: "%{instance} Nutzungsbedingungen und Datenschutzerklärung"
   themes:
-    contrast: Hoher Kontrast
-    default: Mastodon
-    mastodon-light: Mastodon (hell)
+    contrast: Mastodon (Hoher Kontrast)
+    default: Mastodon (Dunkel)
+    mastodon-light: Mastodon (Hell)
   time:
     formats:
       default: "%d.%m.%Y %H:%M"
@@ -982,7 +993,7 @@ de:
       final_action: Fang an zu posten
       final_step: 'Fang an zu posten! Selbst ohne Follower werden deine öffentlichen Beitrage von anderen gesehen, zum Beispiel auf der lokalen Zeitleiste oder in Hashtags. Vielleicht möchtest du dich vorstellen mit dem #introductions-Hashtag.'
       full_handle: Dein vollständiger Benutzername
-      full_handle_hint: Dies ist was du deinen Freunden sagen kannst, damit sie dich anschreiben oder von einer anderen Instanz folgen können.
+      full_handle_hint: Dies ist was du deinen Freunden sagen kannst, damit sie dich anschreiben oder von einem anderen Server folgen können.
       review_preferences_action: Einstellungen ändern
       review_preferences_step: Stelle sicher, dass du deine Einstellungen einstellst, wie zum Beispiel welche E-Mails du gerne erhalten möchtest oder was für Privatsphäreneinstellungen voreingestellt werden sollten. Wenn dir beim Ansehen von GIFs nicht schwindelig wird, dann kannst du auch das automatische Abspielen dieser aktivieren.
       subject: Willkommen bei Mastodon
diff --git a/config/locales/devise.co.yml b/config/locales/devise.co.yml
index 108a4ef11e..89688a5a9d 100644
--- a/config/locales/devise.co.yml
+++ b/config/locales/devise.co.yml
@@ -20,17 +20,17 @@ co:
         action: Verificà l’indirizzu email
         action_with_app: Cunfirmà è rivene à %{app}
         explanation: Avete creatu un contu nant’à %{host} cù st’indirizzu email. Pudete attivallu cù un clic, o ignurà quessu missaghji s’ellu un era micca voi.
-        extra_html: Pensate à leghje <a href="%{terms_path}">e regule di l’istanza</a> è <a href="%{policy_path}">i termini d’usu</a>.
+        extra_html: Pensate à leghje <a href="%{terms_path}">e regule di u servore</a> è <a href="%{policy_path}">i termini d’usu</a>.
         subject: 'Mastodon: Istruzzione di cunfirmazione per %{instance}'
         title: Verificà l’indirizzu email
       email_changed:
         explanation: 'L’indirizzu email di u vostru contu hè stata cambiata per:'
-        extra: S’ellu un era micca voi ch’avete cambiatu u vostru email, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di l’istanza s’ellu ùn hè più pussibule di cunnettavi.
+        extra: S’ellu un era micca voi ch’avete cambiatu u vostru email, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di u servore s’ellu ùn hè più pussibule di cunnettavi.
         subject: 'Mastodon: Email cambiatu'
         title: Novu indirizzu email
       password_change:
         explanation: A chjave d’accessu per u vostru contu hè stata cambiata.
-        extra: S’ellu un era micca voi ch’avete cambiatu a vostra chjave d’accessu, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di l’istanza s’ellu ùn hè più pussibule di cunnettavi.
+        extra: S’ellu un era micca voi ch’avete cambiatu a vostra chjave d’accessu, qualch’un’altru hà accessu à u vostru contu. Duvete cambià a vostra chjave d’accessu o cuntattà l’amministratore di u servore s’ellu ùn hè più pussibule di cunnettavi.
         subject: 'Mastodon: Chjave d’accessu cambiata'
         title: Chjave cambiata
       reconfirmation_instructions:
diff --git a/config/locales/devise.da.yml b/config/locales/devise.da.yml
index 56ae5183bf..4816d6456b 100644
--- a/config/locales/devise.da.yml
+++ b/config/locales/devise.da.yml
@@ -20,17 +20,17 @@ da:
         action: Bekræft email adresse
         action_with_app: Bekræft og vend tilbage til %{app}
         explanation: Du har oprettet en konto på %{host} med denne email adresse. Du er et klik fra at aktivere din konto. Hvis du ikke har oprettet dig, ignorer venligst denne email.
-        extra_html: Tjek også <a href="%{terms_path}">reglerne for instansen</a> og <a href="%{policy_path}">vores betingelser</a>.
+        extra_html: Tjek også <a href="%{terms_path}">reglerne for serveren</a> og <a href="%{policy_path}">vores betingelser</a>.
         subject: 'Mastodon: Bekræftelses instrukser for %{instance}'
         title: Bekræft email adresse
       email_changed:
         explanation: 'Email adressen for din konto bliver ændret til:'
-        extra: Hvis du ikke har ændret din email adresse er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på instansen hvis du er låst ude af din konto.
+        extra: Hvis du ikke har ændret din email adresse er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på serveren hvis du er låst ude af din konto.
         subject: 'Mastodon: Email ændret'
         title: Ny email adresse
       password_change:
         explanation: Kodeordet for din konto er blevet ændret.
-        extra: Hvis du ikke har ændret dit kodeord er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på instansen hvis du er låst ude af din konto.
+        extra: Hvis du ikke har ændret dit kodeord er det muligt, at nogen har fået adgang til din konto. Venligst ændre dit kodeord med det samme eller kontakt administratoren på serveren hvis du er låst ude af din konto.
         subject: 'Mastodon: Kodeord ændret'
         title: Kodeordet er blevet ændret
       reconfirmation_instructions:
diff --git a/config/locales/devise.de.yml b/config/locales/devise.de.yml
index fc41c9db51..5b060e0e78 100644
--- a/config/locales/devise.de.yml
+++ b/config/locales/devise.de.yml
@@ -20,17 +20,17 @@ de:
         action: E-Mail-Adresse verifizieren
         action_with_app: Bestätigen und zu %{app} zurückkehren
         explanation: Du hast einen Account auf %{host} mit dieser E-Mail-Adresse erstellt. Du bist nun einen Klick entfernt vor der Aktivierung. Wenn du das nicht warst, kannst du diese E-Mail ignorieren.
-        extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln dieser Instanz</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>.
+        extra_html: Bitte lies auch die <a href="%{terms_path}">Regeln des Servers</a> und <a href="%{policy_path}">unsere Nutzungsbedingungen</a>.
         subject: 'Mastodon: Bestätigung deines Kontos bei %{instance}'
         title: Verifiziere E-Mail-Adresse
       email_changed:
         explanation: 'Die E-Mail-Adresse deines Accounts wird geändert zu:'
-        extra: Wenn du deine E-Mail-Adresse nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator deiner Instanz, wenn du dich ausgesperrt hast.
+        extra: Wenn du deine E-Mail-Adresse nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator des Servers, wenn du dich ausgesperrt hast.
         subject: 'Mastodon: E-Mail-Adresse geändert'
         title: Neue E-Mail-Adresse
       password_change:
         explanation: Das Passwort für deinen Account wurde geändert.
-        extra: Wenn du dein Passwort nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator deiner Instanz, wenn du dich ausgesperrt hast.
+        extra: Wenn du dein Passwort nicht geändert hast, dann kann es vermutlich sein, dass jemand Zugriff zu deinem Account erhalten hat. Bitte ändere sofort dein Passwort oder kontaktiere den Administrator des Servers, wenn du dich ausgesperrt hast.
         subject: 'Mastodon: Passwort geändert'
         title: Passwort geändert
       reconfirmation_instructions:
diff --git a/config/locales/devise.eu.yml b/config/locales/devise.eu.yml
index 9893f5ba32..65046dc0f5 100644
--- a/config/locales/devise.eu.yml
+++ b/config/locales/devise.eu.yml
@@ -20,17 +20,17 @@ eu:
         action: Baieztatu e-mail helbidea
         action_with_app: Berretsi eta itzuli %{app} aplikaziora
         explanation: Kontu bat sortu duzu %{host} ostalarian e-mail helbide honekin. Aktibatzeko klik bat falta zaizu. Ez baduzu zuk sortu, ez egin ezer e-mail honekin.
-        extra_html: Egiaztatu <a href="%{terms_path}">instantziaren arauak</a> eta <a href="%{policy_path}">zerbitzuaren erabilera baldintzak</a>.
+        extra_html: Egiaztatu <a href="%{terms_path}">zerbitzariaren arauak</a> eta <a href="%{policy_path}">zerbitzuaren erabilera baldintzak</a>.
         subject: 'Mastodon: %{instance} instantziaren argibideak baieztapenerako'
         title: Baieztatu e-mail helbidea
       email_changed:
         explanation: 'Zure kontuaren e-mail helbidea honetara aldatuko da:'
-        extra: Ez baduzu e-mail helbidea aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri instantziako administratzailearekin kontaktuan zure kontura sartzerik ez baduzu.
+        extra: Ez baduzu e-mail helbidea aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri zerbitzariko administratzailearekin kontaktuan zure kontura sartzerik ez baduzu.
         subject: 'Mastodon: E-mail helbidea aldatuta'
         title: E-mail helbide berria
       password_change:
         explanation: Zure kontuaren pasahitza aldatu da.
-        extra: Ez baduzu pasahitza aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri instantziako administratzailearekin kontaktuan zure kontura sartzerik ez baduzu.
+        extra: Ez baduzu pasahitza aldatu, agian baten bat zure kontura sartzea lortu du. Aldatu zure pasahitza berehala edo jarri zerbitzariko administratzailearekin kontaktuan zure kontura sartzerik ez baduzu.
         subject: 'Mastodon: Pasahitza aldatuta'
         title: Pasahitza aldatuta
       reconfirmation_instructions:
diff --git a/config/locales/devise.fa.yml b/config/locales/devise.fa.yml
index e6e16b4b49..1375c43f52 100644
--- a/config/locales/devise.fa.yml
+++ b/config/locales/devise.fa.yml
@@ -18,6 +18,7 @@ fa:
     mailer:
       confirmation_instructions:
         action: تأیید نشانی ایمیل
+        action_with_app: تأیید و بازگشت به %{app}
         explanation: شما با این نشانی ایمیل حسابی در %{host} باز کرده‌اید. با یک کلیک می‌توانید این حساب را فعال کنید. اگر شما چنین کاری نکردید، لطفاً این ایمیل را نادیده بگیرید.
         extra_html: لطفاً همچنین <a href="%{terms_path}">قانون‌های این سرور</a> و <a href="%{policy_path}">شرایط کاربری</a> آن را ببینید.
         subject: 'ماستدون: راهنمایی برای تأیید %{instance}'
diff --git a/config/locales/devise.fi.yml b/config/locales/devise.fi.yml
index e356abf9f4..12ab0f3ab9 100644
--- a/config/locales/devise.fi.yml
+++ b/config/locales/devise.fi.yml
@@ -18,6 +18,7 @@ fi:
     mailer:
       confirmation_instructions:
         action: Vahvista sähköpostiosoite
+        action_with_app: Vahvista ja palaa %{app}
         explanation: Olet luonut tilin palvelimelle %{host} käyttäen tätä sähköpostiosoitetta. Aktivoi tili yhdellä klikkauksella. Jos et luonut tiliä itse, voit jättää tämän viestin huomiotta.
         extra_html: Katso myös <a href="%{terms_path}">instanssin säännöt</a> ja <a href="%{policy_path}">käyttöehdot</a>.
         subject: 'Mastodon: Vahvistusohjeet - %{instance}'
diff --git a/config/locales/devise.fr.yml b/config/locales/devise.fr.yml
index 718b4056e7..f0a5414b8e 100644
--- a/config/locales/devise.fr.yml
+++ b/config/locales/devise.fr.yml
@@ -21,7 +21,7 @@ fr:
         action_with_app: Confirmer et retourner à %{app}
         explanation: Vous avez créé un compte sur %{host} avec cette adresse courriel. Vous êtes à un clic de l’activer. Si ce n’était pas vous, veuillez ignorer ce courriel.
         extra_html: Merci de consultez également <a href="%{terms_path}">les règles de l’instance</a> et <a href="%{policy_path}">nos conditions d’utilisation</a>.
-        subject: Merci de confirmer votre inscription sur %{instance}
+        subject: 'Mastodon : Merci de confirmer votre inscription sur %{instance}'
         title: Vérifier l’adresse courriel
       email_changed:
         explanation: 'L’adresse courriel de votre compte est en cours de modification pour devenir :'
@@ -31,7 +31,7 @@ fr:
       password_change:
         explanation: Le mot de passe de votre compte a été changé.
         extra: Si vous n’avez pas changé votre mot de passe, il est probable que quelqu’un ait eu accès à votre compte. Veuillez changer votre mot de passe immédiatement ou contacter l’administrateur·rice de l’instance si vous êtes bloqué·e hors de votre compte.
-        subject: Votre mot de passe a été modifié avec succès
+        subject: 'Mastodon : Votre mot de passe a été modifié avec succès'
         title: Mot de passe modifié
       reconfirmation_instructions:
         explanation: Confirmez la nouvelle adresse pour changer votre courriel.
@@ -42,10 +42,10 @@ fr:
         action: Modifier le mot de passe
         explanation: Vous avez demandé un nouveau mot de passe pour votre compte.
         extra: Si vous ne l’avez pas demandé, veuillez ignorer ce courriel. Votre mot de passe ne changera pas tant que vous n’aurez pas cliqué sur le lien ci-dessus et que vous n’en aurez pas créé un nouveau.
-        subject: Instructions pour changer votre mot de passe
+        subject: 'Mastodon : Instructions pour changer votre mot de passe'
         title: Réinitialisation du mot de passe
       unlock_instructions:
-        subject: Instructions pour déverrouiller votre compte
+        subject: 'Mastodon : Instructions pour déverrouiller votre compte'
     omniauth_callbacks:
       failure: 'Nous n’avons pas pu vous authentifier via %{kind} : ''%{reason}''.'
       success: Authentifié avec succès via %{kind}.
@@ -56,12 +56,12 @@ fr:
       updated: Votre mot de passe a été modifié avec succès, vous êtes maintenant connecté⋅e.
       updated_not_active: Votre mot de passe a été modifié avec succès.
     registrations:
-      destroyed: Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt.
-      signed_up: Bienvenue, vous êtes connecté⋅e.
+      destroyed: Au revoir ! Votre compte a été supprimé avec succès. Nous espérons vous revoir bientôt.
+      signed_up: Bienvenue ! Vous êtes connecté⋅e.
       signed_up_but_inactive: Vous êtes bien enregistré⋅e. Vous ne pouvez cependant pas vous connecter car votre compte n’est pas encore activé.
       signed_up_but_locked: Vous êtes bien enregistré⋅e. Vous ne pouvez cependant pas vous connecter car votre compte est verrouillé.
-      signed_up_but_unconfirmed: Un message contenant un lien de confirmation a été envoyé à votre adresse courriel. Ouvrez ce lien pour activer votre compte.
-      update_needs_confirmation: Votre compte a bien été mis à jour mais nous devons vérifier votre nouvelle adresse courriel. Merci de vérifier vos courriels et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse.
+      signed_up_but_unconfirmed: Un message contenant un lien de confirmation a été envoyé à votre adresse courriel. Ouvrez ce lien pour activer votre compte. Veuillez vérifier votre dossier d'indésirables si vous ne recevez pas le courriel.
+      update_needs_confirmation: Votre compte a bien été mis à jour, mais nous devons vérifier votre nouvelle adresse courriel. Merci de vérifier vos courriels et de cliquer sur le lien de confirmation pour finaliser la validation de votre nouvelle adresse. Si vous n'avez pas reçu le courriel, vérifiez votre dossier d'indésirables.
       updated: Votre compte a été modifié avec succès.
     sessions:
       already_signed_out: Déconnecté·e.
diff --git a/config/locales/devise.gl.yml b/config/locales/devise.gl.yml
index 9f60747a6a..d456d25df1 100644
--- a/config/locales/devise.gl.yml
+++ b/config/locales/devise.gl.yml
@@ -20,17 +20,17 @@ gl:
         action: Validar enderezo de correo-e
         action_with_app: Confirmar e voltar a %{app}
         explanation: Creou unha conta en %{host} con este enderezo de correo. Está a punto de activalo, si non foi vostede quen fixo a petición, por favor ignore este correo.
-        extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas da instancia</a> e <a href="%{policy_path}">os termos do servizo</a>.
+        extra_html: Por favor, lea tamén <a href="%{terms_path}">as normas do sevidor</a> e <a href="%{policy_path}">os termos do servizo</a>.
         subject: 'Mastodon: Instruccións de confirmación para %{instance}'
         title: Verificar enderezo de correo-e
       email_changed:
         explanation: 'O seu enderezo de correo para esta conta foi cambiado a:'
-        extra: Si non fixo a petición de cambio de correo-e é probable que alguén obtivese acceso a súa conta. Por favor, cambie o contrasinal inmediatamente ou contacte coa administración da instancia si non ten acceso a súa conta.
+        extra: Se non fixo a petición de cambio de correo-e é probable que alguén obtivese acceso a súa conta. Por favor, cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta.
         subject: 'Mastodon: email cambiado'
         title: Novo enderezo de correo
       password_change:
         explanation: Cambiouse o contrasinal da súa conta.
-        extra: Si non cambio o contrasinal, é probable que alguén obtivese acceso a súa conta. Por favor cambie o contrasinal inmediatamente ou contacte coa administración da instancia si non ten acceso a súa conta.
+        extra: Se non cambiou o contrasinal, é probable que alguén obtivese acceso a súa conta. Por favor cambie o contrasinal inmediatamente ou contacte coa administración do servidor se non ten acceso a súa conta.
         subject: 'Mastodon: contrasinal cambiado'
         title: Contrainal cambiado
       reconfirmation_instructions:
diff --git a/config/locales/devise.kk.yml b/config/locales/devise.kk.yml
new file mode 100644
index 0000000000..d99116c7f0
--- /dev/null
+++ b/config/locales/devise.kk.yml
@@ -0,0 +1,83 @@
+---
+kk:
+  devise:
+    confirmations:
+      confirmed: Сіздің email адресіңіз сәтті құпталды.
+      send_instructions: Email адресіңізге бірнеше минут ішінде қалай растау керегі туралы нұсқау бар хат келеді. Бұл хат егер келмесе, спам құтысын тексеріңіз.
+      send_paranoid_instructions: Email адресіңіз біздің дерекқорымызда болса, бірнеше минут ішінде растау туралы нұсқау бар хат аласыз. Бұл хатты алмасаңыз, спам құтысын тексеріңіз.
+    failure:
+      already_authenticated: Сіз кіріп тұрсыз.
+      inactive: Аккаунтыңыз әлі құпталмаған.
+      invalid: Қате %{authentication_keys} немесе құпиясөз.
+      last_attempt: Аккаунтыңыз құлыпталғанға дейін тағы бір әрекет жасаңыз.
+      locked: Аккаунтыңыз құлыпталған.
+      not_found_in_database: Қате %{authentication_keys} немесе құпиясөз.
+      timeout: Сессияңыз аяқталды. Қайтадан кіріңіз жалғастыру үшін.
+      unauthenticated: Жалғастыру үшін тіркеліңіз немесе логиніңізбен кіріңіз.
+      unconfirmed: Жалғастыру үшін email адресіңізді құптауыңыз керек.
+    mailer:
+      confirmation_instructions:
+        action: Email адресіңізді растаңыз
+        action_with_app: Растау және оралу - %{app}
+        explanation: Сіз %{host} сайтына тіркелгенсіз осы email адресімен. Активация жасауға бір адам қалды. Егер тіркелмеген болсаңыз, бұл хатты елемеңіз.
+        extra_html: Сондай-ақ <a href="%{terms_path}">шарттар мен ережелерді</a> және <a href="%{policy_path}">құпиялылық саясатын</a> оқыңыз.
+        subject: 'Mastodon: Растау туралы нұсқаулық %{instance}'
+        title: Email адресін растау
+      email_changed:
+        explanation: 'Сіздің email адресіңіз өзгертілейін деп жатыр:'
+        extra: Егер сіз электрондық поштаңызды өзгертпеген болсаңыз, онда біреу сіздің аккаунтыңызға қол жеткізді. Аккаунтыңыздан шыққан жағдайда дереу құпия сөзіңізді өзгертіңіз немесе сервер әкімшісіне хабарласыңыз.
+        subject: 'Mastodon: Email өзгертілді'
+        title: Жаңа email адрес
+      password_change:
+        explanation: Аккаунтыңыздағы құпиясөз өзгертілді.
+        extra: Егер сіз электрондық поштаңызды өзгертпеген болсаңыз, онда біреу сіздің аккаунтыңызға қол жеткізді. Аккаунтыңыздан шыққан жағдайда дереу құпия сөзіңізді өзгертіңіз немесе сервер әкімшісіне хабарласыңыз.
+        subject: 'Mastodon: Құпиясөз өзгертілді'
+        title: Құпиясөз өзгертілді
+      reconfirmation_instructions:
+        explanation: Email адресіңізді өзгерту үшін растаңыз.
+        extra: Егер сіз бұл өзгерісті жасамаған болсаңыз, бұл хатты елемеңіз. Mastodon тіркелгісінің электрондық пошта мекенжайы жоғарыдағы сілтемеге кірмейінше өзгермейді.
+        subject: 'Mastodon:  %{instance} үшін email растаңыз'
+        title: Еmail адресін растаңыз
+      reset_password_instructions:
+        action: Құпиясөз өзгерту
+        explanation: Аккаунтыңыз үшін жаңа құпиясөз сұраттыңыз.
+        extra: Егер сіз мұны сұрамаған болсаңыз, бұл хатты елемеңіз. Жоғарыдағы сілтемені ашып, жаңасын жасағанша құпия сөзіңіз өзгермейді.
+        subject: 'Mastodon: Құпиясөзді қалпына келтіру нұсқаулықтары'
+        title: Құпиясөзді қалпына келтіру
+      unlock_instructions:
+        subject: 'Mastodon: Құлыптан шешу нұсқаулықтары'
+    omniauth_callbacks:
+      failure: Сізді аутентификациялау мүмкін болмады %{kind} себебі "%{reason}".
+      success: "%{kind} аккаунтынан сәтті аутентификация."
+    passwords:
+      no_token: Бұл бетке құпиясөзді қалпына келтіру электрондық поштасынан шықпай кіре алмайсыз. Құпия сөзді қалпына келтіру электрондық поштасынан шықсаңыз, берілген толық URL мекенжайын пайдаланғаныңызды тексеріңіз.
+      send_instructions: Электрондық пошта мекенжайыңыз біздің дерекқорымызда болса, бірнеше минут ішінде құпия сөзді қалпына келтіру сілтемесін аласыз. Бұл хат келмеген болса, спам құтысын тексеріңіз.
+      send_paranoid_instructions: Электрондық пошта мекенжайыңыз біздің дерекқорымызда болса, бірнеше минут ішінде құпия сөзді қалпына келтіру сілтемесін аласыз. Бұл хат келмеген болса, спам құтысын тексеріңіз.
+      updated: Құпиясөзіңіз сәтті өзгертілді. Сіз енді кірдіңіз.
+      updated_not_active: Құпиясөзіңіз сәтті өзгертілді.
+    registrations:
+      destroyed: Сау! Аккаунтыңыз тоқтатылды. Қайтадан ораласыз деп сенеміз.
+      signed_up: Қош келдіңіз! Тіркелу сәтті өтті.
+      signed_up_but_inactive: Тіркелу сәтті аяқталды. Дегенмен, аккаунтыңыз әлі белсендірілмегендіктен, сізге сайтқа кіру мүмкін болмайды.
+      signed_up_but_locked: Тіркелу сәтті аяқталды. Дегенмен, аккаунтыңыз құлыпталғандықтан, сізге сайтқа кіру мүмкін болмайды.
+      signed_up_but_unconfirmed: Растау сілтемесі бар хат электрондық поштаыңызға жіберілді. Аккаунтыңызды белсендіру үшін сілтеме бойынша өтіңіз. Бұл хат келмесе, спам құтысын тексеріңіз.
+      update_needs_confirmation: Аккаунтыыызды сәтті жаңарттыңыз, бірақ жаңа электрондық поштаны тексеру қажет. Электрондық поштаңызды тексеріп, жаңа электрондық пошта мекенжайыңызды растаңыз. Бұл электрондық поштаны алмасаңыз, спам қалтаңызды тексеріңіз.
+      updated: Аккаунтыңыз сәтті жаңартылды.
+    sessions:
+      already_signed_out: Сәтті шықтыңыз.
+      signed_in: Сәтті кірдіңіз.
+      signed_out: Шығу сәтті орындалды.
+    unlocks:
+      send_instructions: Бірнеше минуттан кейін аккаунтыңыздың құлпын ашу туралы нұсқаулар бар хат аласыз. Бұл хаттыы алмасаңыз, спам құтысын тексеріңіз.
+      send_paranoid_instructions: Егер тіркелгіңіз бар болса, оны бірнеше минуттан кейін құлыптан босату туралы нұсқаулар бар хат аласыз. Бұл хат келмесе, спам құтысын тексеріңіз.
+      unlocked: Аккаунтыңыз сәтті шешілді құлыптан. Жалғастыру үшін кіріңіз.
+  errors:
+    messages:
+      already_confirmed: әлдеқашан расталған, логинмен кіре беріңіз
+      confirmation_period_expired: "%{period} ішінде расталуы қажет, жаңасын сұратыңыз"
+      expired: уақыты өтіп кетті, жаңасын сұратыңыз
+      not_found: табылмады
+      not_locked: құлыпталмады
+      not_saved:
+        one: '1 тыйым салынған қате %{resource} сақталды:'
+        other: "%{count} тыйым салынған қате %{resource} сақталды:"
diff --git a/config/locales/devise.sq.yml b/config/locales/devise.sq.yml
index 906bece813..0380d962e6 100644
--- a/config/locales/devise.sq.yml
+++ b/config/locales/devise.sq.yml
@@ -20,17 +20,17 @@ sq:
         action: Verifikoni adresë email
         action_with_app: Ripohojeni dhe kthehuni te %{app}
         explanation: Keni krijuar një llogari te %{host}, me këtë adresë email. Jeni një klikim larg aktivizimit të saj. Nëse s’jeni ju, shpërfilleni këtë email.
-        extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e instancës</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>.
+        extra_html: Ju lutemi, shihni edhe <a href="%{terms_path}">rregullat e shërbyesit</a> dhe <a href="%{policy_path}">kushtet tona të shërbimit</a>.
         subject: 'Mastodon: Udhëzime ripohimi për %{instance}'
         title: Verifikoni adresë email
       email_changed:
         explanation: 'Adresa email për llogarinë tuaj po ndryshohet në:'
-        extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj.
+        extra: Nëse email-in tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e shërbyesit, nëse jeni kyçur jashtë llogarisë tuaj.
         subject: 'Mastodon: Email-i u ndryshua'
         title: Adresë email e re
       password_change:
         explanation: Fjalëkalimi për llogarinë tuaj u ndryshua.
-        extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e instancës, nëse jeni kyçur jashtë llogarisë tuaj.
+        extra: Nëse fjalëkalimin tuaj nuk e ndryshuat ju, gjasat janë që dikush tjetër ka arritur të hyjë në llogarinë tuaj. Ju lutemi, ndryshoni menjëherë fjalëkalimin tuaj ose lidhuni me përgjegjësin e shërbyesit, nëse jeni kyçur jashtë llogarisë tuaj.
         subject: 'Mastodon: Fjalëkalimi u ndryshua'
         title: Fjalëkalimi u ndryshua
       reconfirmation_instructions:
diff --git a/config/locales/devise.tr.yml b/config/locales/devise.tr.yml
new file mode 100644
index 0000000000..0a504dd676
--- /dev/null
+++ b/config/locales/devise.tr.yml
@@ -0,0 +1,15 @@
+---
+tr:
+  devise:
+    confirmations:
+      confirmed: E-posta adresiniz başarıyla onaylandı.
+      send_instructions: Birkaç dakika içinde e-posta adresinizi nasıl onaylayacağınıza ilişkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin.
+      send_paranoid_instructions: E-posta adresiniz veritabanımızda varsa, e-posta adresinizi birkaç dakika içinde nasıl doğrulayacağınıza ilişkin talimatları içeren bir e-posta alacaksınız. Bu e-postayı almadıysanız, lütfen spam klasörünüzü kontrol edin.
+    failure:
+      already_authenticated: Zaten oturum açtınız.
+      inactive: Hesabınız henüz etkinleştirilmedi.
+      last_attempt: Hesabınız kilitlenmeden önce bir kez daha denemeniz gerekir.
+      locked: Hesabınız kilitli.
+    mailer:
+      confirmation_instructions:
+        action: E-posta adresinizi doğrulayın
diff --git a/config/locales/doorkeeper.kk.yml b/config/locales/doorkeeper.kk.yml
new file mode 100644
index 0000000000..de3a0e155f
--- /dev/null
+++ b/config/locales/doorkeeper.kk.yml
@@ -0,0 +1,142 @@
+---
+kk:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Application аты
+        redirect_uri: Redirect URI
+        scopes: Scopes
+        website: Application сайты
+    errors:
+      models:
+        doorkeeper/application:
+          attributes:
+            redirect_uri:
+              fragment_present: cannot contain a frаgment.
+              invalid_uri: must be a vаlid URI.
+              relative_uri: must be an аbsolute URI.
+              secured_uri: must be аn HTTPS/SSL URI.
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Авторизация
+        cancel: Қайтып алу
+        destroy: Жою
+        edit: Түзету
+        submit: Жіберу
+      confirmations:
+        destroy: Шынымен бе?
+      edit:
+        title: Қосымшаны түзету
+      form:
+        error: Whoops! Check your form for pоssible errors
+      help:
+        native_redirect_uri: Use %{native_redirect_uri} fоr local tests
+        redirect_uri: Use one line pеr URI
+        scopes: Separate scopes with spаces. Leave blank to use the default scopes.
+      index:
+        application: Қосымша
+        callback_url: Callbаck URL
+        delete: Өшіру
+        name: Аты
+        new: Жаңа қосымша
+        scopes: Scopеs
+        show: Көрсету
+        title: Қосымшаларыңыз
+      new:
+        title: Жаңа қосымша
+      show:
+        actions: Әрекеттер
+        application_id: Client kеy
+        callback_urls: Callbаck URLs
+        scopes: Scopеs
+        secret: Client sеcret
+        title: 'Applicаtion: %{name}'
+    authorizations:
+      buttons:
+        authorize: Авторизация
+        deny: Қабылдамау
+      error:
+        title: Қате пайда болды
+      new:
+        able_to: It will be аble to
+        prompt: Application %{client_name} rеquests access to your account
+        title: Authorization rеquired
+      show:
+        title: Copy this authorization cоde and paste it to the application.
+    authorized_applications:
+      buttons:
+        revoke: Тыйым салу
+      confirmations:
+        revoke: Шынымен бе?
+      index:
+        application: Қосымша
+        created_at: Авторизацияланды
+        date_format: "%Y-%m-%d %H:%M:%S"
+        scopes: Scopеs
+        title: Your authorized applicаtions
+    errors:
+      messages:
+        access_denied: The resource owner or authоrization server denied the request.
+        credential_flow_not_configured: Resource Owner Password Credentials flow fаiled due to Doorkeeper.configure.resource_owner_from_credentials being unconfigured.
+        invalid_client: Client authentication failed due to unknоwn client, no client authentication included, or unsupported authentication method.
+        invalid_grant: The provided authorization grant is invаlid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.
+        invalid_redirect_uri: The redirеct uri included is not valid.
+        invalid_request: The request is missing a required parameter, includes an unsupported parameter vаlue, or is otherwise malformed.
+        invalid_resource_owner: The provided resource owner credentials are not valid, or rеsource owner cannot be found
+        invalid_scope: The requested scope is invаlid, unknown, or malformed.
+        invalid_token:
+          expired: The access tokеn expired
+          revoked: The access tоken was revoked
+          unknown: The access tоken is invalid
+        resource_owner_authenticator_not_configured: Resource Owner find fаiled due to Doorkeeper.configure.resource_owner_authenticator being unconfiged.
+        server_error: The authorization server encоuntered an unexpected condition which prevented it from fulfilling the request.
+        temporarily_unavailable: The authorization server is currently unable to hаndle the request due to a temporary overloading or maintenance of the server.
+        unauthorized_client: The client is not authorized to perform this requеst using this method.
+        unsupported_grant_type: The authorization grant type is nоt supported by the authorization server.
+        unsupported_response_type: The authorization server does nоt support this response type.
+    flash:
+      applications:
+        create:
+          notice: Application crеated.
+        destroy:
+          notice: Application dеleted.
+        update:
+          notice: Application updаted.
+      authorized_applications:
+        destroy:
+          notice: Application revоked.
+    layouts:
+      admin:
+        nav:
+          applications: Applicatiоns
+          oauth2_provider: OAuth2 Prоvider
+      application:
+        title: OAuth authorizatiоn required
+    scopes:
+      follow: modify accоunt relationships
+      push: receive your push nоtifications
+      read: read all your accоunt's data
+      read:accounts: see accounts infоrmation
+      read:blocks: see your blоcks
+      read:favourites: see your favоurites
+      read:filters: see yоur filters
+      read:follows: see your follоws
+      read:lists: see yоur lists
+      read:mutes: see yоur mutes
+      read:notifications: see your nоtifications
+      read:reports: see your repоrts
+      read:search: search on yоur behalf
+      read:statuses: see all stаtuses
+      write: modify all your accоunt's data
+      write:accounts: modify your prоfile
+      write:blocks: block accounts and dоmains
+      write:favourites: favourite stаtuses
+      write:filters: creаte filters
+      write:follows: follow peоple
+      write:lists: creatе lists
+      write:media: upload mеdia files
+      write:mutes: mute pеople and conversations
+      write:notifications: clear yоur notifications
+      write:reports: report оther people
+      write:statuses: publish stаtuses
diff --git a/config/locales/doorkeeper.tr.yml b/config/locales/doorkeeper.tr.yml
new file mode 100644
index 0000000000..686a018e0a
--- /dev/null
+++ b/config/locales/doorkeeper.tr.yml
@@ -0,0 +1,19 @@
+---
+tr:
+  activerecord:
+    attributes:
+      doorkeeper/application:
+        name: Uygulama adı
+        website: Uygulama web sitesi
+  doorkeeper:
+    applications:
+      buttons:
+        authorize: Yetki ver
+        cancel: Ä°ptal et
+        destroy: Yok et
+        edit: Düzenle
+        submit: Gönder
+      confirmations:
+        destroy: Emin misiniz?
+      edit:
+        title: Uygulamayı düzenle
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 95a72571d3..f3038e3d09 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -588,6 +588,10 @@ el:
     lists: Λίστες
     mutes: Αποσιωπάς
     storage: Αποθήκευση πολυμέσων
+  featured_tags:
+    add_new: Προσθήκη νέας
+    errors:
+      limit: Έχεις ήδη προσθέσει το μέγιστο αριθμό ταμπελών
   filters:
     contexts:
       home: Αρχική ροή
@@ -628,10 +632,16 @@ el:
       one: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε το παρακάτω σφάλμα
       other: Κάτι δεν είναι εντάξει ακόμα! Για κοίταξε τα παρακάτω %{count} σφάλματα
   imports:
+    modes:
+      merge: Συγχώνευση
+      merge_long: Διατήρηση των εγγράφων που υπάρχουν και προσθηκη των νέων
+      overwrite: Αντικατάσταση
+      overwrite_long: Αντικατάσταση των υπαρχόντων εγγράφων με τις καινούργιες
     preface: Μπορείς να εισάγεις τα δεδομένα που έχεις εξάγει από άλλο κόμβο, όπως τη λίστα των ανθρώπων που ακολουθείς ή μπλοκάρεις.
     success: Τα δεδομένα σου μεταφορτώθηκαν επιτυχώς και θα επεξεργαστούν εν καιρώ
     types:
       blocking: Λίστα αποκλεισμού
+      domain_blocking: Λίστα αποκλεισμένων τομέων
       following: Λίστα ακολούθων
       muting: Λίστα αποσιωπήσεων
     upload: Ανέβασμα
@@ -733,7 +743,7 @@ el:
     no_account_html: Δεν έχεις λογαριασμό; Μπορείς <a href='%{sign_up_path}' target='_blank'>να γραφτείς εδώ</a>
     proceed: Συνέχισε για να ακολουθήσεις
     prompt: 'Ετοιμάζεσαι να ακολουθήσεις:'
-    reason_html: "<strong>Γιατί χρειάζεται αυτό το βήμα;</strong> Το <code>%{instance}</code> πορεία να μην είναι ο κόμβος που είσαι γραμμένος, έτσι πρέπει να σε ανακατευθύνουμε στο δικό σου."
+    reason_html: "<strong>Γιατί χρειάζεται αυτό το βήμα;</strong> Το <code>%{instance}</code> μπορεί να μην είναι ο κόμβος που έχεις γραφτεί, έτσι πρέπει να σε ανακατευθύνουμε στο δικό σου."
   remote_interaction:
     favourite:
       proceed: Συνέχισε για σημείωση ως αγαπημένου
@@ -800,6 +810,7 @@ el:
     development: Ανάπτυξη
     edit_profile: Επεξεργασία προφίλ
     export: Εξαγωγή δεδομένων
+    featured_tags: Χαρακτηριστικές ταμπέλες
     followers: Εγκεκριμένοι ακόλουθοι
     import: Εισαγωγή
     migrate: Μετακόμιση λογαριασμού
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 84fbbbaf70..f8eb18279e 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -7,7 +7,7 @@ eu:
     administered_by: 'Administratzailea(k):'
     api: APIa
     apps: Aplikazio mugikorrak
-    closed_registrations: Harpidetza itxita dago orain instantzia honetan. Hala ere, beste instantzia bat aurkitu dezakezu kontua egiteko eta hona ere sarbidea izan.
+    closed_registrations: Harpidetza itxita dago orain zerbitzari honetan. Hala ere, beste zerbitzari bat aurkitu dezakezu kontua egiteko eta hona ere sarbidea izan.
     contact: Kontaktua
     contact_missing: Ezarri gabe
     contact_unavailable: E/E
@@ -27,7 +27,7 @@ eu:
     generic_description: "%{domain} sareko zerbitzari bat da"
     hosted_on: Mastodon %{domain} domeinuan ostatatua
     learn_more: Ikasi gehiago
-    other_instances: Instantzien zerrenda
+    other_instances: Zerbitzarien zerrenda
     privacy_policy: Pribatutasun politika
     source_code: Iturburu kodea
     status_count_after:
@@ -386,14 +386,14 @@ eu:
         desc_html: Aldatu itxura orri bakoitzean kargatutako CSS bidez
         title: CSS pertsonala
       hero:
-        desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, instantziaren irudia hartuko du
+        desc_html: Azaleko orrian bistaratua. Gutxienez 600x100px aholkatzen da. Ezartzen ez bada, zerbitzariaren irudia hartuko du
         title: Azaleko irudia
       mascot:
         desc_html: Hainbat orritan bistaratua. Gutxienez 293x205px aholkatzen da. Ezarri ezean lehenetsitako maskota erakutsiko da
         title: Maskotaren irudia
       peers_api_enabled:
-        desc_html: Instantzia honek fedibertsuan aurkitutako domeinu-izenak
-        title: Argitaratu aurkitutako instantzien zerrenda
+        desc_html: Zerbitzari honek fedibertsoan aurkitutako domeinu-izenak
+        title: Argitaratu aurkitutako zerbitzarien zerrenda
       preview_sensitive_media:
         desc_html: Beste webguneetako esteken aurrebistak iruditxoa izango du multimedia hunkigarri gisa markatzen bada ere
         title: Erakutsi multimedia hunkigarria OpenGraph aurrebistetan
@@ -421,20 +421,20 @@ eu:
         title: Erakutsi langile banda
       site_description:
         desc_html: Azaleko orrian agertuko den sarrera paragrafoa. Azaldu zerk egiten duen berezi Mastodon zerbitzari hau eta garrantzizko beste edozer. HTML etiketak erabili ditzakezu, zehazki <code>&lt;a&gt;</code> eta <code>&lt;em&gt;</code>.
-        title: Instantziaren deskripzioa
+        title: Zerbitzariaren deskripzioa
       site_description_extended:
-        desc_html: Zure jokabide-koderako  toki on bat, arauak, gidalerroak eta zure instantzia desberdin egiten duten bestelakoak. HTML etiketak erabili ditzakezu
+        desc_html: Zure jokabide-koderako  toki on bat, arauak, gidalerroak eta zure zerbitzari desberdin egiten duten bestelakoak. HTML etiketak erabili ditzakezu
         title: Informazio hedatu pertsonalizatua
       site_short_description:
         desc_html: Albo-barra eta meta etiketetan bistaratua. Deskribatu zerk egiten duen Mastodon zerbitzari hau berezia paragrafo batean. Hutsik lagatzekotan lehenetsitako deskripzioa agertuko da.
-        title: Instantziaren deskripzio laburra
+        title: Zerbitzariaren deskripzio laburra
       site_terms:
         desc_html: Zure pribatutasun politika, erabilera baldintzak eta bestelako testu legalak idatzi ditzakezu. HTML etiketak erabili ditzakezu
         title: Erabilera baldintza pertsonalizatuak
-      site_title: Instantziaren izena
+      site_title: Zerbitzariaren izena
       thumbnail:
         desc_html: Aurrebistetarako erabilia OpenGraph eta API bidez. 1200x630px aholkatzen da
-        title: Instantziaren iruditxoa
+        title: Zerbitzariaren iruditxoa
       timeline_preview:
         desc_html: Bistaratu denbora-lerro publikoa hasiera orrian
         title: Denbora-lerroaren aurrebista
@@ -495,7 +495,7 @@ eu:
     warning: Kontuz datu hauekin, ez partekatu inoiz inorekin!
     your_token: Zure sarbide token-a
   auth:
-    agreement_html: '"Izena eman" botoia sakatzean <a href="%{rules_path}">instantziaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu.'
+    agreement_html: '"Izena eman" botoia sakatzean <a href="%{rules_path}">zerbitzariaren arauak</a> eta <a href="%{terms_path}">erabilera baldintzak</a> onartzen dituzu.'
     change_password: Pasahitza
     confirm_email: Berretsi e-mail helbidea
     delete_account: Ezabatu kontua
@@ -549,7 +549,7 @@ eu:
     description_html: Honek <strong>behin betirako eta atzera egiteko aukera gabe</strong> zure kontuko edukia kendu eta hau desaktibatuko du. Zure erabiltzaile-izena erreserbatuko da etorkizunean inork zure itxurak ez egiteko.
     proceed: Ezabatu kontua
     success_msg: Zure kontua ongi ezabatu da
-    warning_html: Instantzia honetako edukiak ezabatzea besterik ezin da bermatu. Asko partekatu den edukiaren arrastoak geratzea izan liteke. Deskonektatuta dauden zerbitzariak edo zure eguneraketetatik harpidetza kendu duten zerbitzariek ez dituzte beraien datu-baseak eguneratuko.
+    warning_html: Zerbitzari honetako edukiak ezabatzea besterik ezin da bermatu. Asko partekatu den edukiaren arrastoak geratzea izan liteke. Deskonektatuta dauden zerbitzariak edo zure eguneraketetatik harpidetza kendu duten zerbitzariek ez dituzte beraien datu-baseak eguneratuko.
     warning_title: Sakabanatutako edukiaren eskuragarritasuna
   directories:
     directory: Profilen direktorioa
@@ -563,8 +563,8 @@ eu:
       other: "%{count} pertsona"
   errors:
     '403': Ez duzu orri hau ikusteko baimenik.
-    '404': Bilatu duzun orria ez da existitzen.
-    '410': Bilatu duzun orria ez da existitzen jada.
+    '404': Bilatu duzun orria ez dago hemen.
+    '410': Bilatu duzun orria ez dago hemen jada.
     '422':
       content: Segurtasun egiaztaketak huts egin du. Cookie-ak blokeatzen dituzu?
       title: Segurtasun egiaztaketak huts egin du
@@ -588,6 +588,10 @@ eu:
     lists: Zerrendak
     mutes: Zuk mututukoak
     storage: Multimedia biltegiratzea
+  featured_tags:
+    add_new: Gehitu berria
+    errors:
+      limit: Gehienezko traola kopurua nabarmendu duzu jada
   filters:
     contexts:
       home: Hasierako denbora-lerroa
@@ -606,7 +610,7 @@ eu:
       title: Gehitu iragazki berria
   followers:
     domain: Domeinua
-    explanation_html: Zure mezuen pribatutasuna bermatu nahi baduzu, nork jarraitzen zaituen jakin behar duzu. <strong>Zure mezu pribatuak zure jarraitzaileak dituzten instantzia guztietara bidaltzen dira</strong>.  Instantzia bateko langileek edo softwareak zure pribatutasunari dagokion begirunea ez dutela izango uste baduzu, berrikusi eta kendu jarraitzaileak.
+    explanation_html: Zure mezuen pribatutasuna bermatu nahi baduzu, nork jarraitzen zaituen jakin behar duzu. <strong>Zure mezu pribatuak zure jarraitzaileak dituzten zerbitzari guztietara bidaltzen dira</strong>.  Zerbitzari bateko langileek edo softwareak zure pribatutasunari dagokion begirunea ez dutela izango uste baduzu, berrikusi eta kendu jarraitzaileak.
     followers_count: Jarraitzaile kopurua
     lock_link: Giltzapetu zure kontua
     purge: Kendu jarraitzaileetatik
@@ -628,10 +632,16 @@ eu:
       one: Zerbait ez dabil ongi! Egiaztatu beheko errorea mesedez
       other: Zerbait ez dabil ongi! Egiaztatu beheko %{count}  erroreak mesedez
   imports:
-    preface: Beste instantzia bateko datuak inportatu ditzakezu, esaterako jarraitzen duzun edo blokeatu duzun jendearen zerrenda.
+    modes:
+      merge: Bateratu
+      merge_long: Mantendu dauden erregistroak eta gehitu berriak
+      overwrite: Gainidatzi
+      overwrite_long: Ordeztu oraingo erregistroak berriekin
+    preface: Beste zerbitzari bateko datuak inportatu ditzakezu, esaterako jarraitzen duzun edo blokeatu duzun jendearen zerrenda.
     success: Zure datuak ongi igo dira eta dagokionean prozesatuko dira
     types:
       blocking: Blokeatutakoen zerrenda
+      domain_blocking: Domeinuen blokeo zerrenda
       following: Jarraitutakoen zerrenda
       muting: Mutututakoen zerrenda
     upload: Igo
@@ -653,7 +663,7 @@ eu:
       one: Erabilera 1
       other: "%{count} erabilera"
     max_uses_prompt: Mugagabea
-    prompt: Sortu eta partekatu estekak instantzia onetara sarbidea emateko
+    prompt: Sortu eta partekatu estekak zerbitzari honetara sarbidea emateko
     table:
       expires_at: Iraungitzea
       uses: Erabilerak
@@ -801,6 +811,7 @@ eu:
     development: Garapena
     edit_profile: Aldatu profila
     export: Datuen esportazioa
+    featured_tags: Nabarmendutako traolak
     followers: Baimendutako jarraitzaileak
     import: Inportazioa
     migrate: Kontuaren migrazioa
@@ -929,9 +940,9 @@ eu:
       <p>Jatorrian <a href="https://github.com/discourse/discourse">Discourse sarearen pribatutasun politikatik</a> moldatua.</p>
     title: "%{instance} instantziaren erabilera baldintzak eta pribatutasun politika"
   themes:
-    contrast: Kontraste altua
-    default: Mastodon
-    mastodon-light: Mastodon (argia)
+    contrast: Mastodon (Kontraste altua)
+    default: Mastodon (Iluna)
+    mastodon-light: Mastodon (Argia)
   time:
     formats:
       default: "%Y(e)ko %b %d, %H:%M"
@@ -980,7 +991,7 @@ eu:
       final_action: Hasi mezuak bidaltzen
       final_step: 'Hasi argitaratzen! Jarraitzailerik ez baduzu ere zure mezu publikoak besteek ikusi ditzakete, esaterako denbora-lerro lokalean eta traoletan. Zure burua aurkeztu nahi baduzu #aurkezpenak traola erabili zenezake.'
       full_handle: Zure erabiltzaile-izen osoa
-      full_handle_hint: Hau da lagunei esango zeniekeena beste instantzia batetik zu jarraitzeko edo zuri mezuak bidaltzeko.
+      full_handle_hint: Hau da lagunei esango zeniekeena beste zerbitzari batetik zu jarraitzeko edo zuri mezuak bidaltzeko.
       review_preferences_action: Aldatu hobespenak
       review_preferences_step: Ziurtatu hobespenak ezartzen dituzula, jaso nahi dituzu e-mail mezuak, lehenetsitako pribatutasuna mezu berrietarako. Mareatzen ez bazaitu GIF-ak automatikoki abiatzea ezarri dezakezu ere.
       subject: Ongi etorri Mastodon-era
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index e7dd86025f..fd551d1b6a 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -48,6 +48,7 @@ fa:
       other: پیگیر
     following: پی می‌گیرد
     joined: کاربر از %{date}
+    last_active: آخرین فعالیت
     link_verified_on: مالکیت این نشانی در تاریخ %{date} بررسی شد
     media: عکس و ویدیو
     moved_html: "%{name} حساب خود را به %{new_profile_link} منتقل کرده است:"
@@ -69,6 +70,9 @@ fa:
       moderator: ناظم
     unfollow: پایان پیگیری
   admin:
+    account_actions:
+      action: انجام تغییر
+      title: انجام تغییر مدیریتی روی %{acct}
     account_moderation_notes:
       create: افزودن یادداشت
       created_msg: یادداشت مدیر با موفقیت ساخته شد!
@@ -88,6 +92,7 @@ fa:
       confirm: تأیید
       confirmed: تأیید شد
       confirming: تأیید
+      deleted: پاک‌شده
       demote: تنزل‌دادن
       disable: غیرفعال
       disable_two_factor_authentication: غیرفعال‌سازی ورود دومرحله‌ای
@@ -103,8 +108,11 @@ fa:
       followers: پیگیران
       followers_url: نشانی پیگیران
       follows: پی می‌گیرد
+      header: زمینه
       inbox_url: نشانی صندوق ورودی
+      invited_by: دعوت‌شده از طرف
       ip: IP
+      joined: عضویت از
       location:
         all: همه
         local: محلی
@@ -114,6 +122,7 @@ fa:
       media_attachments: ضمیمه‌های تصویری
       memorialize: تبدیل به یادمان
       moderation:
+        active: فعال
         all: همه
         silenced: بی‌صدا شده
         suspended: معلق شده
@@ -130,8 +139,9 @@ fa:
       protocol: پروتکل
       public: عمومی
       push_subscription_expires: عضویت از راه PuSH منقضی شد
-      redownload: به‌روزرسانی تصویر نمایه
+      redownload: به‌روزرسانی نمایه
       remove_avatar: حذف تصویر نمایه
+      remove_header: برداشتن تصویر زمینه
       resend_confirmation:
         already_confirmed: این کاربر قبلا تایید شده است
         send: ایمیل تایید را دوباره بفرستید
@@ -149,8 +159,8 @@ fa:
       search: جستجو
       shared_inbox_url: نشانی صندوق ورودی مشترک
       show:
-        created_reports: گزارش‌ها از طرف این حساب
-        targeted_reports: گزارش‌ها دربارهٔ این حساب
+        created_reports: گزارش‌های ثبت کرده
+        targeted_reports: گزارش‌های دیگران
       silence: بی‌صدا
       silenced: بی‌صداشده
       statuses: نوشته‌ها
@@ -162,12 +172,14 @@ fa:
       undo_suspension: واگردانی تعلیق
       unsubscribe: لغو اشتراک
       username: نام کاربری
+      warn: هشدار
       web: وب
     action_logs:
       actions:
         assigned_to_self_report: "%{name} رسیدگی به گزارش %{target} را به عهده گرفت"
         change_email_user: "%{name} نشانی ایمیل کاربر %{target} را تغییر داد"
         confirm_user: "%{name} نشانی ایمیل کاربر %{target} را تأیید کرد"
+        create_account_warning: "%{name} هشداری برای %{target} فرستاد"
         create_custom_emoji: "%{name} شکلک تازهٔ %{target} را بارگذاشت"
         create_domain_block: "%{name} دامین %{target} را مسدود کرد"
         create_email_domain_block: "%{name} دامین ایمیل %{target} را مسدود کرد"
@@ -226,6 +238,7 @@ fa:
       config: پیکربندی
       feature_deletions: حساب‌های حذف‌شده
       feature_invites: دعوت‌نامه‌ها
+      feature_profile_directory: فهرست گزیدهٔ کاربران
       feature_registrations: ثبت‌نام‌ها
       feature_relay: رله
       features: ویژگی‌ها
@@ -243,7 +256,7 @@ fa:
       week_users_active: کاربران فعال هفتهٔ اخیر
       week_users_new: کاربران هفتهٔ اخیر
     domain_blocks:
-      add_new: افزودن تازه
+      add_new: افزودن مسدودسازی دامین تازه
       created_msg: مسدودکردن دامین در حال انجام است
       destroyed_msg: مسدودکردن دامین واگردانده شد
       domain: دامین
@@ -260,6 +273,11 @@ fa:
       reject_media_hint: تصویرهای ذخیره‌شده در این‌جا را پاک می‌کند و جلوی دریافت تصویرها را در آینده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها
       reject_reports: نپذیرفتن گزارش‌ها
       reject_reports_hint: گزارش‌هایی را که از این دامین می‌آید نادیده می‌گیرد. بی‌تأثیر برای معلق‌شده‌ها
+      rejecting_media: رسانه‌ها نادیده گرفته می‌شوند
+      rejecting_reports: گزارش‌ها نادیده گرفته می‌شوند
+      severity:
+        silence: بی‌صداشده
+        suspend: معلق‌شده
       show:
         affected_accounts:
           one: روی یک حساب در پایگاه داده تأثیر گذاشت
@@ -269,7 +287,7 @@ fa:
           suspend: معلق‌شدن همهٔ حساب‌های این دامین را لغو کن
         title: واگردانی مسدودسازی دامنه برای %{domain}
         undo: واگردانی
-      undo: واگردانی
+      undo: واگردانی مسدودسازی دامین
     email_domain_blocks:
       add_new: افزودن تازه
       created_msg: مسدودسازی دامین ایمیل با موفقیت ساخته شد
@@ -280,8 +298,24 @@ fa:
         create: ساختن مسدودسازی
         title: مسدودسازی دامین ایمیل تازه
       title: مسدودسازی دامین‌های ایمیل
+    followers:
+      back_to_account: بازگشت به حساب
+      title: پیگیران %{acct}
     instances:
-      title: سرورهای شناخته‌شده
+      delivery_available: پیام آماده است
+      known_accounts:
+        one: "%{count} حساب شناخته‌شده"
+        other: "%{count} حساب شناخته‌شده"
+      moderation:
+        all: همه
+        limited: محدود
+        title: مدیریت
+      title: ارتباط میان‌سروری
+      total_blocked_by_us: مسدودشده از طرف ما
+      total_followed_by_them: ما را پی می‌گیرند
+      total_followed_by_us: ما پیگیرشان هستیم
+      total_reported: گزارش درباره‌شان
+      total_storage: عکس‌ها و ویدیوها
     invites:
       deactivate_all: غیرفعال‌کردن همه
       filter:
@@ -363,6 +397,9 @@ fa:
       preview_sensitive_media:
         desc_html: پیوند به سایت‌های دیگر پیش‌نمایشی خواهد داشت که یک تصویر کوچک را نشان می‌دهد، حتی اگر نوشته به عنوان حساس علامت‌گذاری شده باشد
         title: نمایش تصاویر حساسیت‌برانگیز در پیش‌نمایش‌های OpenGraph
+      profile_directory:
+        desc_html: به کاربران اجازه دهید تا بتوانند خود را روی فهرست گزیدهٔ کاربران این سرور نمایش دهند
+        title: فعال‌سازی فهرست گزیدهٔ کاربران
       registrations:
         closed_message:
           desc_html: وقتی امکان ثبت نام روی سرور فعال نباشد در صفحهٔ اصلی نمایش می‌یابد<br>می‌توانید HTML بنویسید
@@ -384,20 +421,20 @@ fa:
         title: نمایش علامت همکار
       site_description:
         desc_html: معرفی کوتاهی که روی صفحهٔ اصلی نمایش می‌یابد. دربارهٔ این که چه چیزی دربارهٔ این سرور ماستدون ویژه است یا هر چیز مهم دیگری بنویسید. می‌توانید HTML بنویسید، به‌ویژه <code>&lt;a&gt;</code> و <code>&lt;em&gt;</code>.
-        title: دربارهٔ سایت
+        title: دربارهٔ این سرور
       site_description_extended:
         desc_html: جای خوبی برای نوشتن سیاست‌های کاربری، قانون‌ها، راهنماها، و هر چیزی که ویژهٔ این سرور است. تگ‌های HTML هم مجاز است
         title: اطلاعات تکمیلی سفارشی
       site_short_description:
         desc_html: روی نوار کناری و همچنین به عنوان فرادادهٔ صفحه‌ها نمایش می‌یابد. در یک بند توضیح دهید که ماستدون چیست و چرا این سرور با بقیه فرق دارد. اگر خالی بگذارید، به جایش «دربارهٔ سایت» نمایش می‌یابد.
-        title: توضیح کوتاه دربارهٔ سایت
+        title: توضیح کوتاه دربارهٔ سرور
       site_terms:
         desc_html: می‌توانید سیاست رازداری، شرایط استفاده، یا سایر مسائل قانونی را به دلخواه خود بنویسید. تگ‌های HTML هم مجاز است
         title: شرایط استفادهٔ سفارشی
       site_title: نام سرور
       thumbnail:
         desc_html: برای دیدن با OpenGraph و رابط برنامه‌نویسی. وضوح پیشنهادی ۱۲۰۰×۶۳۰ پیکسل
-        title: تصویر کوچک فوری
+        title: تصویر کوچک سرور
       timeline_preview:
         desc_html: نوشته‌های عمومی این سرور را در صفحهٔ آغازین نشان دهید
         title: پیش‌نمایش نوشته‌ها
@@ -422,7 +459,21 @@ fa:
       last_delivery: آخرین ارسال
       title: WebSub
       topic: موضوع
+    tags:
+      accounts: حساب‌ها
+      hidden: پنهان‌شده
+      hide: در فهرست گزیدهٔ کاربران نشان نده
+      name: برچسب
+      title: برچسب‌ها
+      unhide: نمایش در فهرست گزیدهٔ کاربران
+      visible: نمایان
     title: مدیریت سرور
+    warning_presets:
+      add_new: افزودن تازه
+      delete: زدودن
+      edit: ویرایش
+      edit_preset: ویرایش هشدار پیش‌فرض
+      title: مدیریت هشدارهای پیش‌فرض
   admin_mailer:
     new_report:
       body: کاربر %{reporter} کاربر %{target} را گزارش داد
@@ -500,10 +551,20 @@ fa:
     success_msg: حساب شما با موفقیت پاک شد
     warning_html: تنها پاک‌شدن محتوای حساب در این سرور خاص تضمین می‌شود. محتوایی که به گستردگی هم‌رسانی شده باشد ممکن است ردش همچنان باقی بماند. سرورهای آفلاین یا سرورهایی که دیگر مشترک شما نیستند پایگاه‌های دادهٔ خود را به‌روز نخواهند کرد.
     warning_title: دسترس‌پذیری محتوای هم‌رسان‌شده
+  directories:
+    directory: فهرست گزیدهٔ کاربران
+    enabled: شما هم‌اینک در فهرست گزیدهٔ کاربران نمایش می‌یابید.
+    enabled_but_waiting: شما می‌خواهید در فهرست گزیدهٔ کاربران این سرور باشید، ولی تعداد پیگیران شما هنوز به مقدار لازم (%{min_followers}) نرسیده است.
+    explanation: کاربران این سرور را بر اساس علاقه‌مندی‌هایشان پیدا کنید
+    explore_mastodon: گشت و گذار در %{title}
+    how_to_enable: شما هنوز در فهرست گزیدهٔ کاربران این سرور نشان داده نمی‌شوید. این‌جا می‌توانید انتخابش کنید. اگر در بخش معرفی خود در نمایه‌تان برچسب (هشتگ) داشته باشد، نام شما هم برای آن هشتگ‌ها فهرست می‌شود!
+    people:
+      one: "%{count} نفر"
+      other: "%{count} نفر"
   errors:
     '403': شما اجازهٔ دیدن این صفحه را ندارید.
-    '404': صفحه‌ای که به دنبالش بودید وجود ندارد.
-    '410': صفحه‌ای که به دنبالش بودید دیگر وجود ندارد.
+    '404': صفحه‌ای که به دنبالش هستید این‌جا نیست.
+    '410': صفحه‌ای که به دنبالش بودید دیگر این‌جا وجود ندارد.
     '422':
       content: تأیید امنیتی انجام نشد. آیا مرورگر شما کوکی‌ها را مسدود می‌کند؟
       title: تأیید امنیتی کار نکرد
@@ -522,9 +583,15 @@ fa:
       size: اندازه
     blocks: حساب‌های مسدودشده
     csv: CSV
+    domain_blocks: دامین‌های مسدودشده
     follows: حساب‌های پی‌گرفته
+    lists: فهرست‌ها
     mutes: حساب‌های بی‌صداشده
     storage: تصویرهای ذخیره‌شده
+  featured_tags:
+    add_new: افزودن تازه
+    errors:
+      limit: شما بیشترین تعداد مجاز برچسب‌ها را دارید
   filters:
     contexts:
       home: خانه
@@ -565,10 +632,16 @@ fa:
       one: یک چیزی هنوز درست نیست! لطفاً خطاهای زیر را ببینید
       other: یک چیزی هنوز درست نیست! لطفاً %{count} خطای زیر را ببینید
   imports:
+    modes:
+      merge: ادغام
+      merge_long: داده‌های فعلی را داشته باشید و داده‌های تازه‌ای بیفزایید
+      overwrite: بازنویسی
+      overwrite_long: داده‌های فعلی را پاک کنید و داده‌های تازه‌ای بیفزایید
     preface: شما می‌توانید داده‌هایی از قبیل کاربرانی که پی می‌گرفتید یا مسدود می‌کردید را در حساب خود روی این سرور درون‌ریزی کنید. برای این کار پرونده‌هایی که از سرور دیگر برون‌سپاری کرده‌اید را به‌کار ببرید.
     success: داده‌های شما با موفقیت بارگذاری شد و به زودی پردازش می‌شود
     types:
       blocking: فهرست مسدودشده‌ها
+      domain_blocking: فهرست دامین‌های مسدودشده
       following: فهرست پی‌گیری‌ها
       muting: فهرست بی‌صداشده‌ها
     upload: بارگذاری
@@ -671,12 +744,27 @@ fa:
     no_account_html: هنوز عضو نیستید؟ <a href='%{sign_up_path}' target='_blank'>این‌جا می‌توانید حساب باز کنید</a>
     proceed: درخواست پیگیری
     prompt: 'شما قرار است این حساب را پیگیری کنید:'
+    reason_html: "<strong>چرا این مرحله لازم است؟</strong> ممکن است <code>%{instance}</code> سروری نباشد که شما روی آن حساب باز کرده‌اید، بنابراین ما باید پیش از هرچیز شما را به سرور خودتان منتقل کنیم."
+  remote_interaction:
+    favourite:
+      proceed: به سمت پسندیدن این بوق
+      prompt: 'شما می‌خواهید این بوق را بپسندید:'
+    reblog:
+      proceed: به سمت بازبوقیدن
+      prompt: 'شما می‌خواهید این بوق را بازببوقید:'
+    reply:
+      proceed: به سمت پاسخ‌دادن
+      prompt: 'شما می‌خواهید به این بوق پاسخ دهید:'
   remote_unfollow:
     error: خطا
     title: عنوان
     unfollowed: پایان پیگیری
+  scheduled_statuses:
+    over_daily_limit: شما از حد مجاز %{limit} بوق زمان‌بندی‌شده در آن روز فراتر رفته‌اید
+    over_total_limit: شما از حد مجاز %{limit} بوق زمان‌بندی‌شده فراتر رفته‌اید
+    too_soon: زمان تعیین‌شده باید در آینده باشد
   sessions:
-    activity: آخرین کنش
+    activity: آخرین فعالیت
     browser: مرورگر
     browsers:
       alipay: Alipay
@@ -723,6 +811,7 @@ fa:
     development: فرابری
     edit_profile: ویرایش نمایه
     export: برون‌سپاری داده‌ها
+    featured_tags: برچسب‌های منتخب
     followers: پیگیران مورد تأیید
     import: درون‌ریزی
     migrate: انتقال حساب
@@ -770,8 +859,8 @@ fa:
   terms:
     title: شرایط استفاده و سیاست رازداری %{instance}
   themes:
-    contrast: کنتراست بالا
-    default: ماستدون
+    contrast: ماستدون (کنتراست بالا)
+    default: ماستدون (تیره)
     mastodon-light: ماستدون (روشن)
   time:
     formats:
@@ -798,6 +887,22 @@ fa:
       explanation: شما یک نسخهٔ پشتیبان کامل از حساب خود را درخواست کردید. این پشتیبان الان آمادهٔ بارگیری است!
       subject: بایگانی شما آمادهٔ دریافت است
       title: گرفتن بایگانی
+    warning:
+      explanation:
+        disable: تا وقتی حساب شما متوقف باشد، داده‌های شما دست‌نخورده باقی می‌مانند، ولی تا وقتی که حسابتان باز نشده، نمی‌توانید هیچ کاری با آن بکنید.
+        silence: تا وقتی حساب شما محدود باشد، تنها کسانی که از قبل پیگیر شما بودند نوشته‌های شما در این سرور را می‌بینند و شما در فهرست‌های عمومی دیده نمی‌شوید. ولی دیگران همچنان می‌توانند به دلخواه خودشان پیگیر شما شوند.
+        suspend: حساب شما معلق شده است، و همهٔ نوشته‌ها و رسانه‌های تصویری شما به طور بازگشت‌ناپذیری پاک شده‌اند؛ چه از این سرور و چه از سرورهای دیگری که از آن‌ها پیگیر داشتید.
+      review_server_policies: مرور سیاست‌های این سرور
+      subject:
+        disable: حساب %{acct} شما متوقف شده است
+        none: هشدار برای %{acct}
+        silence: حساب %{acct} شما محدود شده است
+        suspend: حساب %{acct}  شما معلق شده است
+      title:
+        disable: حساب متوقف شده است
+        none: هشدار
+        silence: حساب محدود شده است
+        suspend: حساب معلق شده است
     welcome:
       edit_profile_action: تنظیم نمایه
       edit_profile_step: 'شما می‌توانید نمایهٔ خود را به دلخواه خود تغییر دهید: می‌توانید تصویر نمایه، تصویر پس‌زمینه، نام، و چیزهای دیگری را تعیین کنید. اگر بخواهید، می‌توانید حساب خود را خصوصی کنید تا فقط کسانی که شما اجازه می‌دهید بتوانند پیگیر حساب شما شوند.'
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index e7b8b18ae6..c3c48cbe31 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -5,10 +5,13 @@ fi:
     about_mastodon_html: Mastodon on sosiaalinen verkosto. Se on toteutettu avoimilla verkkoprotokollilla ja vapailla, avoimen lähdekoodin ohjelmistoilla, ja se toimii hajautetusti samaan tapaan kuin sähköposti.
     about_this: Tietoja tästä palvelimesta
     administered_by: 'Ylläpitäjä:'
+    api: API
+    apps: Mobiili sovellukset
     closed_registrations: Tähän instanssiin ei voi tällä hetkellä rekisteröityä. Voit kuitenkin luoda tilin johonkin toiseen instanssiin ja käyttää samaa verkostoa sitä kautta.
     contact: Ota yhteyttä
     contact_missing: Ei asetettu
     contact_unavailable: Ei saatavilla
+    documentation: Dokumentaatio
     extended_description_html: |
       <h3>Hyvä paikka säännöille</h3>
       <p>Pidempää kuvausta ei ole vielä laadittu.</p>
@@ -25,23 +28,40 @@ fi:
     hosted_on: Mastodon palvelimella %{domain}
     learn_more: Lisätietoja
     other_instances: Muut palvelimet
+    privacy_policy: Tietosuojaseloste
     source_code: Lähdekoodi
-    status_count_after: statusta
+    status_count_after:
+      one: tila
+      other: tilanne
     status_count_before: He ovat luoneet
-    user_count_after: käyttäjälle
+    terms: Käyttöehdot
+    user_count_after:
+      one: käyttäjä
+      other: käyttäjät
     user_count_before: Koti
     what_is_mastodon: Mikä on Mastodon?
   accounts:
+    choices_html: "%{name} valinnat:"
     follow: Seuraa
-    followers: Seuraajat
+    followers:
+      one: Seuraaja
+      other: Seuraajat
     following: Seuratut
+    joined: Liittynyt %{date}
+    last_active: viimeksi aktiivinen
+    link_verified_on: Tämän linkin omistus on tarkastettu %{date}
     media: Media
     moved_html: "%{name} on muuttanut osoitteeseen %{new_profile_link}:"
     network_hidden: Nämä tiedot eivät ole käytettävissä
     nothing_here: Täällä ei ole mitään!
     people_followed_by: Henkilöt, joita %{name} seuraa
     people_who_follow: Käyttäjän %{name} seuraajat
-    posts: Tuuttaukset
+    pin_errors:
+      following: Sinun täytyy seurata henkilöä jota haluat tukea
+    posts:
+      one: Toot
+      other: Toots
+    posts_tab_heading: Toots
     posts_with_replies: Tuuttaukset ja vastaukset
     reserved_username: Käyttäjänimi on varattu
     roles:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 7fa0418723..5c564fc047 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -92,7 +92,7 @@ fr:
       confirm: Confirmer
       confirmed: Confirmé
       confirming: Confirmation
-      deleted: Effacé
+      deleted: Supprimé
       demote: Rétrograder
       disable: Désactiver
       disable_two_factor_authentication: Désactiver l’authentification à deux facteurs
@@ -112,6 +112,7 @@ fr:
       inbox_url: URL d’entrée
       invited_by: Invité par
       ip: Adresse IP
+      joined: Inscrit·e depuis
       location:
         all: Tous
         local: Local
@@ -171,6 +172,7 @@ fr:
       undo_suspension: Annuler la suspension
       unsubscribe: Se désabonner
       username: Nom d’utilisateur⋅ice
+      warn: Avertissement
       web: Web
     action_logs:
       actions:
@@ -300,6 +302,7 @@ fr:
       back_to_account: Retour au compte
       title: Abonné⋅e⋅s de %{acct}
     instances:
+      delivery_available: Livraison disponible
       known_accounts:
         one: "%{count} compte connu"
         other: "%{count} comptes connus"
@@ -381,7 +384,7 @@ fr:
         username: Entrez un nom d’utilisateur⋅ice
       custom_css:
         desc_html: Modifier l'apparence avec une CSS chargée sur chaque page
-        title: CSS personnalisée
+        title: CSS personnalisé
       hero:
         desc_html: Affichée sur la page d’accueil. Au moins 600x100px recommandé. Lorsqu’elle n’est pas définie, se rabat sur la vignette de l’instance
         title: Image d’en-tête
@@ -418,17 +421,17 @@ fr:
         title: Montrer un badge de responsable
       site_description:
         desc_html: Paragraphe introductif sur la page d’accueil. Décrivez ce qui rend spécifique ce serveur Mastodon et toute autre chose importante. Vous pouvez utiliser des balises HTML, en particulier <code>&lt;a&gt;</code> et <code>&lt;em&gt;</code>.
-        title: Description du site
+        title: Description de l'instance
       site_description_extended:
-        desc_html: Affichée sur la page d’informations complémentaires du site<br>Vous pouvez utiliser des balises HTML
+        desc_html: L'endroit idéal pour afficher votre code de conduite, les règles, les guides et autres choses qui rendent votre instance différente. Vous pouvez utiliser des balises HTML
         title: Description étendue du site
       site_short_description:
-        desc_html: Affichée dans la barre latérale et dans les méta-tags. Décrivez ce qui rend spécifique ce serveur Mastodon en un seul paragraphe. Si laissée vide, la description de l’instance sera affiché par défaut.
+        desc_html: Affichée dans la barre latérale et dans les méta-tags. Décrivez ce qui rend spécifique cette instance Mastodon en un seul paragraphe. Si laissée vide, la description de l’instance sera affiché par défaut.
         title: Description courte de l’instance
       site_terms:
         desc_html: Affichée sur la page des conditions d’utilisation du site<br>Vous pouvez utiliser des balises HTML
         title: Politique de confidentialité
-      site_title: Titre du site
+      site_title: Nom de l'instance
       thumbnail:
         desc_html: Utilisée pour les prévisualisations via OpenGraph et l’API. 1200x630px recommandé
         title: Vignette de l’instance
@@ -546,7 +549,7 @@ fr:
     description_html: Cela va supprimer votre compte et le désactiver de manière <strong>permanente et irréversible</strong>. Votre nom d’utilisateur⋅ice restera réservé afin d’éviter la confusion.
     proceed: Supprimer compte
     success_msg: Votre compte a été supprimé avec succès
-    warning_html: Seule la suppression du contenu depuis cette instance est garantie. Le contenu qui a été partagé est susceptible de laisser des traces. Les serveurs hors-ligne ainsi que ceux n’étant plus abonnés à vos publications ne mettront pas leur base de données à jour.
+    warning_html: Seule la suppression du contenu depuis cette instance est garantie. Le contenu qui a été partagé est susceptible de laisser des traces. Les instances hors-ligne ainsi que ceux n’étant plus abonnées à vos publications ne mettront pas leur base de données à jour.
     warning_title: Disponibilité du contenu disséminé
   directories:
     directory: Annuaire des profils
@@ -574,7 +577,7 @@ fr:
     archive_takeout:
       date: Date
       download: Télécharger votre archive
-      hint_html: Vous pouvez demander une archive de vos  <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. Vous pouvez demander une archive tous les 7 jours.
+      hint_html: Vous pouvez demander une archive de vos <strong>pouets et médias téléversés</strong>. Les données exportées seront au format ActivityPub, lisible par tout logiciel compatible. Vous pouvez demander une archive tous les 7 jours.
       in_progress: Création de votre archive…
       request: Demandez vos archives
       size: Taille
@@ -585,6 +588,10 @@ fr:
     lists: Listes
     mutes: Vous masquez
     storage: Médias stockés
+  featured_tags:
+    add_new: Ajouter un nouvel hashtag
+    errors:
+      limit: Vous avez déjà mis en avant le nombre maximum de hashtags
   filters:
     contexts:
       home: Accueil
@@ -603,7 +610,7 @@ fr:
       title: Ajouter un nouveau filtre
   followers:
     domain: Domaine
-    explanation_html: Si vous voulez être sûr⋅e que vos statuts restent privés, vous devez savoir qui vous suit. <strong>Vos statuts privés seront diffusés à toutes les instances des utilisateur⋅ice⋅s qui vous suivent</strong>. Vous voudrez peut-être les passer en revue et les supprimer si vous n’êtes pas sûr⋅e que votre vie privée sera respectée par l’administration ou le logiciel de ces instances.
+    explanation_html: Si vous voulez vous assurer que vos statuts restent privés, vous devez savoir qui vous suit. <strong>Vos statuts privés seront diffusés sur toutes les instances où vous avez des abonné·e·s</strong>. Vous voudrez peut-être les passer en revue et les supprimer si vous pensez que votre vie privée ne sera pas respectée par l’administration ou le logiciel de ces instances.
     followers_count: Nombre d’abonné⋅e⋅s
     lock_link: Rendez votre compte privé
     purge: Retirer de la liste d’abonné⋅e⋅s
@@ -625,10 +632,16 @@ fr:
       one: Quelque chose ne va pas ! Vérifiez l’erreur ci-dessous
       other: Certaines choses ne vont pas ! Vérifiez les %{count} erreurs ci-dessous
   imports:
-    preface: Vous pouvez importer certaines données comme les personnes que vous suivez ou bloquez sur votre compte sur cette instance à partir de fichiers créés sur une autre instance.
+    modes:
+      merge: Fusionner
+      merge_long: Garder les enregistrements existants et ajouter les nouveaux
+      overwrite: Réécrire
+      overwrite_long: Remplacer les enregistrements actuels par les nouveaux
+    preface: Vous pouvez importer certaines données que vous avez exporté d'une autre instance, comme une liste des personnes que vous suivez ou bloquez sur votre compte.
     success: Vos données ont été importées avec succès et seront traitées en temps et en heure
     types:
       blocking: Liste d’utilisateur⋅ice⋅s bloqué⋅e⋅s
+      domain_blocking: Liste des instances bloquées
       following: Liste d’utilisateur⋅ice⋅s suivi⋅e⋅s
       muting: Liste d’utilisateur⋅ice⋅s que vous masquez
     upload: Importer
@@ -734,10 +747,13 @@ fr:
     reason_html: "<strong>Pourquoi cette étape est-elle nécessaire?</strong> <code>%{instance}</code> pourrait ne pas être le serveur où vous vous êtes inscrit, et nous devons donc vous rediriger vers votre serveur de base en premier."
   remote_interaction:
     favourite:
+      proceed: Confirmer l'ajout aux favoris
       prompt: 'Vous souhaitez mettre ce pouet en favori :'
     reblog:
+      proceed: Confirmer le repartage
       prompt: 'Vous souhaitez repartager ce pouet :'
     reply:
+      proceed: Confirmer la réponse
       prompt: 'Vous souhaitez répondre à ce pouet :'
   remote_unfollow:
     error: Erreur
@@ -795,6 +811,7 @@ fr:
     development: Développement
     edit_profile: Modifier le profil
     export: Export de données
+    featured_tags: Hashtags mis en avant
     followers: Abonné⋅es autorisé⋅es
     import: Import de données
     migrate: Migration de compte
@@ -923,9 +940,9 @@ fr:
       <p>Originellement adapté de la <a href="https://github.com/discourse/discourse">politique de confidentialité de Discourse</a>.</p>
     title: "%{instance} Conditions d’utilisation et politique de confidentialité"
   themes:
-    contrast: Contraste élevé
-    default: Mastodon
-    mastodon-light: Mastodon (clair)
+    contrast: Mastodon (Contraste élevé)
+    default: Mastodon (Sombre)
+    mastodon-light: Mastodon (Clair)
   time:
     formats:
       default: "%d %b %Y, %H:%M"
@@ -974,7 +991,7 @@ fr:
       final_action: Commencer à publier
       final_step: 'Commencez à poster ! Même sans abonné·e·s, vos messages publics peuvent être vus par d’autres, par exemple sur le fil public local et dans les hashtags. Vous pouvez vous présenter sur le hashtag #introductions.'
       full_handle: Votre identifiant complet
-      full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour qu’il·elle·s puissent vous envoyer un message ou vous suivre à partir d’une autre instance.
+      full_handle_hint: C’est ce que vous diriez à vos ami·e·s pour leur permettre de vous envoyer un message ou vous suivre à partir d’une autre instance.
       review_preferences_action: Modifier les préférences
       review_preferences_step: Assurez-vous de définir vos préférences, telles que les courriels que vous aimeriez recevoir ou le niveau de confidentialité auquel vous aimeriez que vos messages soient soumis par défaut. Si vous n’avez pas le mal des transports, vous pouvez choisir d’activer la lecture automatique des GIF.
       subject: Bienvenue sur Mastodon
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index 57e150d49c..cadb7cff65 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -7,7 +7,7 @@ gl:
     administered_by: 'Administrada por:'
     api: API
     apps: Apps móbiles
-    closed_registrations: O rexistro en esta instancia está pechado en este intre. Porén! Pode atopar unha instancia diferente para obter unha conta e ter acceso exactamente a misma rede desde alí.
+    closed_registrations: O rexistro en este servidor está pechado neste momento. Porén! Pode atopar un servidor diferente para obter unha conta e ter acceso exactamente a misma rede desde alí.
     contact: Contacto
     contact_missing: Non establecido
     contact_unavailable: N/A
@@ -27,7 +27,7 @@ gl:
     generic_description: "%{domain} é un servidor na rede"
     hosted_on: Mastodon aloxado en %{domain}
     learn_more: Coñeza máis
-    other_instances: Listado de instancias
+    other_instances: Lista de servidores
     privacy_policy: Política de intimidade
     source_code: Código fonte
     status_count_after:
@@ -386,14 +386,14 @@ gl:
         desc_html: Modificar o aspecto con CSS cargado en cada páxina
         title: CSS persoalizado
       hero:
-        desc_html: Mostrado na portada. Recoméndase 600x100px como mínimo. Si non se establece, mostrará a imaxe por omisión da instancia
+        desc_html: Mostrado na portada. Recoméndase 600x100px como mínimo. Se non se establece, mostrará a imaxe por omisión do servidor
         title: Imáxe Heróe
       mascot:
         desc_html: Mostrado en varias páxinas. Recoméndase 293x205 como mínimo. Se non se establece publícase a mascota por omisión
         title: Imaxe da mascota
       peers_api_enabled:
-        desc_html: Nome de dominio que esta instancia atopou no fediverso
-        title: Publicar lista de instancias descubertas
+        desc_html: Nomes de dominio que este servidor atopou no fediverso
+        title: Publicar lista de servidores descubertos
       preview_sensitive_media:
         desc_html: A vista previa de ligazóns de outros sitios web mostrará unha imaxe incluso si os medios están marcados como sensibles
         title: Mostrar medios sensibles con vista previa OpenGraph
@@ -421,20 +421,20 @@ gl:
         title: Mostrar insigna de membresía
       site_description:
         desc_html: Parágrafo de presentación na páxina principal. Describe o que fai especial a este servidor Mastodon e calquera outra ouca importante. Pode utilizar etiquetas HTML, en particular <code>&lt;a&gt;</code> e <code>&lt;em&gt;</code>.
-        title: Descrición da instancia
+        title: Descrición do servidor
       site_description_extended:
-        desc_html: Un bo lugar para o seu código de conducta, regras, guías e outras cousas que distingan a súa instancia. Pode utilizar etiquetas HTML
+        desc_html: Un bo lugar para o seu código de conducta, regras, guías e outras cousas que distingan ao seu servidor. Pode utilizar etiquetas HTML
         title: Información extendida da persoalización
       site_short_description:
-        desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición da instancia.
-        title: Descrición curta da instancia
+        desc_html: Mostrado na barra lateral e nas etiquetas meta. Describe o que é Mastodon e que fai especial a este servidor nun só parágrafo. Si está baldeiro, mostrará a descrición do servidor.
+        title: Descrición curta do servidor
       site_terms:
         desc_html: Pode escribir a súa propia política de intimidade, termos de servizo ou aclaracións legais. Pode utilizar etiquetas HTML
         title: Termos de servizo persoalizados
-      site_title: Nome da instancia
+      site_title: Nome do servidor
       thumbnail:
         desc_html: Utilizado para vistas previsas vía OpenGraph e API. Recoméndase 1200x630px
-        title: Icona da instancia
+        title: Icona do servidor
       timeline_preview:
         desc_html: Mostrar liña de tempo pública na páxina de inicio
         title: vista previa da liña temporal
@@ -495,7 +495,7 @@ gl:
     warning: Teña moito tino con estos datos. Nunca os comparta con ninguén!
     your_token: O seu testemuño de acceso
   auth:
-    agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas da instancia</a> e <a href="%{terms_path}">os termos do servizo</a>.
+    agreement_html: Ao pulsar "Rexistrar" vostede acorda seguir <a href="%{rules_path}">as normas do servidor</a> e <a href="%{terms_path}">os termos do servizo</a>.
     change_password: Contrasinal
     confirm_email: Confirmar correo-e
     delete_account: Eliminar conta
@@ -549,7 +549,7 @@ gl:
     description_html: Esto eliminará de xeito <strong>permanente e irreversible</strong> o contido da súa conta e será desactivada. O seu nome de usuaria permanecerá reservado para evitar futuras confusións de identidades.
     proceed: Eliminar conta
     success_msg: A súa conta eliminouse correctamente
-    warning_html: Só se garantiza a eliminación de contido de esta instancia. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos.
+    warning_html: Só se garantiza a eliminación de contido de este servidor. O contido que foi compartido con outras instancias é probable que deixe rastros. O servidores fora de liña e servidores que se desuscribiron das súas actualizacións non actualizarán as súas bases de datos.
     warning_title: Dispoñibilidade do contido espallado
   directories:
     directory: Directorio de perfil
@@ -563,8 +563,8 @@ gl:
       other: "%{count} persoas"
   errors:
     '403': Non ten permiso para ver esta páxina.
-    '404': A páxina que está a buscar non existe.
-    '410': A páxina que busca xa non existe.
+    '404': A páxina que está a buscar non está aquí.
+    '410': A páxina que estaba a buscar xa non existe.
     '422':
       content: Fallou a verificación de seguridade. Está bloqueando as cookies?
       title: Fallou a verficación de seguridade
@@ -577,7 +577,7 @@ gl:
     archive_takeout:
       date: Data
       download: Descargue o seu ficheiro
-      hint_html: Pode solicitar un ficheiro cos <strong>seus toots ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o cumpla. Pode solicitar un ficheiro cada 7 días.
+      hint_html: Pode solicitar un ficheiro cos <strong>seus toots e ficheiros de medios</strong>. Os datos estarán en formato ActivityPub e son compatibles con calquer software que o siga. Pode solicitar un ficheiro cada 7 días.
       in_progress: Xerando o seu ficheiro...
       request: Solicite o ficheiro
       size: Tamaño
@@ -588,6 +588,10 @@ gl:
     lists: Listas
     mutes: Acalou
     storage: Almacenamento de medios
+  featured_tags:
+    add_new: Engadir novo
+    errors:
+      limit: Xa acadou o número máximo de etiquetas
   filters:
     contexts:
       home: Liña temporal inicial
@@ -606,7 +610,7 @@ gl:
       title: Engadir novo filtro
   followers:
     domain: Dominio
-    explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. <strong>Os seus estados privados son enviados a todas as instancias onde ten seguidoras</strong>. Podería querer revisalas, e elminar seguidoras si non confía que a súa intimidade sexa respetada polos administradores ou o software de esa instancia.
+    explanation_html: Se quere asegurar a intimidade dos seus estados, debe ser consciente de quen a está a seguir. <strong>Os seus estados privados son enviados a todas os servidores onde ten seguidoras</strong>. Podería querer revisalas, e elminar seguidoras si non confía que a súa intimidade sexa respetada polos administradores ou o software de ese servidor.
     followers_count: Número de seguidoras
     lock_link: Bloquear a súa conta
     purge: Eliminar das seguidoras
@@ -628,10 +632,16 @@ gl:
       one: Algo non está ben de todo! Por favor revise abaixo o erro
       other: Algo aínda non está ben! Por favor revise os %{count} erros abaixo
   imports:
-    preface: Pode importar os datos que exportou de outra instancia, tales como a lista de usuarias que está a seguir ou bloquear.
+    modes:
+      merge: Fusionar
+      merge_long: Manter os rexistros actuais e engadir novos
+      overwrite: Sobreescribir
+      overwrite_long: Sustituír rexistros actuais cos novos
+    preface: Pode importar os datos que exportou de outro servidor, tales como a lista de usuarias que está a seguir ou bloquear.
     success: Os seus datos foron correctamente subidos e serán procesados ao momento
     types:
       blocking: Lista de bloqueo
+      domain_blocking: Lista de bloqueo de dominios
       following: Lista de seguimento
       muting: Lista de usuarias acaladas
     upload: Subir
@@ -653,7 +663,7 @@ gl:
       one: 1 uso
       other: "%{count} usos"
     max_uses_prompt: Sen límite
-    prompt: Xerar e compartir ligazóns con outras para permitir acceso a esta instancia
+    prompt: Xerar e compartir ligazóns con outras para permitir acceso a este servidor
     table:
       expires_at: Caduca
       uses: Usos
@@ -801,6 +811,7 @@ gl:
     development: Desenvolvemento
     edit_profile: Editar perfil
     export: Exportar datos
+    featured_tags: Etiquetas destacadas
     followers: Seguidoras autorizadas
     import: Importar
     migrate: Migrar conta
@@ -929,9 +940,9 @@ gl:
       <p>Adaptado do orixinal <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} Termos do Servizo e Política de Intimidade"
   themes:
-    contrast: Alto contraste
-    default: Mastodon
-    mastodon-light: Mastodon (claro)
+    contrast: Mastodon (Alto contraste)
+    default: Mastodon (Escuro)
+    mastodon-light: Mastodon (Claro)
   time:
     formats:
       default: "%d %b, %Y, %H:%M"
@@ -980,7 +991,7 @@ gl:
       final_action: Comece a publicar
       final_step: 'Publique! Incluso sin seguidoras as súas mensaxes serán vistas por outras, por exemplo na liña temporal local e nas etiquetas. Podería presentarse no #fediverso utilizando a etiqueta #introductions.'
       full_handle: O seu alcume completo
-      full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outra instancia.
+      full_handle_hint: Esto é o que lle dirá aos seus amigos para que poidan seguila ou enviarlle mensaxes desde outro servidor.
       review_preferences_action: Cambiar preferencias
       review_preferences_step: Lembre establecer as preferencias, tales como qué correos-e lle querería recibir, ou o nivel de intimidade por omisión para as súas mensaxes. Se non lle molestan as imaxes con movemento, pode escoller que os GIF se reproduzan automáticamente.
       subject: Benvida a Mastodon
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
new file mode 100644
index 0000000000..97a0626e63
--- /dev/null
+++ b/config/locales/kk.yml
@@ -0,0 +1,445 @@
+---
+kk:
+  about:
+    about_hashtag_html: Бұл жерде <strong>#%{hashtag}</strong> хэштегімен жинақталған жазбалар. Желіге тіркеліп, сіз де қосыла аласыз бұл ортаға.
+    about_mastodon_html: Mastodon - әлеуметтік желіге негізделген, тегін және веб протоколды, ашық кодты құрылым. Ол email сияқты орталықтандырылған.
+    about_this: Туралы
+    administered_by: 'Админ:'
+    api: API
+    apps: Мобиль қосымшалар
+    closed_registrations: Бұл серверде тіркелу уақытша тоқтатылған. Дегенмен, сіз басқа сервер арқылы тіркеліп, сол аккаунтыңызбен қолдана берсеңіз болады.
+    contact: Байланыс
+    contact_missing: Бапталмаған
+    contact_unavailable: Белгісіз
+    documentation: Құжаттама
+    extended_description_html: |
+      <h3>Ережелерге арналған жақсы орын</h3>
+      <p>Әлі ештеңе жазылмапты</p>
+    features:
+      humane_approach_body: Басқа желілердің сәтсіздіктерінен сабақ алып, Mastodon әлеуметтік медианы дұрыс пайдаланбаумен күресу үшін этикалық дизайнды таңдауға бағытталған.
+      humane_approach_title: Гуманистік көзқарас басым
+      not_a_product_body: Mastodon коммерциялық желі емес. Жарнама жоқ, деректерді өңдеу, қоршаулы бақтар да жоқ. Орталықтан басқару да жоқ.
+      not_a_product_title: Сіз тұлғасыз, тауар емес
+      real_conversation_body: 500 таңба арқылы мазмұнды пікір және қызық медиа қолданып, өз ойыңызды жеткізе аласыз.
+      real_conversation_title: Нақты әңгімелерге арналған
+      within_reach_body: Ыңғайлы API экожүйесі арқасында iOS, Android және басқа платформаларға арналған бірнеше қосымшалар арқылы достарыңызбен кез-келген жерде әңгіме құруға мүмкіндік береді.
+      within_reach_title: Әрқашан қол жетімді
+    generic_description: "%{domain} желідегі серверлердің бірі"
+    hosted_on: Mastodon орнатылған %{domain} доменінде
+    learn_more: Көбірек білу
+    other_instances: Серверлер тізімі
+    privacy_policy: Құпиялылық саясаты
+    source_code: Ашық коды
+    status_count_after:
+      one: жазба
+      other: жазба
+    status_count_before: Жазылғандар
+    terms: Қолдану шарттары
+    user_count_after:
+      one: қолданушы
+      other: қолданушы
+    user_count_before: Желіде
+    what_is_mastodon: Mastodon деген не?
+  accounts:
+    choices_html: "%{name} таңдаулары:"
+    follow: Жазылу
+    followers:
+      one: Оқырман
+      other: Оқырман
+    following: Жазылғандары
+    joined: Тіркелген күні %{date}
+    last_active: соңғы әрекеті
+    link_verified_on: Сілтеме меншігі расталған күн %{date}
+    media: Медиа
+    moved_html: "%{name} мына жерге көшті %{new_profile_link}:"
+    network_hidden: Бұл ақпарат қолжетімді емес
+    nothing_here: Бұл жерде ештеңе жоқ!
+    people_followed_by: "%{name} жазылған адамдар"
+    people_who_follow: "%{name} атты қолданушының оқырмандары"
+    pin_errors:
+      following: Оқығыңыз келген адамға жазылуыңыз керек
+    posts:
+      one: Жазба
+      other: Жазба
+    posts_tab_heading: Жазба
+    posts_with_replies: Жазбалар және жауаптар
+    reserved_username: Мұндай логин тіркелген
+    roles:
+      admin: Админ
+      bot: Бот
+      moderator: Мод
+    unfollow: Оқымау
+  admin:
+    account_actions:
+      action: Әрекетті орындаңыз
+      title: Модерация жасаңыз %{acct}
+    account_moderation_notes:
+      create: Жазба қалдырыңыз
+      created_msg: Модерация жазбасы қалдырылды!
+      delete: Өшіру
+      destroyed_msg: Модерация жазбасы өшірілді!
+    accounts:
+      are_you_sure: Шынымен бе?
+      avatar: Аватар
+      by_domain: Домен
+      change_email:
+        changed_msg: Аккаунт email-і сәтті өзгертілді!
+        current_email: Қазіргі email
+        label: email өзгерту
+        new_email: Жаңа email
+        submit: email өзгерт
+        title: Қолданушы email-ін өзгерту %{username}
+      confirm: Құптау
+      confirmed: Құпталды
+      confirming: Құпталуды күтеді
+      deleted: Өшірілді
+      demote: Төмендету
+      disable: Ажырату
+      disable_two_factor_authentication: Ажырату 2FA
+      disabled: Ажыратылды
+      display_name: Атын көрсет
+      domain: Домен
+      edit: Түзету
+      email: Email
+      email_status: Email статусы
+      enable: Қосу
+      enabled: Қосылды
+      followers: Оқырмандар
+      followers_url: Оқырмандар URL
+      follows: Жазылғандары
+      header: Басы
+      inbox_url: Келген хаттар URL
+      invited_by: Шақырған
+      ip: IP
+      joined: Қосылды
+      location:
+        all: Барлығы
+        local: Жергілікті
+        remote: Алыс
+        title: Мекен
+      login_status: Логин статусы
+      media_attachments: Медиа файлдар
+      memorialize: Естелік қылу
+      moderation:
+        active: Актив
+        all: Барлығы
+        silenced: Үнсіз
+        suspended: Тоқтатылды
+        title: Модерация
+      moderation_notes: Модерация жазбалары
+      most_recent_activity: Соңғы белсенділіктер
+      most_recent_ip: Соңғы ІР
+      no_limits_imposed: Шектеу жоқ
+      not_subscribed: Жазылмаған
+      outbox_url: Кеткен хаттар URL
+      perform_full_suspension: Тоқтат
+      profile_url: Профиль URL
+      promote: Жарнамалау
+      protocol: Хаттама
+      public: Ашық
+      push_subscription_expires: PuSH жазылу мерзімі аяқталады
+      redownload: Профиль жаңарт
+      remove_avatar: Аватар өшіру
+      remove_header: Мұқаба суретін өшір
+      resend_confirmation:
+        already_confirmed: Қолданушы құпталған
+        send: Құптау хатын қайтадан жібер
+        success: Құптау хаты сәтті жіберілді!
+      reset: Қалпына келтіру
+      reset_password: Құпиясөзді қалпына келтіру
+      role: Қайта жазылу
+      roles:
+        admin: Админ
+        moderator: Модератор
+        staff: Қызметкерлер
+        user: Қолданушы
+      salmon_url: Ақсерке URL
+      search: Іздеу
+      shared_inbox_url: Бөлісілген инбокс URL
+      show:
+        created_reports: Шағымдар жинағы
+        targeted_reports: Жіберілген шағымдар
+      silence: Үнсіз
+      silenced: Үнсіз қылғандар
+      statuses: Статустар
+      subscribe: Жазылу
+      suspended: Тоқтатылды
+      title: Аккаунттар
+      unconfirmed_email: Құпталмаған email
+      undo_silenced: Үнсіздікті қайтып алу
+      undo_suspension: Тоқтатуды қайтып алу
+      unsubscribe: Жазылмау
+      username: Логин
+      warn: Ескерту
+      web: Веб
+    action_logs:
+      actions:
+        assigned_to_self_report: "%{name} шағым тастады %{target} өздері үшін"
+        change_email_user: "%{name} e-mail адресін өзгертті - %{target}"
+        confirm_user: "%{name} e-mail адресін құптады - %{target}"
+        create_account_warning: "%{name} ескерту жіберді - %{target}"
+        create_custom_emoji: "%{name} жаңа эмодзи қосты %{target}"
+        create_domain_block: "%{name} домен бұғаттады - %{target}"
+        create_email_domain_block: "%{name} e-mail доменін қара тізімге қосты - %{target}"
+        demote_user: "%{name} төмендетілген қолданушы - %{target}"
+        destroy_custom_emoji: "%{name} эмодзи жойды %{target}"
+        destroy_domain_block: "%{name} бұғатталмаған домен %{target}"
+        destroy_email_domain_block: "%{name} e-mail доменін ақ тізімге кіргізді %{target}"
+        destroy_status: "%{name} жазбасын өшірді %{target}"
+        disable_2fa_user: "%{name} қолданушы үшін екі фактор ажыратылған %{target}"
+        disable_custom_emoji: "%{name} эмодзи алып тастады %{target}"
+        disable_user: "%{name} қосылмаған логин %{target}"
+        enable_custom_emoji: "%{name} қосылған эмодзи %{target}"
+        enable_user: "%{name} қосылған логин %{target}"
+        memorialize_account: "%{name} %{target} аккаунтын естеліктеріне қосты"
+        promote_user: "%{name} жарнамалады %{target}"
+        remove_avatar_user: "%{name} %{target} аватарын өшірді"
+        reopen_report: "%{name} %{target} шағымын қайта қарады"
+        reset_password_user: "%{name} %{target} құпиясөзін қалпына келтірді"
+        resolve_report: "%{name} %{target} шағымын қарастырды"
+        silence_account: "%{name} %{target} аккаунтын үнсіз қылды"
+        suspend_account: "%{name} %{target} аккаунтын тоқтатты"
+        unassigned_report: "%{name} бекітілмеген есеп %{target}"
+        unsilence_account: "%{name} %{target} аккаунтын қайта қосты"
+        unsuspend_account: "%{name} %{target} аккаунтын қайта қосты"
+        update_custom_emoji: "%{name} эмодзи жаңартты %{target}"
+        update_status: "%{name} жазбасын жаңартты %{target}"
+      deleted_status: "(өшірілген жазба)"
+      title: Аудит логы
+    custom_emojis:
+      by_domain: Домен
+      copied_msg: Жергілікті эмодзидің көшірмесі сәтті жасалды
+      copy: Көшіру
+      copy_failed_msg: Жергілікті эмодзидің көшірмесі жасалмады
+      created_msg: Эмодзи сәтті жаңартылды!
+      delete: Өшіру
+      destroyed_msg: Эмодзи сәтті жойылды!
+      disable: Ажырату
+      disabled_msg: Бұл эмодзи сәтті жойылды
+      emoji: Эмодзи
+      enable: Қосу
+      enabled_msg: Эмодзи сәтті қосылды
+      image_hint: PNG 50KB
+      listed: Тізілді
+      new:
+        title: Жаңа эмодзи қос
+      overwrite: Үстіне жаз
+      shortcode: Шорткод
+      shortcode_hint: Кем дегенде 2 символ, тек латын әріптері мен асты сызылған таңбалар
+      title: Таңдаулы эмодзилар
+      unlisted: Тізімде жоқ
+      update_failed_msg: Бұл эмодзи жаңартылмады
+      updated_msg: Эмодзи сәтті жаңартылды!
+      upload: Жүктеу
+    dashboard:
+      backlog: босатылған тапсырмалар
+      config: Конфигурация
+      feature_deletions: Аккаунттарды жою
+      feature_invites: Шақыру сілтемелері
+      feature_profile_directory: Профиль каталогы
+      feature_registrations: Тіркелулер
+      feature_relay: Федерация релесі
+      features: Мүмкіндіктер
+      hidden_service: Жасырын қызметтер федерациясы
+      open_reports: ашық шағымдар
+      recent_users: Соңғы қолданушылар
+      search: Толық мәтінмен іздеу
+      single_user_mode: Жалғыз пайдаланушы режимі
+      software: Бағдарлама
+      space: Пайдаланылған кеңістік
+      title: Басқару тақтасы
+      total_users: барлық қолданушы
+      trends: Трендтер
+      week_interactions: осы аптадағы әрекеттер
+      week_users_active: осы аптадағы белсенділік
+      week_users_new: осы аптадағы қолданушылар
+    domain_blocks:
+      add_new: Жаңа домен блокын қосу
+      created_msg: Домендік блок енді өңделуде
+      destroyed_msg: Домендік блок қалпына келтірілді
+      domain: Домен
+      new:
+        create: Блок құру
+        hint: Домендік блок дерекқорда тіркелгі жазбаларын құруға кедергі жасамайды, бірақ сол есептік жазбаларда ретроактивті және автоматты түрде нақты модерация әдістерін қолданады.
+        severity:
+          noop: Ештеңе
+          silence: Үнсіз
+          suspend: Тоқтатылған
+        title: Жаңа домен блокы
+      reject_media: Медиа файлдарды қабылдамау
+      reject_media_hint: Жергілікті сақталған мультимедиалық файлдарды жояды және болашақта кез келген жүктеуден бас тартады. Суспензияға байланысты емес
+      reject_reports: Шағым қабылдамау
+      reject_reports_hint: Бұл доменнен келген барлық есептерді елемеңіз. Суспензияға байланысты емес
+      rejecting_media: медиа файлдарды қабылдамау
+      rejecting_reports: шағымдарды қабылдамау
+      severity:
+        silence: үнсіз
+        suspend: тоқтатылған
+      show:
+        affected_accounts:
+          one: Дерекқорда бір тіркелгі қозғалды
+          other: дерекқордағы %{count} аккаунт қозғалған
+        retroactive:
+          silence: Осы домендегі бар тіркелгілерді жою
+          suspend: Осы домендегі бар барлық тіркелгілерді тоқтатыңыз
+        title: "%{domain} доменіндегі блокты алып таста"
+        undo: Қайтару
+      undo: Домен блокын қайтып алу
+    email_domain_blocks:
+      add_new: Жаңасын қосу
+      created_msg: Қаратізімге email домені қосылды
+      delete: Өшіру
+      domain: Домен
+      title: E-mail қаратізімі
+    followers:
+      title: "%{acct} оқырмандары"
+    instances:
+      delivery_available: Жеткізу қол жетімді
+      known_accounts:
+        one: "%{count} таныс аккаунт"
+        other: "%{count} таныс аккаунт"
+      moderation:
+        all: Барлығы
+        limited: Лимит
+        title: Модерация
+      title: Федерация
+      total_blocked_by_us: Біз бұғаттағандар
+      total_followed_by_them: Олар жазылғандар
+      total_followed_by_us: Біз жазылғандар
+      total_reported: Келген шағымдар
+      total_storage: Медиа файлдар
+    invites:
+      deactivate_all: Барлығын сөндір
+      filter:
+        all: Барлығы
+        available: Қолжетімді
+        expired: Уақыты өткен
+        title: Фильтр
+      title: Шақырулар
+    relays:
+      add_new: Жаңа арна қосу
+      delete: Өшіру
+      disable: Сөндіру
+      disabled: Сөндірілді
+      enable: Қосу
+      enabled: Қосылды
+      inbox_url: Арна URL
+      pending: Жаңа арна құпталуын күту
+      save_and_enable: Сақта да қос
+      setup: Арна байланысын баптау
+      status: Статус
+      title: Арналар
+    report_notes:
+      created_msg: Шағым жазбасы сәтті құрылды!
+      destroyed_msg: Шағым жазбасы сәтті өшірілді!
+    reports:
+      account:
+        note: жазба
+        report: шағым
+      action_taken_by: Белсенділік жасаған
+      are_you_sure: Шынымен бе?
+      assign_to_self: Мені тағайындау
+      assigned: Модератор тағайындау
+      comment:
+        none: Ештеңе
+      created_at: Шағым тасталды
+      mark_as_resolved: Шешілді деп белгіле
+      mark_as_unresolved: Шешілмеді деп белгіле
+      notes:
+        create: Жазба қос
+        create_and_resolve: Жазба қосып шеш
+        create_and_unresolve: Жазба қосып қайта аш
+        delete: Өшіру
+        placeholder: Қандай әрекеттер жасалғанын немесе қандай да бір қатысты әрекеттерді сипаттаңыз ...
+      reopen: Шағымды қайта аш
+      report: 'Шағым #%{id}'
+      reported_account: Шағымдалған аккаунт
+      reported_by: Шағым тастаушы
+      resolved: Қайта шешілді
+      resolved_msg: Шағым қайтадан шешілді!
+      status: Статус
+      title: Шағымдар
+      unassign: Қайтып алу
+      unresolved: Шешілмеген
+      updated_at: Жаңартылды
+    settings:
+      activity_api_enabled:
+        desc_html: Соңғы аптада жазылған жазбалар, белсенді қолданушылар, жаңа тіркелімдер
+        title: Пайдаланушы әрекеті туралы жиынтық статистиканы жариялау
+      bootstrap_timeline_accounts:
+        desc_html: Бірнеше пайдаланушы атын үтірмен бөліңіз. Тек жергілікті және бұғатталмаған аккаунттар. Барлық жергілікті админдер бос болғанда.
+        title: Жаңа қолданушыларға жазылғандар
+      contact_information:
+        email: Бизнес e-mail
+        username: Қолданушымен байланыс
+      custom_css:
+        desc_html: Әр беттегі өзгерістерді CSS жаңаруымен қарау
+        title: Жеке CSS
+      hero:
+        desc_html: Бастапқы бетінде көрсетіледі. Кем дегенде 600x100px ұсынылады. Орнатылмаған кезде, сервердің нобайына оралады
+        title: Қаһарман суреті
+      mascot:
+        desc_html: Displayed on multiple pages. Кем дегенде 293×205px рекоменделеді. When not set, falls back to default mascot
+        title: Маскот суреті
+      peers_api_enabled:
+        desc_html: Домен names this server has encountered in the fediverse
+        title: Publish list of discovered серверлер
+      preview_sensitive_media:
+        desc_html: Link previews on other websites will display a thumbnail even if the media is marked as сезімтал
+        title: Show sensitive media in OpenGraph превью
+      profile_directory:
+        desc_html: Рұқсат users to be discoverable
+        title: Enable профиль directory
+      registrations:
+        closed_message:
+          desc_html: Displayed on frontpage when registrations are closed. You can use HTML тег
+          title: Closed registration мессадж
+        deletion:
+          desc_html: Allow anyone to delete their аккаунт
+          title: Open аккаунт deletion
+        min_invite_role:
+          disabled: Ешкім
+          title: Allow шақырулар by
+        open:
+          desc_html: Allow anyone to create an аккаунт
+          title: Ашық тіркелу
+      show_known_fediverse_at_about_page:
+        desc_html: When toggled, it will show toots from all the known fediverse on preview. Otherwise it will only show жергілікті toots.
+        title: Show known fediverse on timeline превью
+      show_staff_badge:
+        desc_html: Show a staff badge on a user бет
+        title: Көрсет staff badge
+      site_description:
+        desc_html: Introductory paragraph on the басты бет. Describe what makes this Mastodon server special and anything else important. You can use HTML tags, in particular <code>&lt;a&gt;</code> and <code>&lt;em&gt;</code>.
+        title: Сервер туралы
+      site_description_extended:
+        desc_html: A good place for your code of conduct, rules, guidelines and other things that set your server apart. You can use HTML тег
+        title: Custom extended ақпарат
+      site_short_description:
+        desc_html: Displayed in sidebar and meta tags. Describe what Mastodon is and what makes this server special in a single paragraph. If empty, defaults to сервер description.
+        title: Short сервер description
+      site_terms:
+        desc_html: You can write your own privacy policy, terms of service or other legalese. You can use HTML тег
+        title: Қолдану шарттары мен ережелер
+      site_title: Сервер аты
+      thumbnail:
+        desc_html: Used for previews via OpenGraph and API. 1200x630px рекоменделеді
+        title: Сервер суреті
+      timeline_preview:
+        desc_html: Display public timeline on лендинг пейдж
+        title: Таймлайн превьюі
+      title: Сайт баптаулары
+    statuses:
+      back_to_account: Аккаунт бетіне оралы
+      batch:
+        nsfw_off: Сезімтал емес ретінде белгіле
+        nsfw_on: Сезімтал ретінде белгіле
+      failed_to_execute: Орындалмады
+      media:
+        title: Медиa
+      no_media: Медиасыз
+      no_status_selected: Бірде-бір статус өзгерген жоқ, себебі ештеңе таңдалмады
+      title: Аккаунт статустары
+      with_media: Медиамен
+    subscriptions:
+      callback_url: Callbаck URL
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 0e95adf7b1..ecee8374cb 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -7,7 +7,7 @@ ko:
     administered_by: '관리자:'
     api: API
     apps: 모바일 앱
-    closed_registrations: 현재 이 인스턴스에서는 신규 등록을 받고 있지 않습니다.
+    closed_registrations: 현재 이 서버에서는 신규 등록을 받고 있지 않습니다. 하지만! 다른 서버에 계정을 만들어 똑같은 네트워크에 접속 할 수 있습니다.
     contact: 연락처
     contact_missing: 미설정
     contact_unavailable: N/A
@@ -27,7 +27,7 @@ ko:
     generic_description: "%{domain} 은 네트워크에 있는 한 서버입니다"
     hosted_on: "%{domain}에서 호스팅 되는 마스토돈"
     learn_more: 자세히
-    other_instances: 다른 인스턴스
+    other_instances: 서버 목록
     privacy_policy: 개인정보 정책
     source_code: 소스 코드
     status_count_after:
@@ -388,14 +388,14 @@ ko:
         desc_html: 모든 페이지에 적용할 CSS
         title: 커스텀 CSS
       hero:
-        desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 인스턴스의 썸네일이 사용 됩니다
+        desc_html: 프론트페이지에 표시 됩니다. 최소 600x100픽셀을 권장합니다. 만약 설정되지 않았다면, 서버의 썸네일이 사용 됩니다
         title: 히어로 이미지
       mascot:
         desc_html: 여러 페이지에서 보여집니다. 최소 293x205px을 추천합니다. 설정 되지 않은 경우, 기본 마스코트가 사용 됩니다
         title: 마스코트 이미지
       peers_api_enabled:
-        desc_html: 이 인스턴스가 페디버스에서 만났던 도메인 네임들
-        title: 발견 된 인스턴스들의 리스트 발행
+        desc_html: 이 서버가 페디버스에서 만났던 도메인 네임들
+        title: 발견 된 서버들의 리스트 발행
       preview_sensitive_media:
         desc_html: 민감한 미디어로 설정되었더라도 다른 웹사이트에서 링크 미리보기에 썸네일을 보여줍니다
         title: 민감한 미디어를 오픈그래프 미리보기에 보여주기
@@ -423,20 +423,20 @@ ko:
         title: 스태프 배지 표시
       site_description:
         desc_html: 프론트 페이지의 소개문에 사용 됩니다.이 마스토돈 서버의 특별한 점 등을 설명하세요. HTML 태그, 주로 <code>&lt;a&gt;</code>, <code>&lt;em&gt;</code> 같은 것을 사용 가능합니다.
-        title: 사이트 설명
+        title: 서버 설명
       site_description_extended:
         desc_html: 규칙, 가이드라인 등을 작성하기 좋은 곳입니다. HTML 태그를 사용할 수 있습니다
         title: 사이트 상세 설명
       site_short_description:
-        desc_html: 사이드바와 메타 태그에 나타납니다. 마스토돈이 무엇이고 이 서버의 특징은 무엇인지 한 문장으로 설명하세요. 비워두면 인스턴스 설명이 대신 사용됩니다.
-        title: 짧은 인스턴스 설명
+        desc_html: 사이드바와 메타 태그에 나타납니다. 마스토돈이 무엇이고 이 서버의 특징은 무엇인지 한 문장으로 설명하세요. 비워두면 서버 설명이 대신 사용됩니다.
+        title: 짧은 서버 설명
       site_terms:
         desc_html: 당신은 독자적인 개인정보 취급 방침이나 이용약관, 그 외의 법적 근거를 작성할 수 있습니다. HTML태그를 사용할 수 있습니다
         title: 커스텀 서비스 이용 약관
-      site_title: 사이트 이름
+      site_title: 서버 이름
       thumbnail:
         desc_html: OpenGraph와 API의 미리보기로 사용 됩니다. 1200x630px을 권장합니다
-        title: 인스턴스 썸네일
+        title: 서버 썸네일
       timeline_preview:
         desc_html: 랜딩 페이지에 공개 타임라인을 표시합니다
         title: 타임라인 프리뷰
@@ -497,7 +497,7 @@ ko:
     warning: 이 데이터를 조심히 다뤄 주세요. 다른 사람들과 절대로 공유하지 마세요!
     your_token: 액세스 토큰
   auth:
-    agreement_html: 이 등록으로 <a href="%{rules_path}">이용규약</a> 과 <a href="%{terms_path}">약관</a>에 동의하는 것으로 간주됩니다.
+    agreement_html: 이 등록으로 이 서버의 <a href="%{rules_path}">이용규약</a> 과 <a href="%{terms_path}">약관</a>에 동의하는 것으로 간주됩니다.
     change_password: 패스워드
     confirm_email: 확인 메일 승인
     delete_account: 계정 삭제
@@ -551,7 +551,7 @@ ko:
     description_html: 계정에 업로드된 모든 컨텐츠가 삭제되며, 계정은 비활성화 됩니다. 이것은 영구적으로 이루어지는 것이므로 <strong>되돌릴 수 없습니다</strong>. 사칭 행위를 방지하기 위해 같은 아이디로 다시 등록하는 것은 불가능합니다.
     proceed: 계정 삭제
     success_msg: 계정이 성공적으로 삭제되었습니다
-    warning_html: 삭제가 보장되는 것은 이 인스턴스 상에서의 컨텐츠에 한합니다. 타 인스턴스 등, 외부에 멀리 공유된 컨텐츠는 흔적이 남아 삭제되지 않는 경우도 있습니다. 그리고 현재 접속이 불가능한 서버나, 업데이트를 받지 않게 된 서버에 대해서는 삭제가 반영되지 않을 수도 있습니다.
+    warning_html: 삭제가 보장되는 것은 이 서버 상에서의 컨텐츠에 한합니다. 타 서버 등, 외부에 멀리 공유된 컨텐츠는 흔적이 남아 삭제되지 않는 경우도 있습니다. 그리고 현재 접속이 불가능한 서버나, 업데이트를 받지 않게 된 서버에 대해서는 삭제가 반영되지 않을 수도 있습니다.
     warning_title: 공유된 컨텐츠에 대해서
   directories:
     directory: 프로필 디렉토리
@@ -566,7 +566,7 @@ ko:
   errors:
     '403': 이 페이지를 표시할 권한이 없습니다.
     '404': 당신이 찾으려는 페이지는 존재하지 않습니다.
-    '410': 당신이 보려는 페이지는 더이상 존재하지 않습니다.
+    '410': 당신이 보려는 페이지는 더이상 여기에 존재하지 않습니다.
     '422':
       content: 보안 인증에 실패했습니다. 쿠키를 차단하고 있진 않습니까?
       title: 보안 인증 실패
@@ -590,6 +590,10 @@ ko:
     lists: 리스트
     mutes: 뮤트
     storage: 미디어
+  featured_tags:
+    add_new: 추가
+    errors:
+      limit: 이미 추천 해시태그의 개수가 최대입니다
   filters:
     contexts:
       home: 홈 타임라인
@@ -608,7 +612,7 @@ ko:
       title: 필터 추가
   followers:
     domain: 도메인
-    explanation_html: 프라이버시를 확보하고 싶은 경우, 누가 여러분을 팔로우 하고 있는지 파악해둘 필요가 있습니다. <strong>프라이빗 포스팅은 여러분의 팔로워가 소속하는 모든 인스턴스로 배달됩니다</strong>. 팔로워가 소속된 인스턴스 관리자나 소프트웨어가 여러분의 프라이버시를 존중하고 있는지 잘 모를 경우, 그 팔로워를 삭제하는 것이 좋을 수도 있습니다.
+    explanation_html: 프라이버시를 확보하고 싶은 경우, 누가 여러분을 팔로우 하고 있는지 파악해둘 필요가 있습니다. <strong>프라이빗 포스팅은 여러분의 팔로워가 소속하는 모든 서버로 배달됩니다</strong>. 팔로워가 소속된 서버 관리자나 소프트웨어가 여러분의 프라이버시를 존중하고 있는지 잘 모를 경우, 그 팔로워를 삭제하는 것이 좋을 수도 있습니다.
     followers_count: 팔로워 수
     lock_link: 비공개 계정
     purge: 팔로워에서 삭제
@@ -630,10 +634,16 @@ ko:
       one: 오류가 발생했습니다. 아래 오류를 확인해 주십시오
       other: 오류가 발생했습니다. 아래 %{count}개 오류를 확인해 주십시오
   imports:
-    preface: 다른 인스턴스에서 내보내기 한 파일에서 팔로우 / 차단 정보를 이 인스턴스 계정으로 불러올 수 있습니다.
+    modes:
+      merge: 병합
+      merge_long: 기존 것을 그대로 둔 채 새로 추가
+      overwrite: 덮어쓰기
+      overwrite_long: 기존 것을 모두 지우고 새로 추가
+    preface: 다른 서버에서 내보내기 한 파일에서 팔로우 / 차단 정보를 이 계정으로 불러올 수 있습니다.
     success: 파일이 정상적으로 업로드 되었으며, 현재 처리 중입니다
     types:
       blocking: 차단한 계정 목록
+      domain_blocking: 도메인 차단 목록
       following: 팔로우 중인 계정 목록
       muting: 뮤트 중인 계정 목록
     upload: 업로드
@@ -655,7 +665,7 @@ ko:
       one: 일회용
       other: "%{count} 회"
     max_uses_prompt: 제한 없음
-    prompt: 이 인스턴스에 대한 초대 링크를 만들고 공유합니다
+    prompt: 이 서버에 대한 초대 링크를 만들고 공유합니다
     table:
       expires_at: 만료
       uses: 사용됨
@@ -803,6 +813,7 @@ ko:
     development: 개발
     edit_profile: 프로필 편집
     export: 데이터 내보내기
+    featured_tags: 추천 해시태그
     followers: 신뢰 중인 인스턴스
     import: 데이터 가져오기
     migrate: 계정 이동
@@ -931,8 +942,8 @@ ko:
       <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: "%{instance} 이용약관과 개인정보 취급 방침"
   themes:
-    contrast: 고대비
-    default: 마스토돈
+    contrast: 마스토돈 (고대비)
+    default: 마스토돈 (어두움)
     mastodon-light: 마스토돈 (밝음)
   time:
     formats:
@@ -982,7 +993,7 @@ ko:
       final_action: 포스팅 시작하기
       final_step: '포스팅을 시작하세요! 팔로워가 없더라도 퍼블릭 메시지는 다른 사람들이 볼 수 있습니다, 예를 들면 로컬 타임라인이나 해시태그에서요. 사람들에게 자신을 소개하고 싶다면 #introductions 해시태그를 이용해보세요.'
       full_handle: 당신의 풀 핸들
-      full_handle_hint: 이것을 당신의 친구들에게 알려주면 다른 인스턴스에서 팔로우 하거나 메시지를 보낼 수 있습니다.
+      full_handle_hint: 이것을 당신의 친구들에게 알려주면 다른 서버에서 팔로우 하거나 메시지를 보낼 수 있습니다.
       review_preferences_action: 설정 바꾸기
       review_preferences_step: 당신의 설정을 확인하세요. 어떤 이메일로 알림을 받을 것인지, 기본적으로 어떤 프라이버시 설정을 사용할 것인지, 멀미가 없다면 GIF를 자동 재생하도록 설정할 수도 있습니다.
       subject: 마스토돈에 오신 것을 환영합니다
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 52aa868a60..ad10c70678 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -7,7 +7,7 @@ lt:
     administered_by: 'Administruoja:'
     api: API
     apps: Mobilioji Aplikacija
-    closed_registrations: Registracija šiuo metu uždaryta prie šito tinklo.  Jūs galite rasti kitą būdą susikurti paskyrą ir gauti prieeiga prie to paties tinklo.
+    closed_registrations: Registracija šiuo metu uždaryta prie šito tinklo.  Jūs galite rasti kitą būdą susikurti paskyrą ir gauti prieigą prie to paties tinklo.
     contact: Kontaktai
     contact_missing: Nenustatyta
     contact_unavailable: N/A
@@ -16,7 +16,7 @@ lt:
       <h3>TaisyklÄ—s</h3>
       <p>Ilgas aprašymas dar nėra sudartyas</p>
     features:
-      humane_approach_body: Mokantis iš kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiška dizainą, kovojant su netinkamu socialinių tinklų naudojimu.
+      humane_approach_body: Mokantis iš kitų socialinių tinklų, bei jų daromu klaidų, Mastodon siekia sukurti etiška dizainą, kuris kovotu su netinkamu socialinių tinklų naudojimu.
       humane_approach_title: Humaniškesnis metodas
       not_a_product_body: Mastodon nėra komercinis tinklas. Jokių reklamų, privačios informacijos rinkimo. Čia nėra vieno žmogaus, kuris už viską atsako.
       not_a_product_title: Tu esi žmogus, o ne produktas
@@ -27,6 +27,7 @@ lt:
     generic_description: "%{domain} yra vienas serveris tinkle"
     hosted_on: Mastodon palaikomas naudojantis %{domain} talpinimu
     learn_more: Daugiau
+    other_instances: Serverių sąrašas
     privacy_policy: Privatumo Politika
     source_code: Å altinio kodas
     status_count_after:
@@ -107,6 +108,7 @@ lt:
       email_status: El pašto statusas
       enable: Įjungti
       enabled: Įjungta
+      feed_url: Srauto URL
       followers: SekÄ—jai
       followers_url: Sekėjų URL
       follows: Seka
@@ -118,6 +120,7 @@ lt:
       location:
         all: Visi
         local: Lokali
+        remote: Nuotolinis
         title: Lokacija
       login_status: Prisijungimo statusas
       media_attachments: Prisegti medijos failai
@@ -180,3 +183,845 @@ lt:
         assigned_to_self_report: "%{name} paskyrÄ— reportÄ… %{target} saviems"
         change_email_user: "%{name} pakeitė el pašto adresą vartotojui %{target}"
         confirm_user: "%{name} patvirtino el pašto adresą vartotojui %{target}"
+        create_account_warning: "%{name} išsiuntė įspėjimą %{target}"
+        create_custom_emoji: "%{name} įkėlė naują jaustuką %{target}"
+        create_domain_block: "%{name} užblokavo domena %{target}"
+        create_email_domain_block: "%{name} įkėlė į juodajį sąrašą el pašto domena %{target}"
+        demote_user: "%{name} pažemino %{target}"
+        destroy_custom_emoji: "%{name} sunaikino jaustukÄ… %{target}"
+        destroy_domain_block: "%{name} atrakino domenÄ… %{target}"
+        destroy_email_domain_block: "%{name} pašalino iš juodojo sąrašo el pašto domeną %{target}"
+        destroy_status: "%{name} pašalino statusą %{target}"
+        disable_2fa_user: "%{name} išjungė 2 faktorių autentikavimo sistemos reikalavimus vartotojui  %{target}"
+        disable_custom_emoji: "%{name} išjungė jaustuką %{target}"
+        disable_user: "%{name} išjungė prisijungimą vartotojui %{target}"
+        enable_custom_emoji: "%{name} įjungė jaustuką %{target}"
+        enable_user: "%{name} įjungė prisijungimą vartotojui %{target}"
+        memorialize_account: "%{name} pavertė vartotojo %{target} paskyrą į prisiminimų puslapį"
+        promote_user: "%{name} paaukštino vartotoją %{target}"
+        remove_avatar_user: "%{name} panaikino vartotojo %{target} profilio nuotraukÄ…"
+        reopen_report: "%{name} atidarÄ— skundÄ… %{target}"
+        reset_password_user: "%{name} atstatyti slaptažodį vartotojui %{target}"
+        resolve_report: "%{name} išsprendė skundą %{target}"
+        silence_account: "%{name} pritildÄ— vartotojo %{target} paskyrÄ…"
+        suspend_account: "%{name} laikinai užblokavo vartotojo %{target} paskyrą"
+        unassigned_report: "%{name} nepaskirtas skundas %{target}"
+        unsilence_account: "%{name} atitildÄ— vartotojo %{target} paskyrÄ…"
+        unsuspend_account: "%{name} atblokavo vartotojo %{target} paskyrÄ…"
+        update_custom_emoji: "%{name} atnaujino jaustukÄ… %{target}"
+        update_status: "%{name} pakeitÄ— statusÄ… %{target}"
+      deleted_status: "(panaikintas statusas)"
+      title: Audito žurnalas
+    custom_emojis:
+      by_domain: Domenas
+      copied_msg: SÄ—kmingai sukurta lokali jaustuko kopija
+      copy: Kopijuoti
+      copy_failed_msg: Lokali jaustuko kopija negalėjo būti sukurta
+      created_msg: Jaustukas sukurtas sÄ—kmingai!
+      delete: IÅ¡trinti
+      destroyed_msg: Jaustukas sÄ—kmingai sunaikintas!
+      disable: IÅ¡jungti
+      disabled_msg: Šis jaustukas sėkmingai išjungtas
+      emoji: Jaustukas
+      enable: Įjungti
+      enabled_msg: Šis jaustukas sėkmingai įjungtas
+      image_hint: PNG failo dydis iki 50KB
+      listed: Įtrauktas į sąrašą
+      new:
+        title: PridÄ—ti naujÄ… jaustukÄ…
+      overwrite: Perrašyti
+      shortcode: Trumpas-kodas
+      shortcode_hint: Bent du ženklai, tik raidiniai skaitmeniniai ženklai bei akcentai(_)
+      title: Asmeniniai jaustukai
+      unlisted: Neįtrauktas į sąrašą
+      update_failed_msg: Jaustukas negalėjo būti pakeistas
+      updated_msg: Jaustukas sÄ—kmingai pakeistas!
+      upload: Įkelti
+    dashboard:
+      backlog: Neatlikti darbai
+      config: Konfiguracija
+      feature_deletions: Paskyrų šalinimas
+      feature_invites: Pakivetimo nuorodos
+      feature_profile_directory: Profilio direktorija
+      feature_registrations: Registracijos
+      feature_relay: Federacijos perjungÄ—jas
+      features: IÅ¡skirtinumai
+      hidden_service: Federacija su paslÄ—ptomis paslaugomis
+      open_reports: atidaryti skundai
+      recent_users: Neseni vartotojai
+      search: Pilno teksto paieška
+      single_user_mode: Vieno vartotojo būsena
+      software: Programinė įranga
+      space: Naudojama atmintis
+      title: Pagrindinis puslapis
+      total_users: viso vartotoju
+      trends: Tendencijos
+      week_interactions: naudojimai Å¡iÄ… savaitÄ™
+      week_users_active: aktyvūs šią savaitę
+      week_users_new: vartotojai Å¡iÄ… savaitÄ™
+    domain_blocks:
+      add_new: PridÄ—ti naujÄ… domeno blokÄ…
+      created_msg: Domeno užblokavimas nagrinėjamas
+      destroyed_msg: Domeno blokas pašalintas
+      domain: Domenas
+      new:
+        create: Sukurti blokÄ…
+        hint: Domeno blokavimas nesustabdys vartotojų paskyrų sukūrimo duomenų sistemoje, tačiau automatiškai pritaikys atitinkamus moderavimo metodus šioms paskyroms.
+        severity:
+          desc_html: |-
+            <strong>1Tyla</strong>2 padarys paskyros įkelimus nematomus visiems, kurie jų neseka.
+            <strong>3Draudimas</strong>4 panaikins visus paskyros įkėlimus ir profilio informaciją.Naudok<strong>5Nieko</strong>6 jeigu tiesiog norite atmesti medijos failus.
+          noop: Nieko
+          silence: Tyla
+          suspend: Draudimas
+        title: Naujos domeno blokas
+      reject_media: Atmesti medijos failai
+      reject_media_hint: Panaikina lokaliai saugomus medijos failus bei atsisako jų parsisiuntimo ateityje. Neliečia užblokavimu
+      reject_reports: Atmesti skundai
+      reject_reports_hint: Ignoruoti visus skundus, kurie siunčiami iš šio domeno. Neliečia užblokavimu
+      rejecting_media: atmetami medijos failai
+      rejecting_reports: atmetami skundai
+      severity:
+        silence: užtildytas
+        suspend: uždraustas
+      show:
+        affected_accounts:
+          few: "%{count} vartotojai duomenų bazėje yra paveikti"
+          one: Vienas vartotojas duomenų bazėje paveiktas
+          other: "%{count} vartotojai duomenų bazėje yra paveikti"
+        retroactive:
+          silence: Atitildyti visus egzistuojančius vartotojus šiame domene
+          suspend: Atblokuotis visus egzistuojančius vartotojus šiame domene
+        title: Atkurti domeno blokavimÄ… domenui %{domain}
+        undo: Atkurti
+      undo: Atkurti domeno blokÄ…
+    email_domain_blocks:
+      add_new: PridÄ—ti naujÄ…
+      created_msg: El pašto domenas sėkmingai pridėtas į juodąjį sąrašą
+      delete: IÅ¡trinti
+      destroyed_msg: El pašto adresas sėkmingai pašalintas iš juodojo sąrašo
+      domain: Domenas
+      new:
+        create: PridÄ—to domenÄ…
+        title: Naujas el pašto juodojo sąrašo įtraukimas
+      title: El pašto juodasis sąrašas
+    followers:
+      back_to_account: Atgal Ä® PaskyrÄ…
+      title: "%{acct} SekÄ—jai"
+    instances:
+      delivery_available: Pristatymas galimas
+      known_accounts:
+        few: "%{count} žinomos paskyros"
+        one: "%{count} žinoma paskyra"
+        other: "%{count} žinomos paskyros"
+      moderation:
+        all: Visi
+        limited: Limituotas
+        title: Moderacija
+      title: Federacija
+      total_blocked_by_us: Mes užblokavome
+      total_followed_by_them: Jų sekami
+      total_followed_by_us: Mūsų sekami
+      total_reported: Skundai apie juos
+      total_storage: Medijos prisegti failai
+    invites:
+      deactivate_all: Deaktyvuoti visus
+      filter:
+        all: Visi
+        available: Prieinamas
+        expired: Pasibaigęs
+        title: Filtras
+      title: Pakvietimai
+    relays:
+      add_new: PridÄ—ti naujÄ… pamainÄ…
+      delete: IÅ¡trinti
+      description_html: "<strong>Federacijos perjungėjas</strong> tai tarpinis serveris, kuris apsikeičia didelios apimties informacija tarp kitų serverių. <strong> Tai gali padėti mažesniems serveriams atrasti turinį iš fedi-visatos</strong>, kuris kitaip reikalautų vartotojų lokaliai sekti kitus žmones naudojantis kitus tolimus serverius."
+      disable: IÅ¡jungti
+      disabled: IÅ¡jungtas
+      enable: Įjungti
+      enable_hint: Kai įjungta, Jūsų serveris prenumeruos visas viešas žinutes iš šio tinklo, ir pradės siųsti šio serverio viešas žinutes į tinklą.
+      enabled: Įjungtas
+      inbox_url: Perdavimo URL
+      pending: Laukiama perdavimo patvirtinimo
+      save_and_enable: Išsaugoti ir įjungti
+      setup: Sukurti perdavimo ryšį
+      status: Statusas
+      title: Perdavimai
+    report_notes:
+      created_msg: Skundo žinutė sekmingai sukurta!
+      destroyed_msg: Skundo žinutė sekmingai ištrinta!
+    reports:
+      account:
+        note: raštelis
+        report: skundas
+      action_taken_by: Veiksmo Ä—mÄ—si
+      are_you_sure: Ar tu įsitikinęs?
+      assign_to_self: Paskirti man
+      assigned: Paskirtas moderatorius
+      comment:
+        none: NÄ—ra
+      created_at: Reportuotas
+      mark_as_resolved: Pažymėti kaip išsprestą
+      mark_as_unresolved: Pažymėti kaip neišsprestą
+      notes:
+        create: Pridėti raštelį
+        create_and_resolve: Išspręsti su rašteliu
+        create_and_unresolve: Atidaryti su rašteliu
+        delete: IÅ¡trinti
+        placeholder: Apibūdink, kokių veiksmų imtasi arba kitokie atnaujinimai..
+      reopen: Atidaryti skundÄ…
+      report: 'Skundas #%{id}'
+      reported_account: Reportuota paskyra
+      reported_by: Skundas sukurtas
+      resolved: Išspręsta
+      resolved_msg: Skundas sėkmingai įšspręstas!
+      status: Statusas
+      title: Skundai
+      unassign: Nepriskirti
+      unresolved: Neišspręsti
+      updated_at: Atnaujinti
+    settings:
+      activity_api_enabled:
+        desc_html: Skaičiai lokaliai įkeltų statusų, aktyvių vartotojų ir naujų registracijų, kas savaitiniuose atnaujinimuose
+        title: Paskelbti agreguotÄ… statistikÄ… apie vartotojo veiklÄ…
+      bootstrap_timeline_accounts:
+        desc_html: Atskirti vartotojų vardus naudojant kablelį (,). Tik lokalios ir neužblokuotos paskyros veiks. Pradinis kai tuščia, visi lokalūs administratoriai.
+        title: Numatyti sekimai naujiems vartotojams
+      contact_information:
+        email: Verslo el paštas
+        username: Kontaktinis slapyvardis
+      custom_css:
+        desc_html: Pakeisk išvaizdą su CSS užkraunamu kiekviename puslapyje
+        title: Asmeninis CSS
+      hero:
+        desc_html: Rodomas pagrindiniame puslapyje. Bent 600x100px rekomenduojama. Kai nenustatyta, renkamasi numatytÄ… serverio nuotraukÄ…
+        title: Herojaus nuotrauka
+      mascot:
+        desc_html: Rodoma keleta puslapių. Bent 293×205px rekomenduoja. Kai nenustatyą, renkamasi numatytą varianta
+        title: Talismano nuotrauka
+      peers_api_enabled:
+        desc_html: Domeno vardai, kuriuos Å¡is serveris sutiko fedi-visatoje
+        title: Paskelbti sąrašą atrastų serveriu
+      preview_sensitive_media:
+        desc_html: Nuorodų peržiūros kituose tinklalapiuose bus rodomos su maža nuotrauka, net jeigu failas parinktas kaip "jautraus turinio"
+        title: Rodyti jautrią informaciją OpenGraph peržiūrose
+      profile_directory:
+        desc_html: Leisti vartotojams būti atrastiems
+        title: Įjungti profilio direktorija
+      registrations:
+        closed_message:
+          desc_html: Rodoma pagrindiniame puslapyje, kuomet registracijos uždarytos. Jūs galite naudoti HTML
+          title: Uždarytos registracijos žinutė
+        deletion:
+          desc_html: Leisti visiems ištrinti savo paskyrą
+          title: Atidaryti paskyros trynimÄ…
+        min_invite_role:
+          disabled: Nei vienas
+          title: Leisti pakvietimus
+        open:
+          desc_html: Leisti bet kam susikurti paskyrÄ…
+          title: Atidaryta registracija
+      show_known_fediverse_at_about_page:
+        desc_html: Kai įjungta, rodys įrašus iš visos žinomos fedi-visatos. Kitokiu atvėju, rodys tik lokalius įrašus.
+        title: Rodyti žinoma fedi-visatos laiko juosta peržiūroje
+      show_staff_badge:
+        desc_html: Rodyti personalo ženklelį vartotojo puslapyje
+        title: Rodyti personalo ženklelį
+      site_description:
+        desc_html: Introdukcinis paragrafas pagrindiniame puslapyje. Apibūdink, kas padaro šį Mastodon serverį išskirtiniu ir visa kita, kas svarbu. Nebijok naudoti HTML žymes, pavyzdžiui <code> &lt; a &gt;</code> bei <code>&lt;em&gt;</code>.
+        title: Serverio apibūdinimas
+      site_description_extended:
+        desc_html: Gera vieta Jūsų elgesio kodeksui, taisyklėms, nuorodms ir kitokiai informacijai, kuri yra išskirtinė Jūsų serveriui. Galite naudoti HTML žymes
+        title: Išsamesnė išskirtine informacija
+      site_short_description:
+        desc_html: Rodoma šoniniame meniu ir meta žymėse. Apibūdink kas yra Mastodon, ir kas daro šį serverį išskirtiniu, vienu paragrafu. Jeigu tuščias, naudojamas numatytasis tekstas.
+        title: Trumpas serverio apibūdinimas
+      site_terms:
+        desc_html: Jūs galite parašyti savo pačio privatumo politika, naudojimo sąlygas ar kita informacija. Galite naudoti HTML žymes
+        title: IÅ¡skirtinÄ—s naudojimosi taisyklÄ—s
+      site_title: Serverio pavadinimas
+      thumbnail:
+        desc_html: Naudojama OpenGraph peržiūroms ir API. Rekomenduojama 1200x630px
+        title: Serverio miniatūra
+      timeline_preview:
+        desc_html: Rodyti viešą laiko juostą apsilankymo puslapyje
+        title: Laiko juostos peržiūra
+      title: Tinklalapio nustatymai
+    statuses:
+      back_to_account: Atgal į paskyros puslapį
+      batch:
+        delete: IÅ¡trinti
+        nsfw_off: Pažymėti kaip ne jautrią informaciją
+        nsfw_on: Pažymėti kaip jautrią informaciją
+      failed_to_execute: NesÄ—kmingas veiksmas
+      media:
+        title: Medija
+      no_media: NÄ—ra medijos
+      no_status_selected: Jokie statusai nebuvo pakeisti, nes niekas nepasirinkta
+      title: Paskyros statusai
+      with_media: Su medija
+    subscriptions:
+      callback_url: AtgalinÄ— URL
+      confirmed: Patvirtinta
+      expires_in: Pasibaigia
+      last_delivery: Paskutinis pristatymas
+      title: WebSub protokolas
+      topic: Tema
+    tags:
+      accounts: Paskyros
+      hidden: PaslÄ—pti
+      hide: Paslėpti iš direktorijos
+      name: Saitažodis(#)
+      title: Saitažodžiai(#)
+      unhide: Rodyti direktorijoje
+      visible: Matomas
+    title: Administracija
+    warning_presets:
+      add_new: PridÄ—ti naujÄ…
+      delete: IÅ¡trinti
+      edit: Keisti
+      edit_preset: Keisti įspėjimo nustatymus
+      title: Valdyti įspėjimo nustatymus
+  admin_mailer:
+    new_report:
+      body: "%{reporter} parašė skundą apie %{target}"
+      body_remote: Kažkas iš %{domain} parašė skundą apie %{target}
+      subject: Naujas skundas %{instance} (#%{id})
+  application_mailer:
+    notification_preferences: Keisti el pašto parinktis
+    salutation: "%{name},"
+    settings: 'Keisti el pašto parinktis: %{link}'
+    view: 'Peržiūra:'
+    view_profile: Peržiurėti profilį
+    view_status: Peržiūrėti statusą
+  applications:
+    created: Aplikacija sÄ—kmingai sukurta
+    destroyed: Aplikacija sėkmingai ištrinta
+    invalid_url: Gauta URL nuoroda netinkama
+    regenerate_token: Regeneruoti prieigos žetoną
+    token_regenerated: Prieigos žetonas sėkmingai sugeneruotas
+    warning: Būkite atsargūs su šia informacija. Niekada jos nesidalinkite!
+    your_token: Jūsų prieigos žetonas
+  auth:
+    agreement_html: Paspaudus "Sign up" JÅ«s sutinkate sekti <a href="%{rules_path}">serverio taisykles</a> bei <a href="%{terms_path}">naudojimo sÄ…lygas</a>.
+    change_password: Slaptažodis
+    confirm_email: Patvirtinti el paštą
+    delete_account: IÅ¡trinti paskyrÄ…
+    delete_account_html: Jeigu norite ištrinti savo paskyrą, galite eiti <a href="%{path}">čia</a>. Jūsų prašys patvirtinti pasirinkimą.
+    didnt_get_confirmation: Negavote patvirtinimo instrukcijų?
+    forgot_password: Pamiršote slaptažodį?
+    invalid_reset_password_token: Slaptažodžio atkūrimo žetonas netinkamas arba jo galiojimo laikas pasibaigęs. Prašykite naujo žetono.
+    login: Prisijungti
+    logout: Atsijungti
+    migrate_account: Prisijungti prie kitos paskyros
+    migrate_account_html: Jeigu norite nukreipti šią paskyrą į kita, galite tai <a href="%{path}">konfiguruoti čia</a>.
+    or: arba
+    or_log_in_with: Arba prisijungti su
+    providers:
+      cas: CAS
+      saml: SAML
+    register: Užsiregistruoti
+    register_elsewhere: Užsiregistruoti kitame serveryje
+    resend_confirmation: Išsiųsti dar kartą patvirtinimo instrukcijas
+    reset_password: Atstatyti slaptažodį
+    security: Apsauga
+    set_new_password: Nustatyti naują slaptažodį
+  authorize_follow:
+    already_following: JÅ«s jau sekate Å¡iÄ… paskyrÄ…
+    error: Dėja, aptikta klaida ieškant tolimosios paskyros
+    follow: Sekti
+    follow_request: 'Jūs išsiuntėte sekimo prašymą:'
+    following: 'Puiku! JÅ«s pradÄ—jote sekti:'
+    post_follow:
+      close: Arba, Jūs galite uždaryti šį langą.
+      return: Rodyti vartotojo paskyrÄ…
+      web: Eiti į
+    title: Sekti %{acct}
+  datetime:
+    distance_in_words:
+      about_x_hours: "%{count} val"
+      about_x_months: "%{count}mÄ—n"
+      about_x_years: "%{count}met"
+      almost_x_years: "%{count}met"
+      half_a_minute: KÄ… tik
+      less_than_x_minutes: "%{count}min"
+      less_than_x_seconds: KÄ… tik
+      over_x_years: "%{count}met"
+      x_days: "%{count}dien"
+      x_minutes: "%{count}min"
+      x_months: "%{count}mÄ—n"
+      x_seconds: "%{count}sek"
+  deletes:
+    bad_password_msg: Geras bandymas, programišiau! Neteisingas slaptažodis
+    confirm_password: Kad patvirtintumėte savo tapatybę, įveskite dabartini slaptažodį
+    description_html: Tai <strong>be sugrąžinimo, visam laikui</strong> panaikins visa turini iš Jūsų paskyros ir deaktyvuos ją. Jūsų vartotojo vardas paliks rezervuotas, kad išvengtumėme tapatybės pavagimo ateityje.
+    proceed: IÅ¡trinti paskyrÄ…
+    success_msg: Jūsų paskyra sėkmingai ištrinta
+    warning_html: Tiktai panaikinimas turinio iš šio serverio garantuotas. Turinys, kuris buvo viešai prieinamas ir dalinamas kituose serveriuose paliks pėdsakus. Serveriai, kurie neseka jūsų, kurie nėra tinkle, nepakeis savo duomenų sistemos.
+    warning_title: Platinamo turinio prieinamumas
+  directories:
+    directory: Profilio direktorija
+    enabled: JÅ«s esate rodomas Å¡ioje direktorijoje.
+    enabled_but_waiting: Jūs pasirinkote būti įtrauktas į direktorija, bet jūs neturite minimalaus sekėjų skaičiaus (%{min_followers}), kad būtumėte rodomas.
+    explanation: Raskite vartotojus, remiantis tuo, kuo jie domisi
+    explore_mastodon: Naršyti %{title}
+    how_to_enable: Jūs nesate prisijungęs prie šios direktorijos. Galite prisijungti žemiau. Naudokite saitažodžius savo biografiniame tekste, kad būtumėte rastas naudojantis specifinius saitažodžius!
+    people:
+      few: "%{count} žmonės"
+      one: "%{count} žmogus"
+      other: "%{count} žmonės"
+  errors:
+    '403': JÅ«s neturie prieigos matyti Å¡iam puslapiui.
+    '404': Puslapis nerastas.
+    '410': Puslapis neegzistuoja.
+    '422':
+      content: Apsaugos patvirtinmas klaidingas. Ar jūs blokuojate sausainius?
+      title: Apsaugos patvirtinimas nepavyko
+    '429': Stabdomas
+    '500':
+      content: Atsiprašome, tačiau mūsų pusėje įvyko klaida.
+      title: Netinkamas puslapis
+    noscript_html: Kad naudotumėtės Mastodon web aplikacija, prašome įsijungti JavaScript. Alternatyviai, pabandykite viena iš <a href="%{apps_path}">vietinių aplikacijų</a> Mastodon savo platformai.
+  exports:
+    archive_takeout:
+      date: Data
+      download: Parsisiųsti archyvą
+      hint_html: Jūs galite prašyti savo <strong>įrašų bei medijos</strong> archyvo. Eksportuota informacija bus ActivityPub formatu, skaitoma suderintų programų. Galite prašyti archyvo, kas 7 dienas.
+      in_progress: Sudaromas archyvas...
+      request: Prašyti savo archyvo
+      size: Dydis
+    blocks: JÅ«s blokuojate
+    csv: CSV
+    domain_blocks: Domeno blokai
+    follows: JÅ«s sekate
+    lists: Sąrašai
+    mutes: JÅ«s tildote
+    storage: Medijos sandÄ—lis
+  featured_tags:
+    add_new: PridÄ—ti naujÄ…
+    errors:
+      limit: Jūs jau naudojate maksimalų galimą saitažodžių(#) kiekį
+  filters:
+    contexts:
+      home: Namų laiko juosta
+      notifications: Priminimai
+      public: Viešos laiko juostos
+      thread: Pokalbiai
+    edit:
+      title: Keisti filtrÄ…
+    errors:
+      invalid_context: Jokio arba netinkamas pateiktas kontekstas
+      invalid_irreversible: Negrąžinamas filtras veikia tik namų ir priminimų kontekste
+    index:
+      delete: IÅ¡trinti
+      title: Filtrai
+    new:
+      title: PridÄ—ti naujÄ… filtrÄ…
+  followers:
+    domain: Domenas
+    explanation_html: Jeigu norite garantuoti savo statusų privatumą, turite žinoti, kas jus seka. <strong>Jūsų privatūs statusai yra pristatyti visiems serveriams, kur jūs turite sekėju</strong>. Galbūt jūs norite juos peržiūrėti ir panaikinti sekėjus, kuriais nepasitikite.
+    followers_count: Sekėjų skaičius
+    lock_link: Užrakinti savo paskyrą
+    purge: Panaikint iš sekėju
+    success:
+      few: Švelnaus sekėjų blokavimo procedūroje iš %{count} domenų...
+      one: Švelnaus sekėjų blokavimo procedūroje iš vieno domeno...
+      other: Švelnaus sekėjų blokavimo procedūroje iš %{count} domenų...
+    true_privacy_html: Prašau prisiminti, kad <strong> tikras privatumas gali būti pasiekamas tik su end-to-end užsifravimu</strong>.
+    unlocked_warning_html: Visi, kurie nori matyti Jūsų privatų statusą, gali jus sekti. %{lock_link} kad galėtumėte peržiurėti ir pašalinti sekėjus.
+    unlocked_warning_title: Jūsų paskyra neužrakinta
+  footer:
+    developers: Programuotojai
+    more: Daugiau…
+    resources: Resursai
+  generic:
+    changes_saved_msg: Pakeitimai sėkmingai išsaugoti!
+    copy: Kopijuoti
+    save_changes: IÅ¡saugoti pakeitimus
+    validation_errors:
+      few: Kažkas negerai! Prašau patikrinti %{count} klaidas žemiau
+      one: Kažkas negerai! Peržiūrėk klaidas žemiau
+      other: Kažkas negerai! Prašau patikrinti %{count} klaidas žemiau
+  imports:
+    modes:
+      merge: Sulieti
+      merge_long: Išsaugoti esančius įrašus ir pridėti naujus
+      overwrite: Perrašyti
+      overwrite_long: Pakeisti senus įrašus naujais
+    preface: Jūs galite importuoti informaciją iš kito serverio, tokią kaip sąrašą žmonių kuriuos sekate.
+    success: Jūsų informacija sėkmingai įkelta ir bus apdorota kaip įmanoma greičiau
+    types:
+      blocking: Blokuojamų sąrašas
+      domain_blocking: Domeno blokavimo sąrašas
+      following: Sekėju sąrašas
+      muting: Tildomų sąrašas
+    upload: Įkelti
+  in_memoriam_html: Atminimui.
+  invites:
+    delete: Deaktyvuoti
+    expired: Pasibaigęs
+    expires_in:
+      '1800': 30 minučių
+      '21600': 6 valandų
+      '3600': 1 valandos
+      '43200': 12 valandų
+      '604800': 1 savaitÄ—s
+      '86400': 1 dienos
+    expires_in_prompt: Niekada
+    generate: Generuoti
+    invited_by: 'Jus pakvietÄ—:'
+    max_uses:
+      few: "%{count} naudojimai"
+      one: 1 naudojimas
+      other: "%{count} naudojimai"
+    max_uses_prompt: Be limito
+    prompt: Generuoti ir dalintis įrašais su kitais, kad sukurti prieigą prie serverio
+    table:
+      expires_at: Pasibaigia
+      uses: Naudojimai
+    title: Pakviesti žmones
+  lists:
+    errors:
+      limit: Jūs pasieketė maksimalų sąrašų skaičių
+  media_attachments:
+    validations:
+      images_and_video: Negalima pridÄ—ti video prie statuso, kuris jau turi nuotraukÄ…
+      too_many: Negalima pridėti daugiau nei 4 failų
+  migrations:
+    acct: slapyvardis@domenas naujam vartotojui
+    currently_redirecting: 'Jūsų profilis nustatytas nukreipimui į:'
+    proceed: IÅ¡saugoti
+    updated_msg: Jūsų paskyros migracijos nustatymai sėkmingai pakeisti!
+  moderation:
+    title: Moderacija
+  notification_mailer:
+    digest:
+      action: Peržiurėti visus pranešimus
+      body: Čia yra trumpa santrauka žinutės, kurią jūs praleidote nuo jūsų paskutinio apsilankymo %{since}
+      mention: "%{name} paminÄ—jo jus:"
+      new_followers_summary:
+        few: Beje, jūs gavote %{count} naujų sekėjų, nuo jūsų paskutinio apsilankymo! Nuostabu!
+        one: Beje, jūs gavote naują sekėją, kol buvote atsijungęs! Yay!
+        other: Beje, jūs gavote %{count} naujų sekėjų, nuo jūsų paskutinio apsilankymo! Nuostabu!
+      subject:
+        few: "%{count} nauji pranešimai, nuo paskutinio apsilankymo\U0001F418"
+        one: "1 naujas pranešimas nuo paskutinio apsilankymo \U0001F418"
+        other: "%{count} nauji pranešimai, nuo paskutinio apsilankymo\U0001F418"
+      title: Kol jūsų nebuvo...
+    favourite:
+      body: 'Jūsų statusą pamėgo %{name}:'
+      subject: "%{name} pamėgo Jūsų statusą"
+      title: Naujas mÄ—gstamas
+    follow:
+      body: "%{name} pradÄ—jo jus sekti!"
+      subject: "%{name} pradÄ—jo jus sekti"
+      title: Naujas sekÄ—jas
+    follow_request:
+      action: Tvarkyti prašymus sekti
+      body: "%{name} nori tapti Jūsų sekėju"
+      subject: 'Laukiantis sprendimo sekÄ—jas:  %{name}'
+      title: Naujas prašymas sekti
+    mention:
+      action: Atsakyti
+      body: 'Jus paminėjo %{name} pranešime:'
+      subject: Jus paminÄ—jo %{name}
+      title: Naujas paminÄ—jimas
+    reblog:
+      body: 'Jūsų statusą pakėlė %{name}:'
+      subject: "%{name} pakėlė Jūsų statusą"
+      title: Naujas pakÄ—limas
+  number:
+    human:
+      decimal_units:
+        format: "%n%u"
+        units:
+          billion: B
+          million: M
+          quadrillion: Q
+          thousand: K
+          trillion: T
+  pagination:
+    newer: Naujesnis
+    next: Kitas
+    older: Senesnis
+    prev: Ankstesnis
+    truncate: "&hellip;"
+  preferences:
+    languages: Kalbos
+    other: Kita
+    publishing: Skelbiama
+    web: Tinklas
+  remote_follow:
+    acct: Įveskite Jūsų slapyvardį@domenas kurį norite naudoti
+    missing_resource: Jūsų paskyros nukreipimo URL nerasta
+    no_account_html: Neturite paskyros? Jūs galite<a href='%{sign_up_path}' target='_blank'> užsiregistruoti čia </a>
+    proceed: Sekti
+    prompt: 'JÅ«s seksite:'
+    reason_html: "<strong>Kodėl šis žingsnis svarbus?</strong><code>%{instance}</code> gali būti serveris, kuriame jūs nesate užsiregistravęs, todėl mes turime jus nukreipti į Jūsų namų serveri."
+  remote_interaction:
+    favourite:
+      proceed: PamÄ—gti
+      prompt: 'Jūs norite pamėgti šį toot''ą:'
+    reblog:
+      proceed: Pakelti
+      prompt: 'Jūs norite pakelti šį toot''ą:'
+    reply:
+      proceed: Atsakyti
+      prompt: 'JÅ«s norite atsakyti Å¡iam toot''ui:'
+  remote_unfollow:
+    error: Klaida
+    title: Pavadinimas
+    unfollowed: Nebesekama
+  scheduled_statuses:
+    over_daily_limit: Jūs pasieketė limitą (%{limit}) galimų toot'ų per dieną
+    over_total_limit: Jūs pasieketė %{limit} limitą galimų toot'ų
+    too_soon: Planuota data privalo būti ateityje
+  sessions:
+    activity: PaskutinÄ— veikla
+    browser: Naršyklė
+    browsers:
+      alipay: Alipay
+      blackberry: Blackberry
+      chrome: Chrome
+      edge: Microsoft Edge
+      electron: Electron
+      firefox: Firefox
+      generic: Nežinoma naršyklė
+      ie: Internet Explorer
+      micro_messenger: MicroMessenger
+      nokia: Nokia S40 Ovi Browser
+      opera: Opera
+      otter: Otter
+      phantom_js: PhantomJS
+      qq: QQ Browser
+      safari: Safari
+      uc_browser: UCBrowser
+      weibo: Weibo
+    current_session: DabartinÄ— sesija
+    description: "%{browser} ant %{platform}"
+    explanation: Čia rodomos web naršyklės prijungtos prie Jūsų Mastodon paskyros.
+    ip: IP
+    platforms:
+      adobe_air: Adobe Air
+      android: Android
+      blackberry: Blackberry
+      chrome_os: ChromeOS
+      firefox_os: Firefox OS
+      ios: iOS
+      linux: Linux
+      mac: Mac
+      other: nežinoma platforma
+      windows: Windows
+      windows_mobile: Windows Mobile
+      windows_phone: Windows Phone
+    revoke: Atšaukti
+    revoke_success: Sesija sėkmingai atšaukta
+    title: Sesijos
+  settings:
+    authorized_apps: Autorizuotos aplikacijos
+    back: Atgal į Mastodon
+    delete: Paskyros trynimas
+    development: PlÄ—tojimas
+    edit_profile: Keisti profilį
+    export: Informacijos eksportas
+    featured_tags: Rodomi saitažodžiai(#)
+    followers: Autorizuoti sekÄ—jai
+    import: Importuoti
+    migrate: Paskyros migracija
+    notifications: Pranešimai
+    preferences: Preferencijos
+    settings: Nustatymai
+    two_factor_authentication: Dviejų veiksnių autentikacija
+    your_apps: Jūsų aplikacijos
+  statuses:
+    attached:
+      description: 'PridÄ—ta: %{attached}'
+      image:
+        few: "%{count} nuotraukos"
+        one: "%{count} nuotrauka"
+        other: "%{count} nuotraukos"
+      video:
+        few: "%{count} vaizdo įrašai"
+        one: "%{count} video"
+        other: "%{count} vaizdo įrašai"
+    boosted_from_html: Pakelta iš %{acct_link}
+    content_warning: 'Turinio įspėjimas: %{warning}'
+    disallowed_hashtags:
+      few: 'rasti neleistini saitąžodžiai: %{tags}'
+      one: 'rastas neleistinas saitažodis : %{tags}'
+      other: 'rasti neleistini saitąžodžiai: %{tags}'
+    language_detection: Automatiškai nustatyti kalbą
+    open_in_web: Atidaryti naudojan Web
+    over_character_limit: pasiektas %{max} simbolių limitas
+    pin_errors:
+      limit: Jūs jau prisegėte maksimalų toot'ų skaičų
+      ownership: Kitų vartotojų toot'ai negali būti prisegti
+      private: Ne vieši toot'ai negali būti prisegti
+      reblog: Pakeltos žinutės negali būti prisegtos
+    show_more: Daugiau
+    sign_in_to_participate: Prisijunkite jeigu norite dalyvauti pokalbyje
+    title: '%{name}: "%{quote}"'
+    visibilities:
+      private: Tik sekÄ—jams
+      private_long: Rodyti tik sekÄ—jams
+      public: Viešas
+      public_long: Matyti gali visi
+      unlisted: Neįtrauktas į sąrašus
+      unlisted_long: Matyti gali visi, tačiau nėra įtraukta į viešas laiko juostas
+  stream_entries:
+    pinned: Prisegtas toot'as
+    reblogged: pakeltas
+    sensitive_content: Jautrus turinys
+  terms:
+    body_html: |
+      <h2>Privatumo politika</h2>
+      <h3 id="collect">Kokia informacija yra renkama?</h3>
+      <ul>
+      <li><em>Paprasa paskyros informacija</em>: Jeigu Jūs užsiregistruojate šiame serveryje, Jūsų gali paklausti, kad įrašytumėte slapyvardį, el pašto adresą ir paskyros slaptąžodį. Jūs irgi galite įrašyti papildomą profilio informaciją, tokią kaip rodomas vardas ir biografiją bei įkelti profilio nuotrauką ir antraštės nuotrauką. Slapyvardis , rodomas vardas, biografija, profilio nuotrauka ir antraštės nuotrauka visada viešai prieinama informacija.</li>
+      <li><em>Įrašai, sekami ir kita vieša informacija</em>: Sąrašas žmonių, kuriuos Jūs sekate yra matomas viešai, taip pat kaip ir Jūsų sekėjams. Kai Jūs išsiunčiate žinutę, data ir laikas yra išsaugomi bei aplikacija iš kurios jūs išsiuntėte žinutę. Žinutėse gali būti prisegtų medijos failų kaip vaizdo įrašai bei nuotraukos. Viešos ir neįtrauktos į sąrašus žinutės yra viešai prieinamos. Kai nusprendžiate rodyti pranešimą ant savo profilio, tai irgi yra viešai prieinama informacija. Jūsų pranešimai yra pristatomi Jūsų sekėjams, kai kuriais atvėjais tai gali reikšti, kad šie pranešimai yra pristatomi į kitus serverius ir saugomi ten. Kai Jūs ištrinate įrašus, šie įrašai ištrinami ir Jūsų sekėjams. Veiksmas pamėgti kitus įrašus irgi yra viešas.
+      </li><li><em>Tiesioginiai ir tik sekėjams įrašai</em>: Visi įrašai yra saugomi ir apdorojami serveryje. Tik sekėjams įrašai yra pristatomi Jūsų sekėjams ir vartotojams, kurie yra paminėti įrašuose, ir tiesioginiai įrašai pristatomi tik vartotojams, kurie yra paminėti įraše. Kai kuriais atvėjais tai gali reikšti, kad šie įrašai yra pristatomi į kitą serverį ir įrašų kopijos saugomos ten. Mes stengiames riboti prieigą prie šių pranešimų tiktai autorizuotiems gavėjams, tačiau kiti serveriai to gali nedaryti. Todėl yra svarbu peržiurėti serverius, kuriems Jūsų sekėjai priklauso. Jūs galite įjungti būseną nustatymuose, kad galėtumetė priimti arba atmesti naujas sekimo užklausas.<em> Prašome nepamiršti, kad serverio operatoriai ir kiti serveriai, kurie gauna šias žinutes, gali jas peržiurėti </em> bei, kad gavėjai gali padaryti foto kopija, tektso kopija ar kitaip pasidalinti Jūsų žinutėmis.<em> Nesidalinkite jokia jautria ar pavojinga informacija naudojantis Mastodon.</em></li>
+      <li><em>IP adresai ir kiti metaduomenys</em>: Kai prisijungiate, mes įrašome IP adresą iš kurio jūs prisijungėte, ir naudojamos naršyklės pavadinimą. Visos prisijungimo sesijos yra prieinamos Jūsų apžvalgai ir atšaukimams nustatymuose. Paskutiniai IP adresai yra saugomi iki 12-kos mėnesių. Mes taipogi galime pasilikti serverio registrą, kuriuose yra saugoma IP adresai iš visų bandymu prisijungti prie serverio prašant informacijos.
+      </li></ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Kam mes naudojame Jūsų informaciją?</h3>
+      <p>Visa surinkta informacija apie jus, gali būti panaudota šiems tikslams: </p>
+      <ul>
+      <li>Suteikti pagrindį Mastodon funkcialumą. Jūs galite sąveikauti su kitų vartotojų turiniu ir kelti sąvajį, kuomet esate prisijungęs. Pavyzdžiui, galite sekti kitus žmones, peržiūrėti jų sujungtus įrašus savo pačio personalizuotoje laiko juostoje. </li>
+      <li>Padėti bendruomenės moderavimui, pavyzdžiui, lyginant Jūsų IP adresą, su kitu žinomu IP adresu, kad nustatyti bandymus vengti užblokavimo.</li>
+      <li>Jūsų el pašto adresas gali būti naudojamas išsiųsti informacija jums, priminimus apie kitų vartotojų interakciją su jūsų paskyra, pavyzdžiui, kai jie jums siunčia žinutes, ir atsakyti į užklausas ir/arba kitais klausimais. </li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Kaip mes saugome Jūsų informacija? </h3>
+
+      <p>Mes implementavome saugumo priemones, tam, kad apsaugotume Jūsų privačią informaciją. Tarp šių dalykų, Jūsų naršyklės sesija, taip pat ir eismas tarp Jūsų aplikacijos ir API yra apsaugoti SSL, ir Jūsų slaptažodis yra užsifruotas sudėtingu algoritmu. Jūs galite įjungti dviejų veiksnių autentikaciją savo paskyrai, taip apsaugodami ją dar daugiau.
+      </p>
+
+      <hr class="spacer" />
+      <h3 id="data-retention"> Kokia yra mūsų duomenų laikymo politika? </h3>
+
+      <p>Mes stengiamÄ—s:</p>
+
+      <ul>
+      <li> Išsaugoti serverio registrą, kuriame yra visi IP adresai, kurie kreipėsi į serverį, šie duomenys laikomi neilgiau nei 90 dienų.</li>
+      <li> Išsaugoti IP adresus asocijuotus su registruotais vartotojais, ne ilgiau nei 12 mėnesių.</li>
+      </ul>
+
+      <p> Jūs galite pateikti prašymą ir parsisiųsti savo turinio archyvą, kuriame bus Jūsų įrašai, medijos failai, profilio nuotrauka ir antraštės nuotrauka.</p>
+
+      <p> Jūs galite VISIŠKAI ištrinti savo paskyrą bet kuriuo metu.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">Ar mes naudojame sausainiukus?</h3>
+
+      <p> Taip. Sausainiukai yra mažos apimties failai, kuriuos svetainė arba svetainės tiekėjas perkelia į Jūsų kompiuterio kietąjį diską naudojantis interneto naršykle (jeigu jūs leidžiate). Šie sausainiai leidžia svetainiai prisiminti Jūsų naršyklę ir jeigu turite registruotą vartotoją, ji asocijuoti su Jūsu vartotoju.</p>
+      <p>Mes naudojame sausainius, kad suprastumėme ir išsaugotumėme Jūsų poreikius kitam apsilankymui.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">Ar mes atskleidžiame Jūsų informacija kitoms šalims?</h3>
+
+      <p>Mes neparduodame, nesikeičiame, ar kitaip mainomės Jūsų privačiais duomenimis su trečiosiomis šalimis. Į šį sąrašą neįeina patikimos trečiosios šalys, kurios padeda mums naudotis tinklalapiu, daryti verslą, ar padėti jums, tol, kol šios šalys sutinka laikyti šią informaciją konfidencialiai. Mes taippat galime paviešinti Jūsų informaciją, jeigu manome, kad Jūs pažeidėte įstatymus, naudojimosi politiką, ar apsaugoti, ginti Jūsų, mūsų ar kitų teises. </p>
+
+      <p>Jūsų vieši duomenys gali būti atsisiųsti kitų serverių esančių tinkle. Jūsų vieši bei tik sekėjams skirti įrašai pristatomi serveriams, kuriuose Jūsų sekėjai egzistuoja, o tiesioginės žinutės pristatomos tiesiai į gavėjo serverį, tol, kol šie sekėjai ar gavėjai yra naudotojai iš kitų serverių. </p>
+
+      <p>Kai jūs patvirtinate Jūsų paskyros naudojimą aplikacijai, atitinkamai priklausant nuo leidimų, kuriuos jūs suteikėte, aplikacija turi prieiga prie Jūsų viešojo profilio informacijos, Jūsų sekėjų sąrašo, sekamų sąrašo, visų Jūsų įrašų, ir pamėgtų įrašų.
+      Aplikacijos niekada negali turėti prieigos prie Jūsų el pašto adreso arba slaptažodžio.</p>
+
+      <hr class="spacer" />
+
+
+      <h3 id="children">Tinklalapio naudojimas nepilnamečiams</h3>
+
+      <p> Jeigu serveris yra EU arba EEA: Mūsų tinklalapis, produktai ir visi teikiami aptarnavimai yra teikiami tik žmonėms, kuriems yra bent 16 metų. Jeigu jums yra mažiau nei 16 metų, sekant GDPR reikalavimais (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>) prašome nenaudoti šios svetainės. </p>
+
+      <p> Jeigu šis serveris yra USA: Mūsų tinklalapis, produktai ir visi teikiami aptarnavimai yra teikiami žmonėms, kuriems yra bent 13 metų. Jeigu jums mažiau nei 13 metų, sekant COPPA reikalavimais (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>) prašome nenaudotis šios svetainės.</p>
+
+      <p>Legalūs reikalavimai gali būti kitokie, jeigu serveris yra kitoje jurisdikcijoje.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Pasikeitimai mūsų privatumo politikoje</h3>
+
+      <p>Jeigu mes nusprendžiame pakeisti savo privatumo politiką, mes įrašysime šiuos pakeitimus šiame tinklalapyje.</p>
+
+      <p>Šis dokumentas yra CC-BY-SA. Paskutinį kartą keistas Kovo 7, 2018.</p>
+
+      <p>Originaliai adaptuotas iš <a href="https://github.com/discourse/discourse">Discourse privatumo politika</a>.</p>
+    title: "%{instance} Naudojimosi SÄ…lygos ir Privatumo Politika"
+  themes:
+    contrast: Mastodon (Didelio Kontrasto)
+    default: Mastodon (Tamsus)
+    mastodon-light: Mastodon (Å viesus)
+  time:
+    formats:
+      default: "%b %d, %Y, %H:%M"
+      month: "%b %Y"
+  two_factor_authentication:
+    code_hint: Įveskite autentikacijos aplikacijos sugeneruotą kodą kad galėtumete tęsti
+    description_html: Jeigu įjungiate <strong>dviejų veiksnių autentikaciją</strong>, prisijungiant jums reikės turėti su savimi savo telefoną, kuris jums generuos prisijungimo žetonus.
+    disable: IÅ¡jungti
+    enable: Įjungti
+    enabled: Dviejų veiksnių autentikacija įjungta
+    enabled_success: Dviejų veiksnių autentikacija sėkmingai įjungta
+    generate_recovery_codes: Sugeneruoti atkūrimo kodus
+    instructions_html: "<strong>Nuskenuokite šį QR kodą į Google Autentikatorių arba panašią TOTP aplikaciją jūsų telefone</strong>. Nuo šiol, ši aplikacija jums generuos žetonus, kurių reikės norint prisijungti."
+    lost_recovery_codes: Atkūrimo kodai jums leidžia atgauti prisijungimą prie Jūsų paskyros, jeigu prarandate telefoną. Jeigu praradote atkūrimo kodus, juos galite sugeneruoti čia. Jūsų senieji atkūrimo kodai nebeveiks.
+    manual_instructions: 'Jeigu jūs negalite nuskenuoti QR kodo ir turite jį įvesti savarankiškai, štai čia yra tekstas šiam kodui:'
+    recovery_codes: Atsarginio atkūrimo kodai
+    recovery_codes_regenerated: Atkūrimo kodai sėkmingai sugeneruoti
+    recovery_instructions_html: Jeigu prarandate prieiga prie telefono, jūs galite naudoti atkūrimo kodus esančius žemiau, kad atgautumėte priega prie savo paskyros.<strong>Laikykite atkūrimo kodus saugiai</strong> Pavyzdžiui, galite norėti juos išspausdinti, ir laikyti kartu su kitais svarbiais dokumentais.
+    setup: Nustatyti
+    wrong_code: Koda netinkamas! Ar serverio laikas ir prietaiso laikas vienodi?
+  user_mailer:
+    backup_ready:
+      explanation: Jūs prašėte pilnos Mastodon paskyros atsarginės kopijos. Ji paruošta parsisiuntimui!
+      subject: Jūsų archyvas paruoštas parsisiuntimui
+      title: Archyvas išimtas
+    warning:
+      explanation:
+        disable: Kol Jūsų paskyra užšaldyta, Jūsų duomenys tebėra matomi, tačiau jūs negalite atlikti jokių veiksmu, tol, kol užšaldymas panaikintas.
+        silence: Kol Jūsų paskyra limituota, tik žmonės, kurie jus jau sekė matus Jūsų toot'us serveryje, Jūs taip pat būsite išimtas iš viešųjų sąrašų. Tačiau, kiti gali jus rasti, savo rankomis.
+        suspend: Jūsų paskyra buvo užrakinta, ir visi Jūsų toot'ai, medijos failai, buvo panaikinti iš šio serverio, ir visų kitų serverių, kur turėjote sekėjų.
+      review_server_policies: Apžvelgti serverio politiką
+      subject:
+        disable: Jūsų paskyra %{acct} buvo užšaldyta
+        none: Įspėjmas vartotojui %{acct}
+        silence: Jūsų paskyra %{acct} buvo limituota
+        suspend: Jūsų paskyra %{acct} buvo užrakinta
+      title:
+        disable: Paskyra užšaldyta
+        none: Įspėjimas
+        silence: Paskyra limituota
+        suspend: Paskyra užrakinta
+    welcome:
+      edit_profile_action: Nustatyti profilį
+      edit_profile_step: Jūs galite keisti savo profilį įkeldami profilio nuotrauką, antraštę, pakeičiant savo rodomą vardą ir dar daugiau. Jeigu norėtumete peržiurėti naujus sekėjus prieš leidžiant jiems jus sekti, galite užrakinti savo paskyrą.
+      explanation: Štai keletas patarimų Jums
+      final_action: Pradėti kelti įrašus
+      final_step: 'Pradėk kelti įrašus! Net jeigu neturi sekėjų, Jūsų viešos žinutės gali būti matomos kitų, pavyzdžiui, lokalioje laiko juostoje ir saitažodžiuose. Galite norėti prisistatyti naudojan saitąžodį #introductions.'
+      full_handle: Jūsų pilnas slapyvardis
+      full_handle_hint: Štai ką jūs sakytumėte savo draugams, kad jie galėtų jums siųsti žinutes arba just sekti iš kitų serverių.
+      review_preferences_action: Pakeisti pasirinkimus
+      review_preferences_step: Nustatykite savo pasirinkimus, tokius kaip el pašto laiškai, kuriuos norėtumėte gauti, arba kokiu privatumo lygiu norėtumėte, kad jūsų įrašai būtų talpinami, taip pat galite įjungti automatinį GIF paleidimą.
+      subject: Sveiki atvykę į Mastodon
+      tip_federated_timeline: Federuota laiko juosta yra lyg gaisrininkų žarną rodanti Mastodon tinklą. Tačiau, joje rodomi tik žmonės kurie yra sekami Jūsų kaimynų.
+      tip_following: Jūs sekate savo serverio administratorius numatyta tvarka. Norint rasti įdomesnių žmonių, patikrinkite lokalią bei federuotą laiko juostas.
+      tip_local_timeline: Lokali laiko juosta, joje rodomi žmonės iš %{instance}. Jie yra Jūsų artimiausi kaimynai!
+      tip_mobile_webapp: Jeigu Jūsų mobilioji naršyklė leidžia jums pridėti Mastodon prie namų ekrano, jūs galite gauti priminimus. Tai gali veikti kaip vietinė aplikacija!
+      tips: Patarimai
+      title: Sveiki atvykÄ™, %{name}!
+  users:
+    follow_limit_reached: Negalite sekti daugiau nei %{limit} žmonių
+    invalid_email: Netinkamas el pašto adresas
+    invalid_otp_token: Netinkamas dviejų veiksnių kodas
+    otp_lost_help_html: Jeigu praradote prieiga prie abiejų, susisiekite su mumis per %{email}
+    seamless_external_login: Jūs esate prisijungę per išorini įrenginį, todėl slaptąžodis ir el pašto nustatymai neprieinami.
+    signed_in_as: 'Prisijungta kaip:'
+  verification:
+    explanation_html: 'Jūs galite <strong>patvirtinti savę kaip savininką nuorodų savo profilio meta duomenyse</strong>. Kad tai padarytumėte, susieta svetainė privalo turėti nuorodą atgal į Jūsų Mastodon profilį. Nuoroda atgal <strong> privalo </strong> turėti <code>rel="me"</code> savybę. Teksto turinys nuorodoje nesvarbus. Štai pavyzdys:'
+    verification: Patvirtinimas
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index e0d7a4a02a..2ba99463bb 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -423,7 +423,7 @@ nl:
         desc_html: Dit wordt als een alinea op de voorpagina getoond. Beschrijf wat er speciaal is aan deze server en andere zaken die van belang zijn. Je kan HTML gebruiken, zoals <code>&lt;a&gt;</code> en <code>&lt;em&gt;</code>.
         title: Omschrijving Mastodonserver
       site_description_extended:
-        desc_html: Wordt op de uitgebreide informatiepagina weergegeven<br>Je kan ook hier HTML gebruiken
+        desc_html: Een goede plek voor je gedragscode, regels, richtlijnen en andere zaken die jouw server uniek maken. Je kan ook hier HTML gebruiken
         title: Uitgebreide omschrijving Mastodonserver
       site_short_description:
         desc_html: Dit wordt in de zijbalk getoond als en als metatag in de paginabron.  Beschrijf in één alinea wat Mastodon is en wat deze server speciaal maakt. De (langere) omschrijving van de Mastodonserver wordt gebruikt wanneer dit veld wordt leeg gelaten.
@@ -577,7 +577,7 @@ nl:
     archive_takeout:
       date: Datum
       download: Jouw archief downloaden
-      hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. Je kunt elke 7 dagen een kopie van je archief aanvragen.
+      hint_html: Je kunt een archief opvragen van jouw <strong>toots en geüploade media</strong>. De geëxporteerde gegevens zijn in het ActivityPub-formaat, dat door hiervoor geschikte software valt uit te lezen. Je kunt elke 7 dagen een kopie van je archief aanvragen.
       in_progress: Jouw archief wordt samengesteld...
       request: Jouw archief opvragen
       size: Omvang
@@ -588,6 +588,10 @@ nl:
     lists: Lijsten
     mutes: Jij negeert
     storage: Mediaopslag
+  featured_tags:
+    add_new: Nieuwe toevoegen
+    errors:
+      limit: Je hebt al het maximaal aantal hashtags uitgelicht
   filters:
     contexts:
       home: Starttijdlijn
@@ -628,10 +632,16 @@ nl:
       one: Er is iets niet helemaal goed! Bekijk onderstaande fout
       other: Er is iets niet helemaal goed! Bekijk onderstaande %{count} fouten
   imports:
+    modes:
+      merge: Samenvoegen
+      merge_long: Bestaande gegevens behouden en nieuwe toevoegen
+      overwrite: Overschrijven
+      overwrite_long: Huidige gegevens met de nieuwe gegevens vervangen
     preface: Je kunt bepaalde gegevens, zoals de mensen die jij volgt of hebt geblokkeerd, naar jouw account op deze server importeren. Je moet deze gegevens wel eerst op de oorspronkelijke server exporteren.
     success: Jouw gegevens zijn succesvol geüpload en worden binnenkort verwerkt
     types:
       blocking: Blokkeerlijst
+      domain_blocking: Lijst met genegeerde servers
       following: Volglijst
       muting: Negeerlijst
     upload: Uploaden
@@ -801,6 +811,7 @@ nl:
     development: Ontwikkelaars
     edit_profile: Profiel bewerken
     export: Exporteren
+    featured_tags: Uitgelichte hashtags
     followers: Geautoriseerde volgers
     import: Importeren
     migrate: Accountmigratie
@@ -929,8 +940,8 @@ nl:
       <p>Originally adapted from the <a href="https://github.com/discourse/discourse">Discourse privacy policy</a>.</p>
     title: Gebruiksvoorwaarden en privacybeleid van %{instance}
   themes:
-    contrast: Hoog contrast
-    default: Mastodon
+    contrast: Mastodon (hoog contrast)
+    default: Mastodon (donker)
     mastodon-light: Mastodon (licht)
   time:
     formats:
@@ -946,7 +957,7 @@ nl:
     generate_recovery_codes: Herstelcodes genereren
     instructions_html: "<strong>Scan deze QR-code in Google Authenticator of een soortgelijke app op jouw mobiele telefoon</strong>. Van nu af aan genereert deze app aanmeldcodes die je bij het inloggen moet invoeren."
     lost_recovery_codes: Met herstelcodes kun je toegang tot jouw account krijgen wanneer je jouw telefoon bent kwijtgeraakt. Wanneer je jouw herstelcodes bent kwijtgeraakt, kan je ze hier opnieuw genereren. Jouw oude herstelcodes zijn daarna ongeldig.
-    manual_instructions: Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder geheime code in gewone tekst.
+    manual_instructions: Voor het geval je de QR-code niet kunt scannen en het handmatig moet invoeren, vind je hieronder geheime code in platte tekst.
     recovery_codes: Herstelcodes back-uppen
     recovery_codes_regenerated: Opnieuw genereren herstelcodes geslaagd
     recovery_instructions_html: Wanneer je ooit de toegang verliest tot jouw telefoon, kan je met behulp van een van de herstelcodes hieronder opnieuw toegang krijgen tot jouw account. <strong>Zorg ervoor dat je de herstelcodes op een veilige plek bewaard</strong>. Je kunt ze bijvoorbeeld printen en ze samen met andere belangrijke documenten bewaren.
diff --git a/config/locales/simple_form.ar.yml b/config/locales/simple_form.ar.yml
index ef1d269eea..14fcfdbd93 100644
--- a/config/locales/simple_form.ar.yml
+++ b/config/locales/simple_form.ar.yml
@@ -33,8 +33,10 @@ ar:
         setting_noindex: ذلك يؤثر على حالة ملفك الشخصي و صفحاتك
         setting_theme: ذلك يؤثر على الشكل الذي سيبدو عليه ماستدون عندما تقوم بالدخول مِن أي جهاز.
         username: اسم المستخدم الخاص بك سوف يكون فريدا مِن نوعه على %{domain}
+      featured_tag:
+        name: 'رُبَّما تريد/ي استخدام أحد هؤلاء:'
       imports:
-        data: ملف CSV تم تصديره مِن مثيل خادوم ماستدون آخر
+        data: ملف CSV تم تصديره مِن خادوم ماستدون آخر
       sessions:
         otp: 'قم بإدخال رمز المصادقة بخطوتين الذي قام بتوليده تطبيق جهازك أو إستخدم أحد رموز النفاذ الإحتياطية :'
       user:
@@ -97,6 +99,7 @@ ar:
         setting_hide_network: إخفِ شبكتك
         setting_noindex: عدم السماح لمحركات البحث بفهرسة ملفك الشخصي
         setting_reduce_motion: تخفيض عدد الصور في الوسائط المتحركة
+        setting_show_application: إكشف/ي البرامج التي كانت تُرسل تبويقات
         setting_system_font_ui: إستخدم الخطوط الإفتراضية للنظام
         setting_theme: سمة الموقع
         setting_unfollow_modal: إظهار مربع حوار للتأكيد قبل إلغاء متابعة أي حساب
@@ -105,6 +108,8 @@ ar:
         username: إسم المستخدم
         username_or_email: إسم المستخدم أو كلمة السر
         whole_word: الكلمة كاملة
+      featured_tag:
+        name: وسم
       interactions:
         must_be_follower: حظر الإخطارات القادمة من حسابات لا تتبعك
         must_be_following: حظر الإخطارات القادمة من الحسابات التي لا تتابعها
diff --git a/config/locales/simple_form.co.yml b/config/locales/simple_form.co.yml
index 2fb0355569..53e48d7587 100644
--- a/config/locales/simple_form.co.yml
+++ b/config/locales/simple_form.co.yml
@@ -33,11 +33,14 @@ co:
         setting_display_media_show_all: Sempre affissà i media marcati cum'è sensibili
         setting_hide_network: I vostri abbunati è abbunamenti ùn saranu micca mustrati nant’à u vostru prufile
         setting_noindex: Tocca à u vostru prufile pubblicu è i vostri statuti
+        setting_show_application: L'applicazione chì voi utilizate per mandà statuti sarà affissata indè a vista ditagliata di quelli
         setting_theme: Tocca à l’apparenza di Mastodon quandu site cunnettatu·a da qualch’apparechju.
         username: U vostru cugnome sarà unicu nant'à %{domain}
         whole_word: Quandu a parolla o a frasa sana hè alfanumerica, sarà applicata solu s'ella currisponde à a parolla sana
+      featured_tag:
+        name: 'Pudete vulè utilizà unu di quelli:'
       imports:
-        data: Un fugliale CSV da un’altr’istanza di Mastodon
+        data: Un fugliale CSV da un’altru servore di Mastodon
       sessions:
         otp: 'Entrate u codice d’identificazione à dui fattori nant’à u vostru telefuninu, o unu di i vostri codici di ricuperazione:'
       user:
@@ -100,6 +103,7 @@ co:
         setting_hide_network: Piattà a vostra rete
         setting_noindex: Dumandà à i motori di ricerca internet d’un pudè micca esse truvatu·a cusì
         setting_reduce_motion: Fà chì l’animazione vanu più pianu
+        setting_show_application: Indicà u nome di l'applicazione utilizata per mandà statuti
         setting_system_font_ui: Pulizza di caratteri di u sistemu
         setting_theme: Tema di u situ
         setting_unfollow_modal: Mustrà una cunfirmazione per siguità qualch’unu
@@ -108,6 +112,8 @@ co:
         username: Cugnome
         username_or_email: Cugnome o Email
         whole_word: Parolla sana
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Piattà e nutificazione di quelli·e ch’ùn vi seguitanu
         must_be_following: Piattà e nutificazione di quelli·e ch’ùn seguitate
diff --git a/config/locales/simple_form.cs.yml b/config/locales/simple_form.cs.yml
index 99127c2b68..2107530b50 100644
--- a/config/locales/simple_form.cs.yml
+++ b/config/locales/simple_form.cs.yml
@@ -33,9 +33,12 @@ cs:
         setting_display_media_show_all: Vždy zobrazovat média označená jako citlivá
         setting_hide_network: Koho sledujete a kdo sleduje vás nebude zobrazeno na vašem profilu
         setting_noindex: Ovlivňuje váš veřejný profil a stránky příspěvků
+        setting_show_application: Aplikace, kterou používáte psaní tootů, bude zobrazena v detailním zobrazení vašich tootů
         setting_theme: Ovlivňuje jak Mastodon vypadá, jste-li přihlášen na libovolném zařízení.
         username: Vaše uživatelské jméno bude na %{domain} unikátní
         whole_word: Je-li klíčové slovo či fráze pouze alfanumerická, bude aplikována pouze, pokud se shoduje s celým slovem
+      featured_tag:
+        name: 'Nejspíš budete chtít použít jeden z těchto:'
       imports:
         data: Soubor CSV exportovaný z jiného serveru Mastodon
       sessions:
@@ -100,6 +103,7 @@ cs:
         setting_hide_network: Skrýt svou síť
         setting_noindex: Neindexovat svůj profil vyhledávači
         setting_reduce_motion: Redukovat pohyb v animacích
+        setting_show_application: Zobrazit aplikaci používanou k psaní tootů
         setting_system_font_ui: Použít výchozí písmo systému
         setting_theme: Motiv stránky
         setting_unfollow_modal: Zobrazovat před zrušením sledování potvrzovací okno
@@ -108,6 +112,8 @@ cs:
         username: Uživatelské jméno
         username_or_email: Uživatelské jméno nebo e-mail
         whole_word: Celé slovo
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Blokovat oznámení od lidí, kteří vás nesledují
         must_be_following: Blokovat oznámení od lidí, které nesledujete
diff --git a/config/locales/simple_form.da.yml b/config/locales/simple_form.da.yml
index f73dbac963..483be70552 100644
--- a/config/locales/simple_form.da.yml
+++ b/config/locales/simple_form.da.yml
@@ -29,7 +29,7 @@ da:
         username: Dit brugernavn vil være unikt på %{domain}
         whole_word: Når nøgle ordet eller udtrykket kun er alfanumerisk, vil det kun blive brugt hvis det passer hele ordet
       imports:
-        data: CSV fil eksporteret fra en anden Mastodon instans
+        data: CSV fil eksporteret fra en anden Mastodon server
       sessions:
         otp: 'Indtast to-faktor koden der generes af appen af appen på din telefon eller brug en af din genoprettelses koder:'
       user:
diff --git a/config/locales/simple_form.de.yml b/config/locales/simple_form.de.yml
index 3958e315f6..6dbfd17c07 100644
--- a/config/locales/simple_form.de.yml
+++ b/config/locales/simple_form.de.yml
@@ -33,11 +33,14 @@ de:
         setting_display_media_show_all: Medien, die als sensibel markiert sind, immer anzeigen
         setting_hide_network: Wem du folgst und wer dir folgt, wird in deinem Profil nicht angezeigt
         setting_noindex: Betrifft dein öffentliches Profil und deine Beiträge
+        setting_show_application: Die Anwendung, die du zum Schreiben von Beiträgen benutzt wird in der detaillierten Ansicht deiner Beiträge angezeigt
         setting_theme: Wirkt sich darauf aus, wie Mastodon aussieht, egal auf welchem Gerät du eingeloggt bist.
         username: Dein Benutzer:innen-Name wird auf %{domain} nur einmal vorkommen
         whole_word: Wenn das Schlagwort oder die Phrase nur Buchstaben und Zahlen enthält, wird es nur angewendet, wenn es dem ganzen Wort entspricht
+      featured_tag:
+        name: 'Du möchtest vielleicht einen von diesen benutzen:'
       imports:
-        data: CSV-Datei, die aus einer anderen Mastodon-Instanz exportiert wurde
+        data: CSV-Datei, die aus einem anderen Mastodon-Server exportiert wurde
       sessions:
         otp: 'Gib den Zwei-Faktor-Authentisierungscode von deinem Telefon ein oder benutze einen deiner Wiederherstellungscodes:'
       user:
@@ -74,7 +77,7 @@ de:
         email: E-Mail-Adresse
         expires_in: Läuft ab
         fields: Profil-Metadaten
-        header: Kopfbild
+        header: Titelbild
         inbox_url: Inbox-URL des Relays
         irreversible: Verwerfen statt verstecken
         locale: Sprache der Benutzeroberfläche
@@ -100,6 +103,7 @@ de:
         setting_hide_network: Blende dein Netzwerk aus
         setting_noindex: Suchmaschinen-Indexierung verhindern
         setting_reduce_motion: Bewegung in Animationen verringern
+        setting_show_application: Anwendung preisgeben, die benutzt wurde um Beiträge zu versenden
         setting_system_font_ui: Standardschriftart des Systems verwenden
         setting_theme: Theme der Website
         setting_unfollow_modal: Bestätigungsdialog anzeigen, bevor jemandem entfolgt wird
@@ -108,6 +112,8 @@ de:
         username: Profilname
         username_or_email: Profilname oder E-Mail
         whole_word: Ganzes Wort
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Benachrichtigungen von Nicht-Folgenden blockieren
         must_be_following: Benachrichtigungen von Profilen blockieren, denen ich nicht folge
diff --git a/config/locales/simple_form.el.yml b/config/locales/simple_form.el.yml
index fecddd11f5..3d812204c3 100644
--- a/config/locales/simple_form.el.yml
+++ b/config/locales/simple_form.el.yml
@@ -33,9 +33,12 @@ el:
         setting_display_media_show_all: Μόνιμη εμφάνιση ευαίσθητων πολυμέσων
         setting_hide_network: Δε θα εμφανίζεται στο προφίλ σου ποιους ακολουθείς και ποιοι σε ακολουθούν
         setting_noindex: Επηρεάζει το δημόσιο προφίλ και τις δημοσιεύσεις σου
+        setting_show_application: Η εφαρμογή που χρησιμοποιείς για να στέλνεις τα τουτ σου θα εμφανίζεται στις αναλυτικές λεπτομέρειες τους
         setting_theme: Επηρεάζει την εμφάνιση του Mastodon όταν συνδέεται από οποιαδήποτε συσκευή.
         username: Το όνομα χρήστη σου θα είναι μοναδικό στο %{domain}
         whole_word: Όταν η λέξη ή η φράση κλειδί είναι μόνο αλφαριθμητική, θα εφαρμοστεί μόνο αν ταιριάζει με ολόκληρη τη λέξη
+      featured_tag:
+        name: 'Ίσως να θες να χρησιμοποιήσεις μια από αυτές:'
       imports:
         data: Αρχείο CSV που έχει εξαχθεί από διαφορετικό κόμβο Mastodon
       sessions:
@@ -100,6 +103,7 @@ el:
         setting_hide_network: Κρύψε τις διασυνδέσεις σου
         setting_noindex: Επέλεξε να μην συμμετέχεις στα αποτελέσματα μηχανών αναζήτησης
         setting_reduce_motion: Μείωση κίνησης κινουμένων στοιχείων
+        setting_show_application: Να αποκαλύπτεται η εφαρμογή που χρησιμοποιήθηκε για την αποστολή των τουτ
         setting_system_font_ui: Χρησιμοποίησε την προεπιλεγμένη γραμματοσειρά του συστήματος
         setting_theme: Θέμα ιστότοπου
         setting_unfollow_modal: Εμφάνιση ερώτησης επιβεβαίωσης πριν διακόψεις την παρακολούθηση κάποιου
@@ -108,6 +112,8 @@ el:
         username: Όνομα χρηστη
         username_or_email: Όνομα ή διεύθυνση email χρήστη
         whole_word: Ολόκληρη λέξη
+      featured_tag:
+        name: Ταμπέλα
       interactions:
         must_be_follower: Μπλόκαρε τις ειδοποιήσεις από όσους δεν ακολουθείς
         must_be_following: Μπλόκαρε τις ειδοποιήσεις που προέρχονται από άτομα που δεν τα ακολουθείς
diff --git a/config/locales/simple_form.eo.yml b/config/locales/simple_form.eo.yml
index b78d2dd813..6cffcc0d15 100644
--- a/config/locales/simple_form.eo.yml
+++ b/config/locales/simple_form.eo.yml
@@ -2,6 +2,10 @@
 eo:
   simple_form:
     hints:
+      account_warning_preset:
+        text: Vi povas uzi skribmanierojn de mesaĝoj, kiel URL-ojn, kradvortojn kaj menciojn
+      admin_account_action:
+        send_email_notification: La uzanto ricevos klarigon pri tio, kio okazis al ties konto
       defaults:
         autofollow: Homoj, kiuj registriĝos per la invito aŭtomate sekvos vin
         avatar: Formato PNG, GIF aÅ­ JPG. Äœis %{size}. Estos malgrandigita al %{dimensions}px
diff --git a/config/locales/simple_form.eu.yml b/config/locales/simple_form.eu.yml
index 2b9c2bb811..f4fadb29d6 100644
--- a/config/locales/simple_form.eu.yml
+++ b/config/locales/simple_form.eu.yml
@@ -33,11 +33,14 @@ eu:
         setting_display_media_show_all: Erakutsi beti hunkigarri gisa markatutako multimedia
         setting_hide_network: Nor jarraitzen duzun eta nork jarraitzen zaituen ez da bistaratuko zure profilean
         setting_noindex: Zure profil publiko eta Toot-en orrietan eragina du
+        setting_show_application: Tootak bidaltzeko erabiltzen duzun aplikazioa zure tooten ikuspegi xehetsuan bistaratuko da
         setting_theme: Edozein gailutik konektatzean Mastodon-en itxuran eragiten du.
         username: Zure erabiltzaile-izena bakana izango da %{domain} domeinuan
         whole_word: Hitz eta esaldi gakoa alfanumerikoa denean, hitz osoarekin bat datorrenean besterik ez da aplikatuko
+      featured_tag:
+        name: 'Hauetakoren bat erabili zenezake:'
       imports:
-        data: Beste Mastodon instantzia batetik esportatutako CSV fitxategia
+        data: Beste Mastodon zerbitzari batetik esportatutako CSV fitxategia
       sessions:
         otp: 'Sartu zure telefonoko aplikazioak sortutako bi faktoreetako kodea, edo erabili zure berreskuratze kodeetako bat:'
       user:
@@ -100,6 +103,7 @@ eu:
         setting_hide_network: Ezkutatu zure sarea
         setting_noindex: Atera bilaketa motorraren indexaziotik
         setting_reduce_motion: Murriztu animazioen mugimenduak
+        setting_show_application: Utzi agerian tootak bidaltzeko erabilitako aplikazioa
         setting_system_font_ui: Erabili sistemako tipografia lehenetsia
         setting_theme: Gunearen gaia
         setting_unfollow_modal: Erakutsi baieztapen elkarrizketa-koadroa inor jarraitzeari utzi aurretik
@@ -108,6 +112,8 @@ eu:
         username: Erabiltzaile-izena
         username_or_email: Erabiltzaile-izena edo e-mail helbidea
         whole_word: Hitz osoa
+      featured_tag:
+        name: Traola
       interactions:
         must_be_follower: Blokeatu jarraitzaile ez direnen jakinarazpenak
         must_be_following: Blokeatu zuk jarraitzen ez dituzunen jakinarazpenak
diff --git a/config/locales/simple_form.fa.yml b/config/locales/simple_form.fa.yml
index 2eeacade62..f6e654d7b2 100644
--- a/config/locales/simple_form.fa.yml
+++ b/config/locales/simple_form.fa.yml
@@ -18,6 +18,7 @@ fa:
         password: دست‌کم باید ۸ نویسه داشته باشد
         phrase: مستقل از کوچکی و بزرگی حروف، با متن اصلی یا هشدار محتوای بوق‌ها مقایسه می‌شود
         scopes: واسط‌های برنامه‌نویسی که این برنامه به آن دسترسی دارد. اگر بالاترین سطح دسترسی را انتخاب کنید، دیگر نیازی به انتخاب سطح‌های پایینی ندارید.
+        setting_aggregate_reblogs: برای بازبوق‌هایی که به تازگی برایتان نمایش داده شده‌اند، بازبوق‌های بیشتر را نشان نده (فقط روی بازبوق‌های اخیر تأثیر می‌گذارد)
         setting_default_language: زبان نوشته‌های شما به طور خودکار تشخیص داده می‌شود، ولی این تشخیص همیشه دقیق نیست
         setting_display_media_default: تصویرهایی را که به عنوان حساس علامت زده شده‌اند پنهان کن
         setting_display_media_hide_all: همیشه همهٔ عکس‌ها و ویدیوها را پنهان کن
@@ -63,6 +64,7 @@ fa:
         otp_attempt: کد ورود دومرحله‌ای
         password: رمز
         phrase: کلیدواژه یا عبارت
+        setting_aggregate_reblogs: بازبوق‌ها را متحد کن
         setting_auto_play_gif: پخش خودکار تصویرهای متحرک
         setting_boost_modal: نمایش پیغام تأیید پیش از بازبوقیدن
         setting_default_language: زبان نوشته‌های شما
diff --git a/config/locales/simple_form.fi.yml b/config/locales/simple_form.fi.yml
index b0f958f2f1..5fda109691 100644
--- a/config/locales/simple_form.fi.yml
+++ b/config/locales/simple_form.fi.yml
@@ -2,6 +2,9 @@
 fi:
   simple_form:
     hints:
+      admin_account_action:
+        send_email_notification: Käyttäjä saa selityksen mitä tapahtui hänen tililleen
+        type_html: Valitse mitä teet <strong>1%{acct}</strong>2
       defaults:
         avatar: PNG, GIF tai JPG. Enintään %{size}. Skaalataan kokoon %{dimensions} px
         digest: Lähetetään vain pitkän poissaolon jälkeen ja vain, jos olet saanut suoria viestejä poissaolosi aikana
diff --git a/config/locales/simple_form.fr.yml b/config/locales/simple_form.fr.yml
index 730a695225..f493b746bd 100644
--- a/config/locales/simple_form.fr.yml
+++ b/config/locales/simple_form.fr.yml
@@ -33,9 +33,12 @@ fr:
         setting_display_media_show_all: Toujours afficher les médias marqués comme sensibles
         setting_hide_network: Ceux que vous suivez et ceux qui vous suivent ne seront pas affichés sur votre profil
         setting_noindex: Affecte votre profil public ainsi que vos statuts
+        setting_show_application: Le nom de l'application que vous utilisez afin d'envoyer des pouets sera affiché dans la vue détaillée de ceux-ci
         setting_theme: Affecte l’apparence de Mastodon quand vous êtes connecté·e depuis n’importe quel appareil.
         username: Votre nom d’utilisateur sera unique sur %{domain}
         whole_word: Lorsque le mot-clef ou la phrase-clef est uniquement alphanumérique, ça sera uniquement appliqué s’il correspond au mot entier
+      featured_tag:
+        name: 'Vous pourriez utiliser l''un d''entre eux :'
       imports:
         data: Un fichier CSV généré par une autre instance de Mastodon
       sessions:
@@ -100,6 +103,7 @@ fr:
         setting_hide_network: Cacher votre réseau
         setting_noindex: Demander aux moteurs de recherche de ne pas indexer vos informations personnelles
         setting_reduce_motion: Réduire la vitesse des animations
+        setting_show_application: Dévoiler le nom de l'application utilisée pour envoyer des pouets
         setting_system_font_ui: Utiliser la police par défaut du système
         setting_theme: Thème du site
         setting_unfollow_modal: Afficher une fenêtre de confirmation avant de vous désabonner d’un compte
@@ -108,6 +112,8 @@ fr:
         username: Identifiant
         username_or_email: Nom d’utilisateur·ice ou courriel
         whole_word: Mot entier
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Masquer les notifications des personnes qui ne vous suivent pas
         must_be_following: Masquer les notifications des personnes que vous ne suivez pas
diff --git a/config/locales/simple_form.gl.yml b/config/locales/simple_form.gl.yml
index aebab52475..10f6b6ab81 100644
--- a/config/locales/simple_form.gl.yml
+++ b/config/locales/simple_form.gl.yml
@@ -33,11 +33,14 @@ gl:
         setting_display_media_show_all: Mostrar sempre os medios marcados como sensibles
         setting_hide_network: Non se mostrará no seu perfil quen a segue e quen a está a seguir
         setting_noindex: Afecta ao seu perfil público e páxinas de estado
+        setting_show_application: A aplicación que está a utilizar para enviar toots mostrarase na vista detallada do toot
         setting_theme: Afecta ao aspecto de Mastodon en calquer dispositivo cando está conectada.
         username: O seu nome de usuaria será único en %{domain}
         whole_word: Se a chave ou frase de paso é só alfanumérica, só se aplicará se concorda a palabra completa
+      featured_tag:
+        name: 'Podería utilizar algunha de estas:'
       imports:
-        data: Ficheiro CSV exportado desde outra instancia Mastodon
+        data: Ficheiro CSV exportado desde outro servidor Mastodon
       sessions:
         otp: 'Introduza o código de doble-factor xerado no aplicativo do seu móbil ou utilice un dos seus códigos de recuperación:'
       user:
@@ -100,6 +103,7 @@ gl:
         setting_hide_network: Agochar a súa rede
         setting_noindex: Pedir non aparecer nas buscas dos motores de busca
         setting_reduce_motion: Reducir o movemento nas animacións
+        setting_show_application: Mostrar a aplicación utilizada para tootear
         setting_system_font_ui: Utilizar a tipografía por defecto do sistema
         setting_theme: Decorado da instancia
         setting_unfollow_modal: Solicitar confirmación antes de deixar de seguir alguén
@@ -108,6 +112,8 @@ gl:
         username: Nome de usuaria
         username_or_email: Nome de usuaria ou Correo-e
         whole_word: Palabra completa
+      featured_tag:
+        name: Etiqueta
       interactions:
         must_be_follower: Bloquear as notificacións de non-seguidoras
         must_be_following: Bloquea as notificacións de personas que non segue
diff --git a/config/locales/simple_form.ko.yml b/config/locales/simple_form.ko.yml
index fd0a1940ee..42be5a93cf 100644
--- a/config/locales/simple_form.ko.yml
+++ b/config/locales/simple_form.ko.yml
@@ -33,11 +33,14 @@ ko:
         setting_display_media_show_all: 민감함으로 설정 된 미디어를 항상 보이기
         setting_hide_network: 나를 팔로우 하는 사람들과 내가 팔로우 하는 사람들이 내 프로필에 표시되지 않게 합니다
         setting_noindex: 공개 프로필 및 각 툿페이지에 영향을 미칩니다
+        setting_show_application: 당신이 툿을 작성하는데에 사용한 앱이 툿의 상세정보에 표시 됩니다
         setting_theme: 로그인중인 모든 디바이스에 적용되는 디자인입니다.
         username: 당신의 유저네임은 %{domain} 안에서 유일해야 합니다
         whole_word: 키워드가 영문과 숫자로만 이루어 진 경우, 단어 전체에 매칭 되었을 때에만 작동하게 합니다
+      featured_tag:
+        name: '이것들을 사용하면 좋을 것 같습니다:'
       imports:
-        data: 다른 마스토돈 인스턴스에서 추출된 CSV 파일
+        data: 다른 마스토돈 서버에서 추출된 CSV 파일
       sessions:
         otp: '휴대전화에서 생성 된 2단계 인증 코드를 입력하거나, 복구 코드 중 하나를 사용하세요:'
       user:
@@ -100,6 +103,7 @@ ko:
         setting_hide_network: 내 네트워크 숨기기
         setting_noindex: 검색엔진의 인덱싱을 거절
         setting_reduce_motion: 애니메이션 줄이기
+        setting_show_application: 툿 작성에 사용한 앱을 공개
         setting_system_font_ui: 시스템의 초기 설정 폰트를 사용
         setting_theme: 사이트 테마
         setting_unfollow_modal: 언팔로우 전 언팔로우 확인 표시
@@ -108,6 +112,8 @@ ko:
         username: 유저 이름
         username_or_email: 유저네임 또는 이메일
         whole_word: 단어 전체에 매칭
+      featured_tag:
+        name: 해시태그
       interactions:
         must_be_follower: 나를 팔로우 하지 않는 사람에게서 온 알림을 차단
         must_be_following: 내가 팔로우 하지 않는 사람에게서 온 알림을 차단
diff --git a/config/locales/simple_form.nl.yml b/config/locales/simple_form.nl.yml
index 6eb784c303..0d7d1a847d 100644
--- a/config/locales/simple_form.nl.yml
+++ b/config/locales/simple_form.nl.yml
@@ -33,9 +33,12 @@ nl:
         setting_display_media_show_all: Als gevoelig gemarkeerde media altijd verbergen
         setting_hide_network: Wie jij volgt en wie jou volgen wordt niet op jouw profiel getoond
         setting_noindex: Heeft invloed op jouw openbare profiel en toots
+        setting_show_application: De toepassing de je gebruikt om te tooten wordt in de gedetailleerde weergave van de toot getoond
         setting_theme: Heeft invloed op hoe de webapp van Mastodon eruitziet (op elk apparaat waarmee je inlogt).
         username: Jouw gebruikersnaam is uniek op %{domain}
         whole_word: Wanneer het trefwoord of zinsdeel alfanumeriek is, wordt het alleen gefilterd wanneer het hele woord overeenkomt
+      featured_tag:
+        name: 'Je wilt misschien een van deze gebruiken:'
       imports:
         data: CSV-bestand dat op een andere Mastodonserver werd geëxporteerd
       sessions:
@@ -100,6 +103,7 @@ nl:
         setting_hide_network: Jouw volgers en wie je volgt verbergen
         setting_noindex: Jouw toots niet door zoekmachines laten indexeren
         setting_reduce_motion: Langzamere animaties
+        setting_show_application: Toepassing onthullen die je voor het verzenden van toots gebruikt
         setting_system_font_ui: Standaardlettertype van jouw systeem gebruiken
         setting_theme: Thema website
         setting_unfollow_modal: Vraag voor het ontvolgen van iemand een bevestiging
@@ -108,6 +112,8 @@ nl:
         username: Gebruikersnaam
         username_or_email: Gebruikersnaam of e-mailadres
         whole_word: Heel woord
+      featured_tag:
+        name: Hashtag
       interactions:
         must_be_follower: Meldingen van mensen die jou niet volgen blokkeren
         must_be_following: Meldingen van mensen die jij niet volgt blokkeren
diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml
index 6ded448e90..ac2845335f 100644
--- a/config/locales/simple_form.oc.yml
+++ b/config/locales/simple_form.oc.yml
@@ -33,11 +33,14 @@ oc:
         setting_display_media_show_all: Totjorn mostrar los mèdias marcats coma sensibles
         setting_hide_network: Vòstre perfil mostrarà pas los que vos sègon e lo monde que seguètz
         setting_noindex: Aquò es destinat a vòstre perfil public e vòstra pagina d’estatuts
+        setting_show_application: Lo nom de l’aplicacion qu’utilizatz per publicar serà mostrat dins la vista detalhada de vòstres tuts
         setting_theme: Aquò càmbia lo tèma grafic de Mastodon quand sètz connectat qual que siasque lo periferic.
         username: Vòstre nom d’utilizaire serà unic sus %{domain}
         whole_word: Quand lo mot-clau o frasa es solament alfranumeric, serà pas qu’aplicat se correspond al mot complèt
+      featured_tag:
+        name: 'Benlèu que volètz utilizar una d’aquestas causas :'
       imports:
-        data: Fichièr CSV exportat d’una autra instància Mastodon
+        data: Fichièr CSV exportat d’un autre servidor Mastodon
       sessions:
         otp: 'Picatz lo còdi d’autentificacion en dos temps (Two factor code) de vòstra aplicacion mobil o utilizatz un de vòstres còdis de recuperacion :'
       user:
diff --git a/config/locales/simple_form.sk.yml b/config/locales/simple_form.sk.yml
index 41d045a4ad..504f909c2d 100644
--- a/config/locales/simple_form.sk.yml
+++ b/config/locales/simple_form.sk.yml
@@ -33,11 +33,14 @@ sk:
         setting_display_media_show_all: Stále ukazuj médiá označené ako citlivé
         setting_hide_network: Koho následuješ, a kto následuje teba nebude zobrazené na tvojom profile
         setting_noindex: Ovplyvňuje verejný profil a stránky s príspevkami
+        setting_show_application: Aplikácia, ktorú používaš na písanie príspevkov, bude zobrazená v detailnom náhľade jednotlivých tvojích príspevkov
         setting_theme: Ovplyvňuje ako Mastodon vyzerá pri prihlásení z hociakého zariadenia.
         username: Tvoja prezývka bude unikátna pre server %{domain}
         whole_word: Ak je kľúčové slovo, alebo fráza poskladaná iba s písmen a čísel, bude použité iba ak sa zhoduje s celým výrazom
+      featured_tag:
+        name: 'Možno by si chcel/a použiť niektoré z týchto:'
       imports:
-        data: CSV súbor vyexportovaný z inej Mastodon inštancie
+        data: CSV súbor vyexportovaný z iného Mastodon serveru
       sessions:
         otp: 'Napíš sem dvoj-faktorový kód z telefónu, alebo použi jeden z tvojích obnovovacích kódov:'
       user:
@@ -100,6 +103,7 @@ sk:
         setting_hide_network: Ukri svoju sieť kontaktov
         setting_noindex: Nezaraďuj príspevky do indexu pre vyhľadávče
         setting_reduce_motion: Mierni pohyb pri animáciách
+        setting_show_application: Zverejni akú aplikáciu používaš na posielanie príspevkov
         setting_system_font_ui: Použi základné systémové písmo
         setting_theme: Vzhľad webu
         setting_unfollow_modal: Zobrazuj potvrdzovacie okno pred skončením sledovania iného užívateľa
@@ -108,6 +112,8 @@ sk:
         username: Prezývka
         username_or_email: Prezívka, alebo email
         whole_word: Celé slovo
+      featured_tag:
+        name: Haštag
       interactions:
         must_be_follower: Blokovať oznámenia od nesledujúcich
         must_be_following: Blokovať oznámenia od ľudí, ktorých nesleduješ
diff --git a/config/locales/simple_form.sq.yml b/config/locales/simple_form.sq.yml
index 0967ef424b..c3feee5751 100644
--- a/config/locales/simple_form.sq.yml
+++ b/config/locales/simple_form.sq.yml
@@ -1 +1,133 @@
-{}
+---
+sq:
+  simple_form:
+    hints:
+      account_warning_preset:
+        text: Mund të përdorni sintaksë mesazhesh, të tillë si URL, hashtagë dhe përmendje
+      admin_account_action:
+        send_email_notification: Përdoruesi do të marrë një shpjegim mbi çfarë ndodhi me llogarinë e tij
+        text_html: Opsionale. Mund të përdorni sintaksë mesazhesh. Për të kursyer kohë, mund të <a href="%{path}">shtoni paracaktime sinjalizimesh</a>
+        type_html: Zgjidhni ç’të bëhet me <strong>%{acct}</strong>
+        warning_preset_id: Opsionale. Mundeni sërish të shtoni tekst vetjak në fund të paracaktimit
+      defaults:
+        autofollow: Personat që regjistrohen përmes ftesës do t’ju ndjekin vetvetiu
+        avatar: PNG, GIF ose JPG. Maksimumi %{size}. Do të zvogëlohen në %{dimensions}px
+        bot: Kjo llogari kryesisht bën veprime të automatizuara dhe mund të mos mbikëqyret dot
+        context: Një ose disa kontekste kur duhet të zbatohet filtri
+        digest: I dërguar vetëm pas një periudhe të gjatë pasiviteti dhe vetëm nëse keni marrë ndonjë mesazh personal gjatë mungesës suaj
+        discoverable_html: <a href="%{path}" target="_blank">Drejtoria</a> u lejon njerëzve të gjejnë llogari bazuar në interesat dhe veprimtarinë. Lyp të paktën %{min_followers} ndjekës
+        email: Do t’ju dërgohet një email ripohimi
+        fields: Te profili juaj mund të keni deri në 4 objekte të shfaqur si tabelë
+        header: PNG, GIF ose JPG. E shumta %{size}. Do të ripërmasohet në %{dimensions}px
+        inbox_url: Kopjoni URL-në prej faqes ballore të relesë që doni të përdorni
+        irreversible: Mesazhet e filtruar do të zhduket në mënyrë të pakthyeshme, edhe nëse filtri hiqet më vonë
+        locale: Gjuha e ndërfaqes së përdoruesit, email-eve dhe njoftimeve <em>push</em>
+        locked: Lyp që ju të miratoni dorazi ndjekësit
+        password: Përdorni të paktën 8 shenja
+        phrase: Do të kërkohet përputhje pavarësish se teksti ose sinjalizimi mbi lëndën e një mesazhi është shkruar me të mëdha apo me të vogla
+        scopes: Cilat API do të lejohet të përdorë aplikacioni. Nëse përzgjidhni një shkallë të epërme, nuk ju duhet të përzgjidhni individualet një nga një.
+        setting_aggregate_reblogs: Mos shfaq përforcime të reja për mesazhe që janë përforcuar tani së fundi (prek vetëm përforcime të marra rishtas)
+        setting_default_language: Gjuha e mesazheve tuaj do të zbulohet vetvetiu, por mund të mos jetë përherë e saktë
+        setting_display_media_default: Fshih media me shenjën rezervat
+        setting_display_media_hide_all: Fshih përherë krejt mediat
+        setting_display_media_show_all: Mediat me shenjën rezervat shfaqi përherë
+        setting_hide_network: Cilët ndiqni dhe cilët ju ndjekin nuk do të shfaqen në profilin tuaj
+        setting_noindex: Prek faqet e profilit tuaj publik dhe gjendjeve
+        setting_show_application: Aplikacioni që përdorni për mesazhe do të shfaqet te pamja e hollësishme për mesazhet tuaj
+        setting_theme: Lidhet me se si duket Mastodon-i kur jeni i futur nga çfarëdo pajisje.
+        username: Emri juaj i përdoruesit do të jetë unik në %{domain}
+        whole_word: Kur fjalëkyçi ose fraza është vetëm numerike, do të aplikohet vetëm nëse përputhet me krejt fjalën
+      featured_tag:
+        name: 'Mund të doni të përdorni një nga këto:'
+      imports:
+        data: Kartelë CSV të eksportuar nga një tjetër shërbyes Mastodon
+      sessions:
+        otp: 'Jepni kodin dyfaktorësh të prodhuar nga aplikacioni i telefonit tuaj ose përdorni një nga kodet tuaj të rikthimive:'
+      user:
+        chosen_languages: Në iu vëntë shenjë, te rrjedha kohore publike do të shfaqen vetëm mesazhe në gjjuhët e përzgjedhura
+    labels:
+      account:
+        fields:
+          name: Etiketë
+          value: Lëndë
+      account_warning_preset:
+        text: Tekst i paracaktuar
+      admin_account_action:
+        send_email_notification: Njoftoje përdoruesin me email
+        text: Sinjalizim vetjak
+        type: Veprim
+        types:
+          disable: Çaktivizoje
+          none: Mos bëj gjë
+          silence: Heshtje
+          suspend: Pezulloje dhe fshi në mënyrë të pakthyeshme të dhënat e llogarisë
+        warning_preset_id: Përdor një sinjalizim të paracaktuar
+      defaults:
+        autofollow: Ftesë për ndjekje të llogarisë tuaj
+        avatar: Avatar
+        bot: Kjo është një llogari robot
+        chosen_languages: Filtro gjuhë
+        confirm_new_password: Ripohoni fjalëkalimin e ri
+        confirm_password: Ripohoni fjalëkalimin
+        context: Filtroni kontekste
+        current_password: Fjalëkalimi i tanishëm
+        data: Të dhëna
+        discoverable: Shfaqe këtë llogari te lista
+        display_name: Emër në ekran
+        email: Adresë email
+        expires_in: Skadon pas
+        fields: Tejtëdhëna profili
+        header: Krye
+        inbox_url: URL e Të marrëve të relesë
+        irreversible: Heqje, në vend se fshehje
+        locale: Gjuhë ndërfaqeje
+        locked: Kyçe llogarinë
+        max_uses: Numër maksimum përdorimesh
+        new_password: Fjalëkalim i ri
+        note: Jetëshkrim
+        otp_attempt: Kod mirëfilltësimi dyfaktorësh
+        password: Fjalëkalim
+        phrase: Fjalëkyç ose frazë
+        setting_aggregate_reblogs: Grupoji përforcimet në rrjedha kohore
+        setting_auto_play_gif: Vetëluaji GIF-et e animuar
+        setting_boost_modal: Shfaq dialog ripohimi përpara përforcimi
+        setting_default_language: Gjuhë postimi
+        setting_default_privacy: Privatësi postim
+        setting_default_sensitive: Mediave vëru përherë shenjë si rezervat
+        setting_delete_modal: Shfaq dialog ripohimi përpara fshirjes së një mesazhi
+        setting_display_media: Shfaqje mediash
+        setting_display_media_default: Parazgjedhje
+        setting_display_media_hide_all: Fshihi krejt
+        setting_display_media_show_all: Shfaqi krejt
+        setting_expand_spoilers: Mesazhet me sinjalizime mbi lëndën, zgjeroji përherë
+        setting_hide_network: Fshiheni rrjetin tuaj
+        setting_noindex: Përfundim i indeksimit nga motor kërkimesh
+        setting_reduce_motion: Zvogëlo lëvizjen në animacione
+        setting_show_application: Tregoje aplikacionin e përdorur për të dërguar mesazhe
+        setting_system_font_ui: Përdor shkronja parazgjedhje të sistemit
+        setting_theme: Temë sajti
+        setting_unfollow_modal: Shfaq dialog ripohimi përpara heqjes së ndjekjes për dikë
+        severity: Rreptësi
+        type: Lloj importimi
+        username: Emër përdoruesi
+        username_or_email: Emër përdoruesi ose Email
+        whole_word: Krejt fjalën
+      featured_tag:
+        name: Hashtag
+      interactions:
+        must_be_follower: Blloko njoftime nga jo-ndjekës
+        must_be_following: Blloko njoftime nga persona që nuk i ndiqni
+        must_be_following_dm: Blloko mesazhe të drejtpërdrejt nga persona që nuk i ndiqni
+      notification_emails:
+        digest: Dërgo email-e përmbledhës
+        favourite: Të dërgohet email kur dikush parapëlqen gjendjen tuaj
+        follow: Të dërgohet email kur dikush fillon t’ju ndjekë
+        follow_request: Të dërgohet email kur dikush kërkon t’ju ndjekë
+        mention: Të dërgohet email kur dikush ju përmend
+        reblog: Dërgo email kur dikush përforcon gjendjen time
+        report: Dërgo email kur parashtrohet një raportim i ri
+    'no': Jo
+    required:
+      mark: "*"
+      text: e domosdoshme
+    'yes': Po
diff --git a/config/locales/simple_form.tr.yml b/config/locales/simple_form.tr.yml
index d0b50609b0..517b38ca58 100644
--- a/config/locales/simple_form.tr.yml
+++ b/config/locales/simple_form.tr.yml
@@ -2,7 +2,11 @@
 tr:
   simple_form:
     hints:
+      admin_account_action:
+        send_email_notification: Kullanıcı, hesabına ne olduğu hakkında bir bildirim alacak
+        warning_preset_id: İsteğe bağlı. Hazır ayarın sonuna hala özel metin ekleyebilirsiniz
       defaults:
+        autofollow: Davetiyeyle kaydolan kiÅŸiler sizi otomatik olarak takip eder
         avatar: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir
         header: En fazla %{size} olacak şekilde PNG, GIF veya JPG formatında yükleyiniz. %{dimensions}px büyüklüğüne indirgenecektir.
         locked: Takipçilerinizi manuel olarak kabul etmenizi ve gönderilerinizi varsayılan olarak sadece takipçilerinizin göreceği şekilde paylaşmanızı sağlar.
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 5c2dcd7e07..296589becc 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -1,13 +1,13 @@
 ---
 sk:
   about:
-    about_hashtag_html: Toto sú verejné príspevky otagované pod <strong>#%{hashtag}</strong>. Ak máš účet hocikde v rámci fediversa, môžeš ich využívať.
+    about_hashtag_html: Toto sú verejné príspevky, otagované pod <strong>#%{hashtag}</strong>. Ak máš účet hocikde v rámci fediversa, môžeš s nimi narábať.
     about_mastodon_html: Mastodon je sociálna sieť založená na otvorených webových protokoloch a na slobodnom softvéri. Je decentralizovaná, podobne ako email.
     about_this: O tomto serveri
     administered_by: 'Správcom je:'
     api: API
     apps: Aplikácie
-    closed_registrations: Registrácie sú na tomto serveri momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný Mastodon server kde si založ účet a získaj tak prístup do presne tej istej siete odtiaľ.
+    closed_registrations: Registrácie na tomto serveri sú momentálne uzatvorené. Avšak, môžeš nájsť nejaký iný server kde si založíš účet a získaš tak prístup do presne tej istej siete odtiaľ.
     contact: Kontakt
     contact_missing: Nezadaný
     contact_unavailable: Neuvedený
@@ -27,7 +27,7 @@ sk:
     generic_description: "%{domain} je jeden server v sieti"
     hosted_on: Mastodon hostovaný na %{domain}
     learn_more: Zisti viac
-    other_instances: Zoznam ďalších inštancií
+    other_instances: Zoznam serverov
     privacy_policy: Ustanovenia o súkromí
     source_code: Zdrojový kód
     status_count_after:
@@ -39,7 +39,7 @@ sk:
     user_count_after:
       few: užívatelia
       one: užívateľ
-      other: užívatelia
+      other: užívateľov
     user_count_before: Domov pre
     what_is_mastodon: ÄŒo je Mastodon?
   accounts:
@@ -246,7 +246,7 @@ sk:
       feature_registrations: Registrácie
       feature_relay: Federovací mostík
       features: Vymoženosti
-      hidden_service: Federácia so skritými službami
+      hidden_service: Federácia so skrytými službami
       open_reports: otvorené hlásenia
       recent_users: Nedávny užívatelia
       search: Celofrázové vyhľadávanie
@@ -392,13 +392,13 @@ sk:
         desc_html: Uprav vzhľad pomocou CSS, ktoré je načítané na každej stránke
         title: Vlastné CSS
       hero:
-        desc_html: Zobrazuje sa na hlavnej stránke. Doporučuje sa rozlišenie aspoň 600x100px Pokiaľ tu nieje nič dodané, bude nastavený základný orázok tohoto serveru
+        desc_html: Zobrazuje sa na hlavnej stránke. Doporučuje sa rozlišenie aspoň 600x100px Pokiaľ nič nieje dodané, bude nastavený základný orázok serveru
         title: Obrázok hrdinu
       mascot:
         desc_html: Zobrazované na viacerých stránkach. Odporúčaná veľkosť aspoň 293×205px. Pokiaľ nieje nahraté, bude zobrazený základný maskot
         title: Obrázok maskota
       peers_api_enabled:
-        desc_html: Domény, na ktoré tento server už vo fediverse natrafil
+        desc_html: Domény, na ktoré tento server už v rámci fediverse natrafil
         title: Zverejni zoznam objavených serverov
       preview_sensitive_media:
         desc_html: Náhľad odkazov z iných serverov, bude zobrazený aj vtedy, keď sú médiá označené ako senzitívne
@@ -427,20 +427,20 @@ sk:
         title: Zobraz značku moderátora
       site_description:
         desc_html: Oboznamujúci paragraf na hlavnej stránke a pri meta tagoch. Opíš, čo robí tento Mastodon server špecifickým, a ďalej hocičo iné, čo považuješ za dôležité. Môžeš použiť HTML kód, hlavne <code>&lt; a &gt;</code>, ale tiež <code>&lt;&gt;</code>.
-        title: Popis instancie
+        title: Popis servera
       site_description_extended:
-        desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny a iné veci, ktorými je tvoja instancia špecifická. Je možné tu používať HTML kód
+        desc_html: Toto je vhodné miesto pre tvoje pravidlá o prevádzke, pokyny, podmienky a iné veci, ktorými je tvoj server špecifický. Je možné tu používať HTML tagy
         title: Vlastné doplňujúce informácie
       site_short_description:
-        desc_html: Zobrazené na bočnom paneli a pri meta tagoch. Popíš čo je Mastodon, a čo robí tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis instancie.
-        title: Krátky popis instancie
+        desc_html: Zobrazené na bočnom paneli a pri meta tagoch. Popíš čo je Mastodon, a čo robí tento server iným, v jednom paragrafe. Pokiaľ toto necháš prázdne, bude tu zobrazený základný popis servera.
+        title: Krátky popis serveru
       site_terms:
         desc_html: Môžeš si napísať svoje vlastné pravidla o súkromí, prevádzke, alebo aj iné legality. Môžeš tu používať HTML kód
         title: Vlastné pravidlá prevádzky
-      site_title: Názov instancie
+      site_title: Názov servera
       thumbnail:
         desc_html: Používané pre náhľady cez OpenGraph a API. Doporučuje sa rozlišenie 1200x630px
-        title: Miniatúra instancie
+        title: Miniatúra servera
       timeline_preview:
         desc_html: Zobraziť verejnú nástenku na hlavnej stránke
         title: Náhľad nástenky
@@ -501,12 +501,12 @@ sk:
     warning: Na tieto údaje dávajte ohromný pozor. Nikdy ich s nikým nezďieľajte!
     your_token: Váš prístupový token
   auth:
-    agreement_html: V rámci registrácie súhlasíš, že sa budeš riadiť <a href="%{rules_path}"> pravidlami tejto instancie</a>, a taktiež <a href="%{terms_path}"> našími prevoznými podmienkami</a>.
+    agreement_html: V rámci registrácie súhlasíš, že sa budeš riadiť <a href="%{rules_path}"> pravidlami tohto servera</a>, a taktiež <a href="%{terms_path}"> našími prevádzkovými podmienkami</a>.
     change_password: Heslo
     confirm_email: Potvrdiť email
-    delete_account: Vymazať účet
-    delete_account_html: Pokiaľ chceš vymazať svoj účet, môžeš tak <a href="%{path}">urobiť tu</a>. Budeš požiadaný/á o potvrdenie tohto kroku.
-    didnt_get_confirmation: Neobdržal/a si kroky pre potvrdenie?
+    delete_account: Vymaž účet
+    delete_account_html: Pokiaľ chceš svoj účet odtiaľto vymazať, môžeš tak <a href="%{path}">urobiť tu</a>. Budeš požiadaný/á o potvrdenie tohto kroku.
+    didnt_get_confirmation: Neobdržal/a si kroky na potvrdenie?
     forgot_password: Zabudnuté heslo?
     invalid_reset_password_token: Token na obnovu hesla vypršal. Prosím vypítaj si nový.
     login: Prihlás sa
@@ -555,7 +555,7 @@ sk:
     description_html: Týmto <strong> natrvalo, nenavrátiteľne </strong> vymažeš obsah tvojho účtu, a deaktivuješ ho. Tvoja prezývka ale ostane rezervovaná ako prevencia pred budúcimi impersonáciami.
     proceed: Vymaž účet
     success_msg: Tvoj účet bol úspešne vymazaný
-    warning_html: Iba vymazanie obsahu z tejto konkrétnej instancie je zaručené. Obsah, ktorý bol zdieľaný široko-ďaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy.
+    warning_html: Iba vymazanie obsahu z tohto konkrétneho serveru je zaručené. Obsah, ktorý bol zdieľaný široko-ďaleko pravdepodobne zanechá nejaké stopy. Servery ktoré sú offline a tie ktoré ignorujú tvoje zmeny teda nezaktualizujú svoje databázy.
     warning_title: Dostupnosť rozšírovaného obsahu
   directories:
     directory: Katalóg profilov
@@ -595,6 +595,10 @@ sk:
     lists: Zoznamy
     mutes: Stíšil/a si
     storage: Úložisko médií
+  featured_tags:
+    add_new: Pridaj nový
+    errors:
+      limit: Už si si predvolil/a najvyšší možný počet obľúbených haštagov
   filters:
     contexts:
       home: Domáca os
@@ -613,7 +617,7 @@ sk:
       title: Pridaj nové triedenie
   followers:
     domain: Doména
-    explanation_html: Pokiaľ chceš zaručiť súkromie svojích príspevkov, musíš mať na vedomí, kto ťa sleduje. <strong> Tvoje súkromné príspevky sú doručené na každý server z ktorého ťa niekto následuje. </strong> Takže možno by si ich chcel/a skontrolovať, a odstrániť tých následovníkov, čo sú na serveroch ktorím nedôveruješ, že ich moderátori, alebo úpravbuy kódu budú tiež rešpektovať tvoje súkromie.
+    explanation_html: Pokiaľ chceš zaručiť súkromie svojích príspevkov, musíš mať na vedomí, kto ťa sleduje. <strong> Tvoje súkromné príspevky sú doručené na každý server z ktorého ťa niekto následuje. </strong> Takže možno by si ich chcel/a skontrolovať, a odstrániť tých následovníkov, čo sú na serveroch ktorím dostatočne nedôveruješ v zmysle, že ich moderátori, alebo ich softvérové úpravy, budú tiež rešpektovať tvoje súkromie.
     followers_count: Počet následovateľov
     lock_link: Zamkni svoj účet
     purge: Odstráň sledovateľa
@@ -637,10 +641,16 @@ sk:
       one: Niečo nieje úplne v poriadku! Prosím skontroluj danú chybu
       other: Niečo ešte stále nieje v poriadku! Prosím skontroluj všetky %{count} nižšie uvedené pochybenia
   imports:
+    modes:
+      merge: Spojiť dohromady
+      merge_long: Ponechaj existujúce záznamy a pridaj k nim nové
+      overwrite: Prepíš
+      overwrite_long: Nahraď súčasné záznamy s novými
     preface: Môžeš nahrať dáta ktoré si exportoval/a z iného Mastodon serveru, ako sú napríklad zoznamy ľudí ktorých sleduješ, alebo blokuješ.
     success: Tvoje dáta boli nahraté úspešne, a teraz budú spracované v danom čase
     types:
       blocking: Zoznam blokovaných
+      domain_blocking: Zoznam blokovaných domén
       following: Zoznam sledovaných
       muting: Zoznam ignorovaných
     upload: Nahrať
@@ -812,6 +822,7 @@ sk:
     development: Vývoj
     edit_profile: Uprav profil
     export: Exportovať dáta
+    featured_tags: Popredne zvýraznené haštagy
     followers: Povolení následovatelia
     import: Importovať
     migrate: Presunutie účtu
@@ -869,9 +880,9 @@ sk:
       <li><em>Základné informácie o účte</em>: Ak sa na tomto serveri zaregistruješ, budeš môcť byť požiadaný/á zadať prezývku, emailovú adresu a heslo. Budeš tiež môcť zadať aj ďalšie profilové údaje, ako napríklad meno a životopis, a nahrať profilovú fotku aj obrázok v záhlaví. Tvoja prezývka, meno, životopis, profilová fotka a obrázok v záhlaví sú vždy zobrazené verejne.</li><li><em>Príspevky, sledovania a iné verejné informácie</em>:
       Zoznam ľudí, ktorých sleduješ je zobrazený verejne, a to isté platí aj pre zoznam tvojích následovateľov. Keď pošleš správu, ukladá sa jej dátum a čas, ale aj z akej aplikácie bola poslaná. Správy môžu obsahovať mediálne prílohy, ako obrázky a videá. Verejné, a nezaradené príspevky sú verejne prístupné. Keď si pripneš príspevok na svoj profil, toto je tiež verejne dostupnou informáciou. Tvoje príspevky sú takisto doručené tvojím sledovateľom, a to aj v rámci iných serverov, kde je potom uložená kópia tvojho príspevku. Ak vymažeš príspevok, táto akcia bude takisto doručená tvojím sledovateľom. Vyzdvihnutie, alebo obľúbenie iného príspevku je vždy verejne viditeľné.</li>
 
-      <li><em>Priame príspevky, a príspevky iba pre sledovateľov</em>: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj v rámci iných serverov, a kópie príspevkov sú na nich uložené.
+      <li><em>Priame príspevky, a príspevky určené iba pre sledovateľov</em>: Všetky príspevky sú uložené a spracované na serveri. Príspevky iba pre sledovateľov sú doručené tvojím sledovateľom a užívateľom ktorí sú v nich spomenutí, pričom priame príspevky sú doručené iba tím užívateľom ktorí sú v nich spomenutí. V niektorých prípadoch to môže znamenať, že tieto príspevkz sú doručené aj v rámci iných serverov, a kópie príspevkov sú na nich uložené.
       V dobrej viere robíme všetko preto, aby bol prístup k tímto príspevkom vymedzený iba pre oprávnených používateľov, ale môže sa stať, že iné servery v tomto ohľade zlyhajú. Preto je dôležité prezrieť si a zhodnotiť, na aké servery patria tvoji následovatelia. V nastaveniach si môžeš zapnúť voľbu ručne povoľovať a odmietať nových následovateľov.
-      <em>Prosím maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosť vidieť dané príspevky a správy, ale aj že obdŕžitelia týchto správ si ich môzu odfotiť, skopírovať, alebo ich inak zdieľať. <em>Nezdieľaj žiadne nebezpečné, alebo ohrozujúce správy pomocou Mastodonu!</em></li>
+      <em>Prosím maj na pamäti, že správcovia tvojho, aj vzdialeného obdŕžiavajúceho servera majú možnosť vidieť dané príspevky a správy, ale aj, že obdŕžitelia týchto správ si ich môzu odfotiť, skopírovať, alebo ich inak zdieľať. <em>Nezdieľaj žiadne nebezpečné, alebo ohrozujúce správy pomocou Mastodonu!</em></li>
 
        <li><em>IPky a iné metadáta</em>: Keď sa prihlásiš, zaznamenáva sa IP adresa z ktorej si sa prihlásil/a, takisto ako aj názov tvojho prehliadača. Všetky zaznamenané sezóny sú pre teba dostupné na konktolu, alebo na zamietnutie prístupu v nastaveniach. Posledná použitá IP adresa je uložená až po dobu dvanástich mesiacov. Môžeme si tiež ponechať serverové záznamy, ktoré obsahujú IP adresu každej požiadavky na tento server.</li>
       </ul>
@@ -881,16 +892,15 @@ sk:
       <h3 id="use">Načo sú tvoje údaje používané?</h3>
 
       <p>Hociktorá z informácií, ktoré sú o tebe zozbierané, môže byť použité následujúcimi spôsobmi:</p>
-
       <ul>
-        <li>Pre zabezpečenie základného fungovania Mastodonu. You can only interact with other people's content and post your own content when you are logged in. For example, you may follow other people to view their combined posts in your own personalized home timeline.</li>
-        <li>Pre lepšie moderovanie komunity sa napríklad môže tvoja IP adresa porovnať s ostatnými už známimi adresami, aby bolo možné zistiť, či nedochádza napríklad k obchádzaniu vylúčenia, aleb k iným porušeniam pravidiel.</li>
-        <li>Emailová adresa ktorú poskytneš môže byť použitá na zasielanie informácií, oboznámení keď ostatní užívatelia interaktujú s tvojím obsahom, alebo na posielanie správ, odpovedí na otázky a iné požiadavky.</li>
+        <li>Pre zabezpečenie základného fungovania Mastodonu. Narábať s užívateľským obsahom iných, ako aj prispievať svoj vlastný obsah, možeš len keď si prihlásený/á. Môžeš napríklad následovať iných ľudí, aby si potom videl/a ich príspevky v rámci svojej osobne prispôsobenej domácej osi.</li>
+        <li>Pre lepšie moderovanie komunity sa napríklad môže tvoja IP adresa porovnať s ostatnými už známimi adresami, aby bolo možné zistiť, či nedochádza napríklad k obchádzaniu pravidiel vylúčenia, aleb k iným porušeniam zásad.</li>
+        <li>Emailová adresa, ktorú poskytneš, môže byť použitá na zasielanie informácií, oboznámení keď ostatní užívatelia interaktujú s tvojím obsahom, alebo na posielanie správ, odpovedí na otázky a iné požiadavky.</li>
       </ul>
     title: Podmienky užívania, a pravidlá súkromia pre %{instance}
   themes:
-    contrast: Vysoký kontrast
-    default: Mastodon
+    contrast: Mastodon (vysoký kontrast)
+    default: Mastodon (tmavý)
     mastodon-light: Mastodon (svetlý)
   time:
     formats:
@@ -920,7 +930,7 @@ sk:
     warning:
       explanation:
         disable: Pokiaľ je tvoj účet zamrazený, tvoje dáta zostávajú nedoknuté, ale nemôžeš v rámci neho nič robiť, až kým nebude odomknutý.
-        silence: Kým je účet obmedzený, tvoje príspevky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne.
+        silence: Kým máš účet obmedzený, tvoje príspevky na tomto serveri uvidia iba tí ľudia, ktorí ťa už následujú, a môžeš byť vylúčený/á z rôznych verejných záznamov. Ostatní ťa však stále budú môcť následovať manuálne.
         suspend: Tvoj účet bol vylúčený, a všetky tvoje príspevky a nahraté médiálné súbory boli nenávratne zmazané z tohto serveru, a zo serverov na ktorých si mal následovateľov.
       review_server_policies: Prehodnoť pravidlá servera
       subject:
@@ -940,7 +950,7 @@ sk:
       final_action: Začni prispievať
       final_step: 'Začni písať! Aj bez následovateľov budú tvoje verejné príspevky videné ostatnými, napríklad na miestnej osi a pod haštagmi. Ak chceš, môžeš sa ostatným predstaviť pod haštagom #introductions.'
       full_handle: Adresa tvojho profilu v celom formáte
-      full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z inej instancie.
+      full_handle_hint: Toto je čo musíš dať vedieť svojím priateľom aby ti mohli posielať správy, alebo ťa následovať z iného serveru.
       review_preferences_action: Zmeniť nastavenia
       review_preferences_step: Daj si záležať na svojích nastaveniach, napríklad že aké emailové notifikácie chceš dostávať, alebo pod aký level súkromia sa tvoje príspevky majú sami automaticky zaradiť. Pokiaľ nemáš malátnosť z pohybu, môžeš si zvoliť aj automatické spúšťanie GIF animácií.
       subject: Vitaj na Mastodone
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index e583b9309f..b542ffc973 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -1,23 +1,33 @@
 ---
 sq:
   about:
+    about_hashtag_html: Këto janë mesazhe publike të etiketuar me <strong>#%{hashtag}</strong>. Mundeni të ndërveproni me ta, nëse keni një llogari kudo qoftë në fediverse.
+    about_mastodon_html: Mastodon-i është një rrjet shoqëror i bazuar në protokolle web të hapur dhe në software të lirë, me burim të hapur. Është i decentralizuar, si email-ii.
     about_this: Mbi
     administered_by: 'Administruar nga:'
     api: API
     apps: Aplikacione për celular
+    closed_registrations: Hëpërhë regjistrimet në këtë shërbyes janë të mbyllura. Por! Mund të gjeni një shërbyes tjetër për të krijuar një llogari dhe të mund të përdorni andej pikërisht të njëjtin rrjet të këtushëm.
     contact: Kontakt
     contact_missing: I parregulluar
     contact_unavailable: N/A
     documentation: Dokumentim
+    extended_description_html: |
+      <h3>Një vend i mirë për rregulla</h3>
+      <p>Përshkrimi i zgjeruar s’është sajuar ende.</p>
     features:
+      humane_approach_body: Duke nxjerrë mësime nga dështimet e rrjeteve të tjera, Mastodon-i synon të bëjë zgjedhje konceptuale etike, për të luftuar keqpërdorimin e mediave shoqërore.
       humane_approach_title: Një trajtim më njerëzor
+      not_a_product_body: Mastodon-i s’është rrjet komercial. Pa reklama, pa monetarizim të dhënash, pa gardhe. S’ka autoritet qendror.
       not_a_product_title: Jeni një person, jo një produkt
+      real_conversation_body: Me 500 shenja në dorën tuaj për t’i përdorur dhe mbulim për sinjalizime të imta lidhur me lëndën dhe median, mund të shpreheni ashtu si dëshironi.
       real_conversation_title: Ndërtuar për bashkëbisedim të njëmendtë
+      within_reach_body: Aplikacione të shumtë, për iOS, Android, dhe të tjera platforma, falë një ekosistemi API miqësor ndaj zhvilluesve, ju lejojnë të mbani lidhje me miqtë tuaj kudo.
       within_reach_title: Përherë i kapshëm
     generic_description: "%{domain} është një shërbyes te rrjeti"
     hosted_on: Mastodon i strehuar në %{domain}
     learn_more: Mësoni më tepër
-    other_instances: Listë instancash
+    other_instances: Listë shërbyesish
     privacy_policy: Rregulla privatësie
     source_code: Kod burim
     status_count_after:
@@ -38,10 +48,20 @@ sq:
     following: Ndjekje
     joined: U bë pjesë më %{date}
     last_active: aktiv së fundi
+    link_verified_on: Pronësia e kësaj lidhjeje qe kontrolluar më %{date}
     media: Media
+    moved_html: "%{name} ka kaluar te %{new_profile_link}:"
+    network_hidden: Këto të dhëna nuk mund të kihen
     nothing_here: S’ka gjë këtu!
     people_followed_by: Persona të ndjekur nga %{name}
     people_who_follow: Persona që ndjekin %{name}
+    pin_errors:
+      following: Duhet ta ndiqni tashmë personin që doni të pasqyroni
+    posts:
+      one: Mesazh
+      other: Mesazhe
+    posts_tab_heading: Mesazhe
+    posts_with_replies: Mesazhe dhe përgjigje
     reserved_username: Emri i përdoruesit është i ruajtur për dikë
     roles:
       admin: Përgjegjës
@@ -51,6 +71,7 @@ sq:
   admin:
     account_actions:
       action: Kryeje veprimin
+      title: Kryeni veprim moderimi te %{acct}
     account_moderation_notes:
       create: Lini një shënim
       created_msg: Shënimi i moderimit u krijua me sukses!
@@ -98,9 +119,11 @@ sq:
         title: Vendndodhje
       login_status: Gjendje hyrjeje
       media_attachments: Bashkëngjitje media
+      memorialize: Shndërroje në përkujtimore
       moderation:
         active: Aktiv
         all: Krejt
+        silenced: U heshtua
         suspended: Të pezulluara
         title: Moderim
       moderation_notes: Shënime moderimesh
@@ -111,6 +134,7 @@ sq:
       outbox_url: URL Mesazhesh të Dërguar
       perform_full_suspension: Pezulloje
       profile_url: URL profili
+      promote: Promovojeni
       protocol: Protokoll
       public: Publike
       push_subscription_expires: Pajtimi PuSH skadon më
@@ -121,6 +145,7 @@ sq:
         already_confirmed: Ky përdorues është i ripohuar tashmë
         send: Ridërgo email ripohimi
         success: Email-i i ripohimit u dërgua me sukses!
+      reset: Riktheje te parazgjedhjet
       reset_password: Ricaktoni fjalëkalimin
       resubscribe: Ripajtohuni
       role: Leje
@@ -130,10 +155,12 @@ sq:
         staff: Staf
         user: Përdorues
       search: Kërkoni
+      shared_inbox_url: URL kutie të përbashkët mesazesh
       show:
-        created_reports: Ka bërë raporte
+        created_reports: Ka bërë raportime
         targeted_reports: Raportuar nga të tjerë
-      silence: Heshtje
+      silence: Heshtoje
+      silenced: E heshtuar
       statuses: Gjendje
       subscribe: Pajtomë
       suspended: Të pezulluara
@@ -147,6 +174,7 @@ sq:
       web: Web
     action_logs:
       actions:
+        assigned_to_self_report: "%{name} ia kaloi raportimin %{target} në ngarkim vetvetes"
         change_email_user: "%{name} ndryshoi adresën email të përdoruesit %{target}"
         confirm_user: "%{name} ripohoi adresën email të përdoruesit %{target}"
         create_account_warning: "%{name} dërgoi një sinjalizim për %{target}"
@@ -156,23 +184,33 @@ sq:
         demote_user: "%{name} zhgradoi përdoruesin %{target}"
         destroy_custom_emoji: "%{name} asgjësoi emotikonin %{target}"
         destroy_domain_block: "%{name} zhbllokoi përkatësinë %{target}"
+        destroy_email_domain_block: "%{name} e shtoi në listë të lejuarash përkatësinë %{target}"
+        destroy_status: "%{name} hoqi gjendje nga %{target}"
         disable_2fa_user: "%{name} çaktivizoi domosdoshmëritë për dyfaktorësh për përdoruesin %{target}"
         disable_custom_emoji: "%{name} çaktivizoi emotikonin %{target}"
         disable_user: "%{name} çaktivizoi hyrje për përdoruesin %{target}"
         enable_custom_emoji: "%{name} aktivizoi emotikonin %{target}"
         enable_user: "%{name} aktivizoi hyrje për përdoruesin %{target}"
+        memorialize_account: "%{name} e shndërroi llogarinë e %{target} në një faqe përkujtimore"
         promote_user: "%{name} gradoi përdoruesin %{target}"
         remove_avatar_user: "%{name} hoqi avatarin e %{target}"
-        reopen_report: "%{name} rihapi raportin %{target}"
+        reopen_report: "%{name} rihapi raportimin %{target}"
         reset_password_user: "%{name} ricaktoi fjalëkalimi për përdoruesin %{target}"
+        resolve_report: "%{name} zgjidhi raportimin %{target}"
         silence_account: "%{name} heshtoi llogarinë e %{target}"
         suspend_account: "%{name} pezulloi llogarinë e %{target}"
+        unassigned_report: "%{name} rihapi raportimin %{target}"
         unsilence_account: "%{name} hoqi heshtimin për llogarinë %{target}"
         unsuspend_account: "%{name} hoqi pezullimin për llogarinë e %{target}"
         update_custom_emoji: "%{name} përditësoi emotikonin %{target}"
+        update_status: "%{name} përditësoi gjendjen me %{target}"
+      deleted_status: "(fshiu gjendjen)"
+      title: Auditim regjistri
     custom_emojis:
       by_domain: Përkatësi
+      copied_msg: Kopja vendore e emotikonëve u krijua me sukses
       copy: Kopjoje
+      copy_failed_msg: S’u bë dot një kopje vendore e emotikoneve
       created_msg: Emotikoni u krijua me sukses!
       delete: Fshije
       destroyed_msg: Emotikoni u asgjësua me sukses!
@@ -182,21 +220,29 @@ sq:
       enable: Aktivizoje
       enabled_msg: Ai emotikon u aktivizua me sukses
       image_hint: PNG deri 50KB
+      listed: Në listë
       new:
         title: Shtoni emotikon të ri vetjak
       overwrite: Mbishkruaje
       shortcode: Kod i shkurtër
+      shortcode_hint: Të paktën 2 shenja, vetëm shenja alfanumerike dhe nënvija
       title: Emotikone vetjake
+      unlisted: Hequr prej liste
       update_failed_msg: S’u përditësua dot ai emotikon
       updated_msg: Emotikoni u përditësua me sukses!
       upload: Ngarkoje
     dashboard:
+      backlog: punë të prapambetura
       config: Formësim
+      feature_deletions: Fshirje llogarish
       feature_invites: Lidhje ftesash
       feature_profile_directory: Drejtori profilesh
       feature_registrations: Regjistrime
       feature_relay: Rele federimi
       features: Veçori
+      hidden_service: Federim me shërbime të fshehura
+      open_reports: raportime të hapur
+      recent_users: Përdorues së fundi
       search: Kërko tekstin e plotë
       single_user_mode: Mënyrë me përdorues të vetëm
       software: Software
@@ -204,7 +250,7 @@ sq:
       title: Pult
       total_users: përdorues gjithsej
       trends: Tendenca
-      week_interactions: Ndërveprime këtë javë
+      week_interactions: ndërveprime këtë javë
       week_users_active: aktivë këtë javë
       week_users_new: përdorues këtë javë
     domain_blocks:
@@ -214,25 +260,50 @@ sq:
       domain: Përkatësi
       new:
         create: Krijoni bllokim
+        hint: Bllokimi i përkatësisë nuk do të pengojë krijim zërash llogarie te baza e të dhënave, por do të aplikojë në mënyrë retroaktive dhe të vetvetishme metoda specifike moderimi mbi këto llogari.
         severity:
+          desc_html: "<strong>Heshtja</strong> do t’i bëjë postimet e llogarisë të padukshme për këdo që nuk i ndjek ato. <strong>Pezullimi</strong> do të heqë krejt lëndën e llogarisë, media, dhe të dhëna profili. Përdorni <strong>Asnjë</strong>, nëse thjesht doni të mos pranohen kartela media."
           noop: Asnjë
-          silence: Heshtje
+          silence: Heshtoji
           suspend: Pezulloje
-        title: Shtoni Bllokim i ri përkatësie
+        title: Bllokim i ri përkatësie
+      reject_media: Mos prano kartela media
+      reject_media_hint: Heq kartela media të depozituara lokalisht dhe nuk pranon të shkarkohen të tilla në të ardhmen. Pa peshë për pezullimet
+      reject_reports: Hidh tej raportimet
+      reject_reports_hint: Shpërfillini krejt raportimet e ardhura nga kjo përkatësi. Pa peshë për pezullimet
+      rejecting_media: mospranim kartelash media
+      rejecting_reports: mospranim raportimesh
+      severity:
+        silence: e heshtuar
+        suspend: e pezulluar
       show:
-        affected_accounts: Pat ndikim te një llogari në bazën e të dhënave
+        affected_accounts:
+          one: Pat ndikim te një llogari në bazën e të dhënave
+          other: Pat ndikim te %{count} llogari në bazën e të dhënave
+        retroactive:
+          silence: Hiqu heshtimin krejt llogarive ekzistuese nga kjo përkatësi
+          suspend: Hiqu pezullimin krejt llogarive ekzistuese nga kjo përkatësi
+        title: Zhbëje bllokimin e përkatësisë për %{domain}
         undo: Zhbëje
       undo: Zhbëje bllokimin e përkatësisë
     email_domain_blocks:
       add_new: Shtoni të ri
+      created_msg: Përkatësia email u shtua me sukses te lista e bllokimeve
       delete: Fshije
+      destroyed_msg: Përkatësia email u fshi me sukses nga lista e bllokimeve
       domain: Përkatësi
       new:
         create: Shtoni përkatësi
+        title: Zë i ri email në listë bllokimesh
+      title: Listë bllokimesh email-esh
     followers:
       back_to_account: Mbrapsht Te Llogaria
       title: Ndjekës të %{acct}
     instances:
+      delivery_available: Ka shpërndarje të mundshme
+      known_accounts:
+        one: "%{count} llogari e njohur"
+        other: "%{count} llogari të njohura"
       moderation:
         all: Krejt
         limited: E kufizuar
@@ -247,20 +318,23 @@ sq:
       deactivate_all: Çaktivizoji krejt
       filter:
         all: Krejt
-        expired: Ka skaduar
+        available: I përdorshëm
+        expired: I skaduar
         title: Filtër
       title: Ftesa
     relays:
       add_new: Shtoni rele të re
       delete: Fshije
+      description_html: Një <strong>rele federimesh</strong> është një shërbyes ndërmjetës që shkëmben vëllime të mëdha mesazhesh publike mes shërbyesve që janë pajtuar në të dhe publikojnë në të. <strong>Mund t’u vijë në ndihmë shërbyesve të vegjël dhe të mesëm të gjejnë lëndë nga fediversi</strong>, gjë që përndryshe do të kërkonte që përdoruesit vendorë të ndiqnin dorazi persona të tjerë nëpër shërbyes të largët.
       disable: Çaktivizoje
       disabled: E çaktivizuar
       enable: Aktivizoje
+      enable_hint: Pasi të aktivizohet, shërbyesi juaj do të pajtohet te krejt mesazhet publike prej kësaj releje, dhe do të fillojë të dërgojë në të mesazhet publike të këtij shërbyesi.
       enabled: E aktivizuar
       inbox_url: URL releje
       pending: Në pritje të miratimit të relesë
       save_and_enable: Ruaje dhe aktivizoje
-      setup: Ujdisni një lidhje rele
+      setup: Ujdisni një lidhje releje
       status: Gjendje
       title: Rele
     report_notes:
@@ -269,10 +343,11 @@ sq:
     reports:
       account:
         note: shënim
-        report: Raportoje
-      action_taken_by: 'Veprimi i ndërmarrë nga '
+        report: raportojeni
+      action_taken_by: Veprimi i ndërmarrë nga
       are_you_sure: A jeni i sigurt?
       assign_to_self: Caktojani vetes
+      assigned: Iu caktua moderator
       comment:
         none: Asnjë
       created_at: Raportuar më
@@ -283,38 +358,83 @@ sq:
         create_and_resolve: Zgjidhe me shënim
         create_and_unresolve: Rihape me shënim
         delete: Fshije
+        placeholder: Përshkruani ç’veprime janë ndërmarrë, ose çfarëdo përditësimi tjetër që lidhet me të…
       reopen: Rihape raportimin
       report: 'Raportim #%{id}'
       reported_account: Llogari e raportuar
       reported_by: Raportuar nga
+      resolved: I zgjidhur
+      resolved_msg: Raportimi u zgjidh me sukses!
       status: Gjendje
       title: Raportime
+      unassign: Hiqja
       unresolved: Të pazgjidhur
       updated_at: U përditësua më
     settings:
+      activity_api_enabled:
+        desc_html: Numër gjendjesh të postuara lokalisht, përdorues aktivë, dhe regjistrime të reja në kosha javorë
+        title: Botoni statistika përmbledhëse mbi veprimtarinë e përdoruesve
+      bootstrap_timeline_accounts:
+        desc_html: Emrat e përdoruesve ndajini prej njëri-tjetrit me presje. Do të funksionojë vetëm për llogari vendore dhe të pakyçura. Si parazgjedhje, kur lihet e zbrazët, është krejt përgjegjësit vendorë.
+        title: Ndjekje parazgjedhje për përdorues të rinj
+      contact_information:
+        email: Email biznesi
+        username: Emër përdoruesi kontakti
       custom_css:
+        desc_html: Modifikojeni pamjen me CSS të nagrkuar në çdo faqe
         title: CSS Vetjake
+      hero:
+        desc_html: E shfaqur në faqen ballore. Këshillohet të paktën 600x100px. Kur nuk caktohet gjë, përdoret miniaturë e shërbyesit
+        title: Figurë heroi
       mascot:
+        desc_html: E shfaqur në faqe të shumta. Këshillohet të paktën 293x205. Kur nuk caktohet gjë, përdoret simboli parazgjedhje
         title: Figurë simboli
       peers_api_enabled:
-        title: Boto listë instancash të zbuluara
+        desc_html: Emra përkatësish që ka hasur në fedivers ky shërbyes
+        title: Boto listë shërbyesish të gjetur
+      preview_sensitive_media:
+        desc_html: Në sajte të tjera, paraparjet e lidhjeve do të shfaqin një miniaturë, edhe pse medias i është vënë shenjë si rezervat
+        title: Shfaq në paraparje OpenGraph media me shenjën rezervat
       profile_directory:
         desc_html: Lejoju përdoruesve të jenë të zbulueshëm
         title: Aktivizo drejtori profilesh
       registrations:
+        closed_message:
+          desc_html: E shfaqur në faqen ballore, kur regjistrimet janë të mbyllura. Mund të përdorni etiketa HTML
+          title: Mesazh mbylljeje regjistrimesh
+        deletion:
+          desc_html: Lejo këdo të fshijë llogarinë e vet
+          title: Hapni fshirje llogarie
+        min_invite_role:
+          disabled: Asnjë
+          title: Lejo vetëm me ftesa
         open:
-          title: Hap regjistrim
+          desc_html: Lejo cilindo të krijojë llogari
+          title: Hapni regjistrimin
+      show_known_fediverse_at_about_page:
+        desc_html: Kur përdoret, do të shfaqë mesazhe prej krejt fediversit të njohur, si paraparje. Përndryshe do të shfaqë vetëm mesazhe vendore.
+        title: Shfaq te paraparja e rrjedhës kohore fedivers të njohur
       show_staff_badge:
         desc_html: Shfaq një stemë stafi në faqen e një përdoruesi
         title: Shfaq stemë stafi
       site_description:
-        title: Përshkrim instance
+        desc_html: Paragraf hyrës te faqja ballore. Përshkruani ç’e bën special këtë shërbyes Mastodon dhe çfarëdo gjëje tjetër të rëndësishme. Mund të përdorni etiketa HTML, veçanërisht <code>&lt;a&gt;</code> dhe <code>&lt;em&gt;</code>.
+        title: Përshkrim shërbyesi
+      site_description_extended:
+        desc_html: Një vend i mirë për kodin e sjelljes në shërbyesin tuaj, rregulla, udhëzime dhe gjëra të tjera që e bëjnë të veçantë këtë shërbyes. Mund të përdorni etiketa HTML
+        title: Informacion i zgjeruar vetjak
+      site_short_description:
+        desc_html: E shfaqur në anështyllë dhe etiketa meta. Përshkruani në një paragraf të vetëm ç’është Mastodon-i dhe ç’e bën special këtë shërbyes. Në u lëntë i zbrazët, për shërbyesin do të përdoret përshkrimi parazgjedhje.
+        title: Përshkrim i shkurtër shërbyesi
       site_terms:
+        desc_html: Mund të shkruani rregullat tuaja të privatësisë, kushtet e shërbimit ose gjëra të tjera ligjore. Mund të përdorni etiketa HTML
         title: Kushte vetjake shërbimi
-      site_title: Emër instance
+      site_title: Emër shërbyesi
       thumbnail:
-        title: Miniaturë instance
+        desc_html: I përdorur për paraparje përmes OpenGraph-it dhe API-t. Këshillohet 1200x630px
+        title: Miniaturë shërbyesi
       timeline_preview:
+        desc_html: Shfaqni rrjedhë kohore publike te faqja ardhjesh
         title: Paraparje rrjedhe kohore
       title: Rregullime sajti
     statuses:
@@ -332,7 +452,10 @@ sq:
       with_media: Me media
     subscriptions:
       callback_url: URL Callback-u
+      confirmed: U ripohua
       expires_in: Skadon më
+      last_delivery: Dorëzimi e fundit
+      title: WebSub
       topic: Temë
     tags:
       accounts: Llogari
@@ -347,9 +470,12 @@ sq:
       add_new: Shtoni të ri
       delete: Fshije
       edit: Përpunoni
+      edit_preset: Përpunoni sinjalizim të paracaktuar
+      title: Administroni sinjalizime të paracaktuara
   admin_mailer:
     new_report:
       body: "%{reporter} ka raportuar %{target}"
+      body_remote: Dikush nga %{domain} ka raportuar %{target}
       subject: Raport i ri për %{instance} (#%{id})
   application_mailer:
     notification_preferences: Ndryshoni parapëlqime email-i
@@ -363,13 +489,18 @@ sq:
     destroyed: Aplikacioni u fshi me sukses
     invalid_url: URL-ja e dhënë është e pavlefshme
     regenerate_token: Riprodho token hyrjesh
+    token_regenerated: Token-i i hyrjeve u riprodhuan me sukses
+    warning: Hapni sytë me ato të dhëna. Mos ia jepni kurrë njeriu!
     your_token: Token-i juaj për hyrje
   auth:
+    agreement_html: Duke klikuar mbi "Regjistrohuni" më poshtë, pajtoheni të ndiqni <a href="%{rules_path}">rregullat e shërbyesit</a> dhe <a href="%{terms_path}">kushtet tona të shërbimit</a>.
     change_password: Fjalëkalim
     confirm_email: Ripohoni email-in
     delete_account: Fshije llogarinë
+    delete_account_html: Nëse dëshironi të fshihni llogarinë tuaj, mund <a href="%{path}">ta bëni që këtu</a>. Do t’ju kërkohet ta ripohoni.
     didnt_get_confirmation: S’morët udhëzime ripohimi?
     forgot_password: Harruat fjalëkalimin tuaj?
+    invalid_reset_password_token: Token-i i ricaktimit të fjalëkalimit është i pavlefshëm ose ka skaduar. Ju lutemi, kërkoni një të ri.
     login: Hyni
     logout: Dalje
     migrate_account: Kaloni në një tjetër llogari
@@ -378,6 +509,7 @@ sq:
     or_log_in_with: Ose bëni hyrjen me
     providers:
       cas: CAS
+      saml: SAML
     register: Regjistrohuni
     register_elsewhere: Regjistrohuni në një tjetër shërbyes
     resend_confirmation: Ridërgo udhëzime ripohimi
@@ -386,11 +518,14 @@ sq:
     set_new_password: Caktoni fjalëkalim të ri
   authorize_follow:
     already_following: E ndiqni tashmë këtë llogari
+    error: Mjerisht, pati një gabim gjatë kërkimit të llogarisë së largët
     follow: Ndiqeni
     follow_request: 'Keni dërguar një kërkesë ndjekjeje te:'
     following: 'Sukses! Tani e ndiqni:'
     post_follow:
+      close: Ose, thjesht mund të mbyllni këtë dritare.
       return: Shfaq profilin e përdoruesit
+      web: Kalo në web
     title: Ndiq %{acct}
   datetime:
     distance_in_words:
@@ -407,34 +542,65 @@ sq:
       x_months: "%{count}mj"
       x_seconds: "%{count}s"
   deletes:
+    bad_password_msg: Provë e bukur, trimosha! Fjalëkalim i pasaktë
+    confirm_password: Jepni fjalëkalimin tuaj të tanishëm që të verifikohet identiteti juaj
+    description_html: Kjo të heqë <strong>në mënyrë të përhershme, të pakthyeshme</strong> lëndë nga llogaria juaj dhe do ta çaktivizojë atë. Emri juaj i përdoruesit do të mbetet i rezervuar për të shmangur sozi të ardhme.
     proceed: Fshini llogarinë
+    success_msg: Llogaria juaj u fshi me sukses
+    warning_html: Garantohet vetëm fshirja e lëndës prej këtij shërbyesi të veçantë. Lënda që është ndarë gjerësisht me të tjerët ka gjasa të lërë gjurmë. Shërbyesit <em>offline</em> dhe shërbyesit që janë shpajtuar prej përditësimeve tuaja, s’do t’i përditësojnë bazat e tyre të të dhënave.
+    warning_title: Mund të ketë lëndë të përhapur
   directories:
     directory: Drejtori profilesh
+    enabled: Gjendeni te lista e drejtorisë.
+    enabled_but_waiting: Keni zgjedhur të jeni pjesë e drejtorisë, por ende s’keni numrin minimum të ndjekësve (%{min_followers}) për përfshirje në të.
+    explanation: Zbuloni përdorues bazuar në interesat e tyre
     explore_mastodon: Eksploroni %{title}
+    how_to_enable: S’keni zgjedhur të jeni i pranishëm te drejtoria. Mund ta bëni më poshtë. Përdorni te teksti i jetëshkrimit tuaj hashtagë, për t’u përfshirë nën hashtagë specifikë!
     people:
       one: "%{count} person"
       other: "%{count} persona"
   errors:
     '403': S’keni leje të shihni këtë faqe.
-    '404': Faqja që po kërkonit, nuk ekziston.
-    '410': Faqja që po kërkonit, nuk ekziston më.
+    '404': Faqja që po kërkonit, s’gjendet këtu.
+    '410': Faqja që po kërkonit, s’gjendet më këtu.
     '422':
+      content: Verifikimi i sigurisë dështoi. Mos i bllokoni gjë cookie-t?
       title: Verifikimi i sigurisë dështoi
+    '429': Shumë kërkesa të bëra brenda një intervali të dhënë
     '500':
+      content: Na ndjeni, diçka shkoi ters në anën tonë.
       title: Kjo faqe s’është e saktë
+    noscript_html: Që të përdorni aplikacionin web Mastodon, ju lutemi, aktivizoni JavaScript-in. Ndryshe, provoni për Mastodon-in një nga <a href="%{apps_path}">aplikacionet e brendshëm</a> të platformës tuaj.
   exports:
     archive_takeout:
       date: Datë
+      download: Shkarkoni arkivin tuaj
+      hint_html: Mund të kërkoni një arkiv të <strong>mesazheve tuaja dhe medias së ngarkuar</strong> nga ju. Të dhënat e eksportuara do të jenë në formatin ActivityPub, të lexueshme nga cilido software i përputhshëm me të. Mund të kërkoni arkiv çdo 7 ditë.
+      in_progress: Po përpilohet arkivi juaj…
+      request: Kërkoni arkivin tuaj
       size: Madhësi
+    blocks: Bllokoni
     csv: CSV
+    domain_blocks: Bllokime përkatësish
+    follows: Ndiqni
     lists: Lista
+    mutes: Heshtoni
     storage: Depozitim për media
+  featured_tags:
+    add_new: Shtoni të re
+    errors:
+      limit: Keni përdorur tashmë si të zgjedhur sasinë maksimum të hashtagëve
   filters:
     contexts:
+      home: Rrjedhë kohore vetjake
       notifications: Njoftime
+      public: Rrjedha publike kohore
       thread: Biseda
     edit:
       title: Përpunoni filtër
+    errors:
+      invalid_context: Ose s’u dha fare, ose u dha kontekst i pavlefshëm
+      invalid_irreversible: Filtrim i pakthyeshëm funksionon vetëm me kontekste <em>home</em> ose njoftimesh
     index:
       delete: Fshije
       title: Filtra
@@ -442,8 +608,15 @@ sq:
       title: Shtoni filtër të ri
   followers:
     domain: Përkatësi
+    explanation_html: Nëse doni të garantoni privatësinë e gjendjeve tuaja, duhet të jeni në dijeni se cilët ju ndjekin. <strong>Gjendjet tuaja private u dërgohen krejt shërbyes ku keni ndjekës</strong>. Mund të donit t’i rishqyrtoni ato, dhe të hiqni ndjekës, nëse nuk besoni se privatësia juaj respektohet nga stafi apo software-i i këtyre shërbyesve.
     followers_count: Numër ndjekësish
+    lock_link: Kyçeni llogarinë tuaj
     purge: Hiqe nga ndjekësit
+    success:
+      one: Në përmbushje e sipër të bllokimit të butë të ndjekësve nga një përkatësi…
+      other: Në përmbushje e sipër të bllokimit të butë të ndjekësve nga %{count} përkatësi…
+    true_privacy_html: Ju lutemi, kini parasysh se <strong>privatësi e vërtetë mund të arrihet vetëm me fshehtëzim skaj-më-skaj</strong>.
+    unlocked_warning_html: Mund t’ju ndjekë cilido, që të shohë menjëherë gjendjet tuaja private. %{lock_link} që të jeni në gjendje të shqyrtoni dhe hidhni poshtë ndjekës.
     unlocked_warning_title: Llogaria juaj s’është kyçur
   footer:
     developers: Zhvillues
@@ -453,10 +626,27 @@ sq:
     changes_saved_msg: Ndryshimet u ruajtën me sukses!
     copy: Kopjoje
     save_changes: Ruaji ndryshimet
+    validation_errors:
+      one: Diçka s’është ende si duhet! Ju lutemi, shqyrtoni gabimin më poshtë
+      other: Diçka s’është ende si duhet! Ju lutemi, shqyrtoni %{count} gabimet më poshtë
   imports:
+    modes:
+      merge: Përzieji
+      merge_long: Mbaji zërat ekzistues dhe shto të rinjtë
+      overwrite: Mbishkruaje
+      overwrite_long: Zëvendësoji zërat ekzistues me të rinjtë
+    preface: Mund të importoni të dhëna që keni eksportuar nga një shërbyes tjetër, bie fjala, një listë të personave që ndiqni ose bllokoni.
+    success: Të dhënat tuaja u ngarkuan me sukses dhe tani do të përpunohet në kohë
     types:
       blocking: Listë bllokimesh
+      domain_blocking: Listë bllokimesh përkatësish
+      following: Listë ndjekjesh
+      muting: Listë heshtimesh
+    upload: Ngarkoje
+  in_memoriam_html: In Memoriam.
   invites:
+    delete: Çaktivizoje
+    expired: Ka skaduar
     expires_in:
       '1800': 30 minuta
       '21600': 6 orë
@@ -471,25 +661,59 @@ sq:
       one: 1 përdorim
       other: "%{count} përdorime"
     max_uses_prompt: Pa kufi
+    prompt: Prodhoni dhe ndani me të tjerët lidhje për të akorduar hyrje në këtë shërbyes
     table:
       expires_at: Skadon më
       uses: Përdorime
     title: Ftoni njerëz
+  lists:
+    errors:
+      limit: Keni mbërritur në numrin maksimum të sasisë së listave
+  media_attachments:
+    validations:
+      images_and_video: S’mund të bashkëngjitet video te një gjendje që përmban figura tashmë
+      too_many: S’mund të bashkëngjiten më shumë se 4 kartela
   migrations:
+    acct: emërpërdoruesi@përkatësi e llogarisë së re
+    currently_redirecting: 'Profili juaj është caktuar të ridrejtojë te:'
     proceed: Ruaje
+    updated_msg: Rregullimi juaj për migrim llogarish u përditësua me sukses!
   moderation:
     title: Moderim
   notification_mailer:
     digest:
       action: Shihini krejt njoftimet
+      body: Ja një përmbledhje e shkurtër e mesazheve që keni humbur që nga vizita juaj e fundit më %{since}
+      mention: "%{name} ju ka përmendur te:"
+      new_followers_summary:
+        one: Veç kësaj, u bëtë me një ndjekës të ri, teksa s’ishit këtu! Ëhë!
+        other: Veç kësaj, u bëtë me %{count} ndjekës të rinj, teksa s’ishit këtu! Shkëlqyeshëm!
+      subject:
+        one: "1 njoftim i ri që nga vizita juaj e fundit \U0001F418"
+        other: "%{count} 1 njoftime të reja që nga vizita juaj e fundit \U0001F418"
+      title: Gjatë mungesës tuaj…
     favourite:
+      body: 'Gjendja juaj u parapëlqye nga %{name}:'
+      subject: "%{name} parapëlqeu gjendjen tuaj"
       title: E parapëlqyer e re
     follow:
+      body: Tani ju ndjek %{name}!
+      subject: Tani ju ndjek %{name}
       title: Ndjekës i ri
+    follow_request:
+      action: Administroni kërkesa ndjekjeje
+      body: "%{name} ka kërkuar t’ju ndjekë"
+      subject: 'Ndjekës pezull: %{name}'
+      title: Kërkesë e re ndjekjeje
     mention:
+      action: Përgjigjuni
       body: 'U përmendët nga %{name} në:'
       subject: U përmendët nga %{name}
       title: Përmendje e re
+    reblog:
+      body: 'Gjendja juaj u përforcua nga %{name}:'
+      subject: "%{name} përforcoi gjendjen tuaj"
+      title: Përforcim i ri
   number:
     human:
       decimal_units:
@@ -501,19 +725,46 @@ sq:
           thousand: K
           trillion: T
   pagination:
+    newer: Më të ri
+    next: Pasuesi
+    older: Më të vjetër
+    prev: I mëparshmi
     truncate: "&hellip;"
   preferences:
     languages: Gjuhë
     other: Tjetër
     publishing: Publikim
     web: Web
+  remote_follow:
+    acct: Jepni çiftin tuaj emërpërdoruesi@përkatësi prej të cilit doni që të veprohet
+    missing_resource: S’u gjet dot URL-ja e domosdoshme e ridrejtimit për llogarinë tuaj
+    no_account_html: S’keni llogari? Mund të <a href='%{sign_up_path}' target='_blank'>regjistroheni këtu</a>
+    proceed: Ripohoni ndjekjen
+    prompt: 'Do të ndiqni:'
+    reason_html: "<strong>Pse është i domosdoshëm ky hap?</strong> <code>%{instance}</code> mund të mos jetë shërbyesi ku jeni regjistruar, ndaj na duhet t’ju ridrejtojmë së pari te shërbyesi juaj Home."
+  remote_interaction:
+    favourite:
+      proceed: Ripohoni parapëlqimin
+      prompt: 'Doni të parapëlqeni këtë mesazh:'
+    reblog:
+      proceed: Ripohoni përforcimin
+      prompt: 'Doni të përforconi këtë mesazh:'
+    reply:
+      proceed: Ripohoni përgjigjen
+      prompt: 'Doni t’i përgjigjeni këtij mesazhi:'
   remote_unfollow:
     error: Gabim
     title: Titull
+    unfollowed: U hoq ndjekja
+  scheduled_statuses:
+    over_daily_limit: Keni tejkaluar kufirin e %{limit} mesazheve të planifikuara për atë ditë
+    over_total_limit: Keni tejkaluar kufirin prej %{limit} mesazhesh të planifikuara
+    too_soon: Data e planifikimit duhet të bjerë në të ardhmen
   sessions:
     activity: Veprimtaria e fundit
     browser: Shfletues
     browsers:
+      alipay: Alipay
       blackberry: Blackberry
       chrome: Chrome
       edge: Microsoft Edge
@@ -532,6 +783,7 @@ sq:
       weibo: Weibo
     current_session: Sesioni i tanishëm
     description: "%{browser} në %{platform}"
+    explanation: Këta janë shfletuesit e futur në këtë çast te llogaria juaj Mastodon.
     ip: IP
     platforms:
       adobe_air: Adobe Air
@@ -547,6 +799,7 @@ sq:
       windows_mobile: Windows Mobile
       windows_phone: Windows Phone
     revoke: Shfuqizoje
+    revoke_success: Sesioni u shfuqizua me sukses
     title: Sesione
   settings:
     authorized_apps: Aplikacione të autorizuara
@@ -555,58 +808,203 @@ sq:
     development: Zhvillim
     edit_profile: Përpunoni profilin
     export: Eksportim të dhënash
+    featured_tags: Hashtagë të zgjedhur
     followers: Ndjekës të autorizuar
     import: Importo
     migrate: Migrim llogarie
     notifications: Njoftime
     preferences: Parapëlqime
     settings: Rregullime
+    two_factor_authentication: Mirëfilltësim Dyfaktorësh
     your_apps: Aplikacionet tuaja
   statuses:
     attached:
+      description: 'Bashkëngjitur: %{attached}'
       image:
         one: "%{count} figurë"
         other: "%{count} figura"
       video:
         one: "%{count} video"
         other: "%{count} video"
+    boosted_from_html: Përforcuar nga %{acct_link}
     content_warning: 'Sinjalizim lënde: %{warning}'
+    disallowed_hashtags:
+      one: 'përmbante një hashtag të palejuar: %{tags}'
+      other: 'përmbante hashtagët e palejuar: %{tags}'
+    language_detection: Zbulo gjuhë vetvetiu
+    open_in_web: Hape në internet
+    over_character_limit: u tejkalua kufi shenjash prej %{max}
+    pin_errors:
+      limit: Keni fiksuar tashmë numrin maksimum të mesazheve
+      ownership: S’mund të fiksohen mesazhet e të tjerëve
+      private: S’mund të fiksohet mesazh jopublik
+      reblog: S’mund të fiksohet një përforcim
     show_more: Shfaq më tepër
+    sign_in_to_participate: Bëni hyrjen, që të merrni pjesë te biseda
     title: '%{name}: "%{quote}"'
     visibilities:
       private: Vetëm ndjekësve
       private_long: Shfaqua vetëm ndjekësve
       public: Publike
       public_long: Mund ta shohë kushdo
+      unlisted: Jo në listë
+      unlisted_long: Mund ta shohë gjithkush, por s’gjendet në rrjedha publike kohore
+  stream_entries:
+    pinned: Mesazh i fiksuar
+    reblogged: të përforcuara
+    sensitive_content: Lëndë me spec
+  terms:
+    body_html: |
+      <h2>Rregulla Privatësie</h2>
+      <h3 id="collect">Ç’të dhëna grumbullojmë?</h3>
+
+      <ul>
+        <li><em>Të dhëna bazë llogarie</em>: Nëse regjistroheni në këtë shërbyes, mund t’ju kërkohet të jepni një emër përdoruesi, një adresë email dhe një fjalëkalim. Mundet të jepni edhe të dhëna shtesë profili, të tilla si emër në ekran dhe jetëshkrim, dhe të ngarkoni një foto profili dhe figurë kryesh. Emri i përdoruesit, emri për në ekran, jetëshkrimi, fotoja e profilit dhe figura për kryet shfaqen përherë publikisht.</li>
+        <li><em>Postime, ndjekje dhe të tjera të dhëna publike</em>: Lista e personave që ndiqni shfaqet publikisht, po njësoj edhe ajo e ndjekësve tuaj. Kur parashtroni një mesazh, depozitohet data dhe koha, si dhe aplikacioni prej nga u parashtrua mesazhi. Mesazhet mund të përmbajnë bashkëngjitje media, bie fjala, foto dhe video. Postimet publike dhe ato të pashfaqura janë të passhme publikisht. Kur një postim e vini të zgjedhur në profilin tuaj, edhe ky është informacion i passhëm publikisht. Postimet tuaja janë u dërgohen ndjekësve tuaj, në disa raste kjo do të thotë se dërgohen në shërbyes të ndryshëm dhe në ta depozitohen kopje të tyre. Kur fshini postime, edhe kjo u dërgohet ndjekësve tuaj. Veprimi i riblogimit apo i parapëlqimit të një postimi tjetër është përherë publik.</li>
+        <li><em>Postime të drejtpërdrejta dhe ato vetëm për ndjekësit</em>: Krejt postimet depozitohen dhe trajtohen te shërbyesi. Postimet vetëm për ndjekës u dërgohen ndjekësve tuaj të cilët përmenden në to, dhe postimet e drejtpërdrejta u dërgohen vetëm përdoruesve të përmendur në to. Në disa raste kjo do të thotë se dërgohen në shërbyes të ndryshëm dhe në ta depozitohen kopje të tyre. Përpiqemi pa hile të kufizojmë hyrjen në këto postime vetëm të personave të autorizuar, por shërbyesit e tjerë mund të mos bëjnë të njëjtën gjë. Ndaj është e rëndësishme të shqyrtoni shërbyesit pjesë e të cilëve janë ndjekësit tuaj. Te rregullimet mund të përdorni një mundësi për të miratuar ose hedhur poshtë dorazi ndjekës të rinj. <em>Ju lutemi, mbani parasysh se operatorët e shërbyesit dhe cilido shërbyes marrës mund t’i shohin mesazhe të tillë</em>, dhe që marrësit mund të bëjnë për ta foto ekrani, t’i kopjojnë ose t’i rindajnë ato me të tjerët. <em>Mos u jepni të tjerëve të dhëna të rrezikshme përmes Mastodon-it.</em></li>
+        <li><em>IP dhe të tjera tejtëdhëna</em>: Kur bëni hyrjen, regjistrojmë adresën IP prej nga hytë, si dhe emrin e shfletuesit tuaj. Krejt sesionet e hyrjeve janë të shqyrtueshme nga ju dhe shfuqizim, që nga rregullimet. Adresa e fundit IP e përdorur depozitohet për 12 muaj. Mund të mbajmë edhe regjistra shërbyesi të cilët përfshijnë adresën IP të çdo kërkese ndaj shërbyesit tonë.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="use">Përse i përdorim të dhënat tuaja?</h3>
+
+      <p>Cilado prej të dhënave që grumbullojmë prej jush mund të përdoret në rrugët vijuese:</p>
+
+      <ul>
+        <li>Për të mundësuar funksionimin bazë të Mastodon-it. Mundeni të ndërveproni me lëndën e personave të tjerë dhe të postoni lëndë tuajën vetëm kur jeni i futur në llogarinë tuaj. Për shembull, mund të ndiqni njerëz të tjerë për të parë postimet e tyre të ndërthurura te rrjedha juaj kohore e përshtatur.</li>
+        <li>Për të ndihmuar moderimin e bashkësisë, për shembull, duke krahasuar adresën tuaj IP me të tjera të njohura, për të përcaktuar shmangie nga dëbime ose cenime të tjera.</li>
+        <li>Adresa email që jepni mund të përdoret për t’ju dërguar informacion, njoftime mbi persona të tjerë që ndërveprojnë me lëndën tuaj ose që ju dërgojnë mesazhe, dhe për t’iu përgjigju pyetjeve dhe/ose kërkesave të tjera.</li>
+      </ul>
+
+      <hr class="spacer" />
+
+      <h3 id="protect">Si i mbrojmë të dhënat tuaja?</h3>
+
+      <p>Vëmë në punë një larmi masash sigurie për të ruajtur të parrezikuara të dhënat tuaja personale kur jepni, parashtroni, ose hyni në to. Mes të tjerash, sesioni juaj i shfletimit, si edhe trafiku mes aplikacioneve tuaja dhe API-t, sigurohen me SSL, dhe fjalëkalimi juaj mbrohet duke përdorur një algoritëm të sigurt njëdrejtimsh. Për të siguruar edhe më hyrjet te llogaria juaj, mund të aktivizoni mirëfilltësimin dyfaktorësh.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="data-retention">Cilat janë rregullat tona mbi mbajtjen e të dhënave?</h3>
+
+      <p>Do të përpiqemi pa hile:</p>
+
+      <ul>
+        <li>Të mbajmë regjistra shërbyesi që përmbajnë adresën IP të krejt kërkesave te ky shërbyes, sa kohë që regjistra të tillë mbahen, për jo më shumë se 90 ditë.</li>
+        <li>Të mbajmë adresat IP përshoqëruar me përdoruesit e regjistruar, për jo më shumë se 12 muaj.</li>
+      </ul>
+
+      <p>Mund të kërkoni dhe të shkarkoni një arkiv të lëndës tuaj, përfshi postimet tuaja, bashkëngjitje media, foto profili, dhe figurë kryesh.</p>
+
+      <p>Mund të fshini në mënyrë të pakthyeshme llogarinë tuaj në çfarëdo kohe.</p>
+
+      <hr class="spacer"/>
+
+      <h3 id="cookies">A përdorim <em>cookies</em>?</h3>
+
+      <p>Po. <em>Cookie</em>-t janë kartela të vockla që një sajt ose furnizuesi i shërbimit për të i depoziton në diskun e kompjuterit tuaj përmes shfletuesit (nëse e lejoni ju). Këto <em>cookies</em> i bëjnë të mundur sajtit të njohë shfletuesin tuaj dhe, nëse keni një llogari të regjistuar, ta përshoqërojë atë    me llogarinë tuaj të regjistuar.</p>
+
+      <p>Ne i përdorim <em>cookie</em>-t për të kuptuar dhe ruajtur parapëlqimet tuaja, për vizita të ardhshme.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="disclose">A u japim palëve të treta ndonjë të dhënë?</h3>
+
+      <p>Nuk u shesim, shkëmbejmë, ose transferojmë në rrugë të tjera palëve të treta të dhëna tuajat personale që lejojnë identifikimin tuaj. Kjo nuk përfshin palë të treta të besuara që nga ndihmojnë të xhirojmë sajtin tonë, të bëjmë punën tonë, ose t’ju shërbejmë juve, sa kohë që këto palë pajtohen t’i mbajnë të fshehta këto të dhëna. Mund të japim të dhëna tuajat kur besojmë se kjo është e nevojshme për të qenë në rregull me ligjin, për të zbatuar rregullat e sajtit tonë, ose për të mbrojtur të drejta, pronësi, ose siguri tonën apo të të tjerëve.</p>
+
+      <p>Lënda juaj publike mund të shkarkohet nga shërbyes të tjerë në rrjet. Postimet tuaja publike dhe ato vetëm për ndjekësit dërgohen te shërbyesit ku gjenden ndjekësit tuaj, dhe mesazhet e drejtpërdrejtë jepen te shërbyesit e marrësve, për rastet ku këta ndjekës apo marrës gjenden në një tjetër shërbyes nga i këtushmi.</p>
+
+      <p>Kur autorizoni një aplikacion të përdorë llogarinë tuaj, në varësi të shtrirje së lejeve që miratoni, aplikacioni mund të hyjë në të dhënat e profilit tuaj publik, listat tuaja të ndjekjeve, ndjekësit tuaj, lista tuajat, krejt postimet tuaja, dhe të parapëlqyerit tuaj. Aplikacionet s’mund të njohin kurrë adresën tuaj email ose fjalëkalimin.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="children">Përdorim i sajtit nga fëmijë</h3>
+
+      <p>Nëse ky shërbyes gjendet në BE apo në ZEE: Krejt sajti, produktet dhe shërbimet tona u drejtohen personave që janë të paktën 16 vjeç. Nëse jeni nën moshën 16 vjeç, sipas kërkesave të GDPR-së (<a href="https://en.wikipedia.org/wiki/General_Data_Protection_Regulation">General Data Protection Regulation</a>), mos e përdorni këtë sajt.</p>
+
+      <p>Nëse ky shërbyes gjendet në ShBA: Krejt sajti, produktet dhe shërbimet tona u drejtohen personave që janë të paktën 13 vjeç. Nëse jeni nën moshën 13 vjeç, sipas kërkesave të COPPA (<a href="https://en.wikipedia.org/wiki/Children%27s_Online_Privacy_Protection_Act">Children's Online Privacy Protection Act</a>), mos e përdorni këtë sajt.</p>
+
+      <p>Domosdoshmëritë e ligjit mund të jenë të ndryshme, nëse ky shërbyes gjendet në një tjetër juridiksion.</p>
+
+      <hr class="spacer" />
+
+      <h3 id="changes">Ndryshime te Rregullat tona të Privatësisë</h3>
+
+      <p>Nëse vendosim të ndryshojmë rregullat tona të privatësisë, këto ndryshime do t’i botojmë në këtë faqe.</p>
+
+      <p>Ky dokument është CC-BY-SA. U përditësua së fundmi më 7 mars, 2018.</p>
+
+      <p>Përshtatur fillimisht nga <a href="https://github.com/discourse/discourse">rregullat e privatësisë në Discourse</a>.</p>
+    title: Kushte Shërbimi dhe Rregulla Privatësie te %{instance}
   themes:
-    contrast: Me kontrast të lartë
-    default: Mastodon
-    mastodon-light: Mastodon (light)
+    contrast: Mastodon (Me shumë kontrast)
+    default: Mastodon (I errët)
+    mastodon-light: Mastodon (I çelët)
   time:
     formats:
       default: "%d %b, %Y, %H:%M"
       month: "%b %Y"
   two_factor_authentication:
+    code_hint: Që të bëhet ripohimi, jepni kodin e prodhuar nga aplikacioni juaj i mirëfilltësimeve
+    description_html: Nëse aktivizoni <strong>mirëfilltësimin dyfaktorësh</strong>, hyrja do të kërkojë të jeni në zotërim të telefonit tuaj, i cili do të prodhojë kod që duhet ta jepni.
     disable: Çaktivizoje
     enable: Aktivizoje
+    enabled: Mirëfilltësimi dyfaktorësh është i aktivizuar
     enabled_success: Mirëfilltësimi dyfaktorësh u aktivizua me sukses
+    generate_recovery_codes: Prodho kode rikthimesh
+    instructions_html: "<strong>Skanojeni këtë kod QR me Google Authenticator ose një aplikacion TOTP të ngjashëm në telefonin tuaj</strong>. Tani e tutje, ai aplikacion do të prodhojë kode të cilët duhet t’i jepni kur bëni hyrje."
+    lost_recovery_codes: Kodet e rikthimit ju lejojnë të rifitoni hyrje në llogarinë tuaj, nëse humbni telefonin tuaj. Nëse keni humbur kodet tuaj të rikthimit, mund t’i prodhoni sërish këtu. Kodet tuaj të vjetër të rikthimit do të bëhen të pavlefshëm.
+    manual_instructions: 'Nëse s’skanoni dot kodin QR dhe ju duhet ta jepni dorazi, ja e fshehta si tekst i thjeshtë:'
+    recovery_codes: Kopjeruani kode rikthimesh
+    recovery_codes_regenerated: Kodet e rikthimeve u riprodhuan me sukses
+    recovery_instructions_html: Në ndodhtë që të humbni hyrje te telefoni juaj, mund të përdorni një nga kodet e rikthimit më poshtë, që të rifitoni hyrje te llogaria juaj. <strong>Mbajini të parrezikuar kodet e rikthimeve</strong>. Për shembull, mund t’i shtypni dhe t’i ruani tok me dokumente të tjerë të rëndësishëm.
+    setup: Rregullojeni
+    wrong_code: Kodi i dhënë është i pavlefshëm! A janë të sakta koha e shërbyesit dhe koha e pajisjes?
   user_mailer:
     backup_ready:
+      explanation: Kërkuat një kopjeruajtje të plotë të llogarisë tuaj Mastodon. E keni gati për shkarkim!
       subject: Arkivi juaj është gati për shkarkim
+      title: Marrje arkivi me vete
     warning:
+      explanation:
+        disable: Kur llogaria juaj është e ngrirë, të dhënat në llogarinë tuaj mbeten të paprekura, por s’mund të kryeni ndonjë veprim, para se të shkyçet.
+        silence: Kur llogaria juaj është e kufizuar, mesazhet tuaj në këtë shërbyes do t’i shohin vetëm personat që ju ndjekin tashmë. dhe mund të liheni jashtë nga lista të ndryshme publike. Megjithatë, të tjerët prapë mund t’ju ndjekin dorazi.
+        suspend: Llogaria juaj është pezulluar, dhe krejt mesazhet tuaja dhe kartelat media të ngarkuara janë hequr në mënyrë të pakthyeshme nga ky shërbyes, dhe nga shërbyesit te të cilët kishit ndjekës.
+      review_server_policies: Shqyrtoni rregullat e shërbyesit
       subject:
         disable: Llogaria juaj %{acct} është ngrirë
         none: Sinjalizim për %{acct}
         silence: Llogaria juaj %{acct} është kufizuar
+        suspend: Llogaria juaj %{acct} është pezulluar
+      title:
+        disable: Llogari e ngrirë
+        none: Sinjalizim
+        silence: Llogari e kufizuar
+        suspend: Llogari e pezulluar
     welcome:
+      edit_profile_action: Rregullim profili
+      edit_profile_step: Profilin mund ta personalizoni duke ngarkuar një avatar, figurë kryesh, duke ndryshuar emrin tuaj në ekran, etj. Nëse dëshironi të shqyrtoni ndjekës të rinj, përpara se të jenë lejuar t’ju ndjekin, mund të kyçni llogarinë tuaj.
       explanation: Ja disa ndihmëza, sa për t’ia filluar
       final_action: Filloni të postoni
+      final_step: 'Filloni të postoni! Edhe pse pa ndjekës, mesazhet tuaj publike mund të shihen nga të tjerët, për shembull te rrjedha kohore vendore dhe në hashtagë. Mund të donit të prezantoni veten nën hashtagun #introductions.'
+      full_handle: Identifikuesi juaj i plotë
+      full_handle_hint: Kjo është ajo çka do të duhej t’u tregonit shokëve tuaj, që të mund t’ju dërgojnë mesazhe ose t’ju ndjekin nga një shërbyes tjetër.
+      review_preferences_action: Ndryshoni parapëlqime
+      review_preferences_step: Mos harroni të caktoni parapëlqimet tuaja, fjala vjen, ç’email-e dëshironi të merrni, ose çfarë shkalle privatësie do të donit të kishin, si parazgjedhje, postimet tuaja. Nëse nuk ju merren mendtë nga rrotullimi, mund të zgjidhni të aktivizoni vetëluajtje GIF-esh.
       subject: Mirë se vini te Mastodon-i
+      tip_federated_timeline: Rrjedha kohore e të federuarve është një pamje e fluksit të rrjetit Mastodon. Por përfshin vetëm persona te të cilët janë pajtuar fqinjët tuaj, pra s’është e plotë.
+      tip_following: Përgjegjësin e shërbyesit tuaj e ndiqni, si parazgjedhje. Për të gjetur më shumë persona interesantë, shihni te rrjedha kohore vendore dhe ajo e të federuarve.
+      tip_local_timeline: Rrjedha kohore vendore është një pamje e fluksit të njerëzve në %{instance}. Këta janë fqinjët tuaj më të afërt!
+      tip_mobile_webapp: Nëse shfletuesi juaj celular ju ofron të shtohet Mastodon-i te skena juaj e kreut, mund të merrni njoftime <em>push</em>. Nga shumë pikëpamje vepron si një aplikacion i brendshëm i platformës së celularit!
       tips: Ndihmëza
       title: Mirë se vini, %{name}!
   users:
+    follow_limit_reached: S’mund të ndiqni më tepër se %{limit} persona
     invalid_email: Adresa email është e pavlefshme
     invalid_otp_token: Kod dyfaktorësh i pavlefshëm
+    otp_lost_help_html: Nëse humbi hyrjen te të dy, mund të lidheni me %{email}
+    seamless_external_login: Jeni futur përmes një shërbimi të jashtëm, ndaj s’ka rregullime fjalëkalimi dhe email.
     signed_in_as: 'I futur si:'
   verification:
+    explanation_html: 'Mundeni <strong>të verifikoni veten si i zoti i lidhjeve te tejtëdhënat e profilit tuaj</strong>. Për këtë, sajti i lidhur duhet të përmbajë një lidhje për te profili juaj Mastodon. Lidhje për te ajo <strong>duhet</strong> të ketë një atribut <code>rel="me"</code>. Lënda tekst e lidhjes nuk ngre peshë. Ja një shembull:'
     verification: Verifikim
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index c38b73f2e2..fefbb66676 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -1,73 +1,177 @@
 ---
 tr:
   about:
+    about_hashtag_html: Bunlar <strong>#%{hashtag}X</strong> ile etiketlenen genel paylaşımlar. Açık alanda herhangi bir yerde bir hesabınız varsa, onlarla etkileşime geçebilirsiniz.
     about_mastodon_html: Mastodon <em>ücretsiz ve açık kaynaklı</em> bir sosyal ağdır. <em>Merkezileştirilmemiş</em> yapısı sayesinde diğer ticari sosyal platformların aksine iletişimininizin tek bir firmada tutulmasının/yönetilmesinin önüne geçer. Güvendiğiniz bir sunucuyu seçerek oradaki kişilerle etkileşimde bulunabilirsiniz. Herkes kendi Mastodon sunucusunu kurabilir ve sorunsuz bir şekilde Mastodon <em>sosyal ağına</em> dahil edebilir.
     about_this: Bu sunucu hakkında
-    closed_registrations: Bu sunucu şu anda yeni kayıt almamaktadır.
+    administered_by: 'Tarafından yönetildi:'
+    api: API
+    apps: Mobil uygulamalar
+    closed_registrations: Bu sunucudaki kayıtlar şu anda kapalı. Ancak! Bir hesap oluşturmak ve oradan aynı ağa erişmek için farklı bir sunucu bulabilirsiniz.
     contact: Ä°letiÅŸim
-    other_instances: DiÄŸer sunucular
+    contact_missing: Ayarlanmadı
+    contact_unavailable: Yok
+    documentation: Belgeler
+    extended_description_html: |
+      <h3>Kural için iyi bir yer</h3>
+      <p>Genişletilmiş açıklama henüz ayarlanmamış.</p>
+    features:
+      humane_approach_body: Diğer ağların başarısızlıklarından öğrenen Mastodon, sosyal medyanın kötüye kullanımı ile mücadele etmek için etik tasarım seçimleri yapmayı amaçlamaktadır.
+      humane_approach_title: Daha insancıl bir yaklaşım
+      not_a_product_body: Mastodon ticari bir ağ değildir. Reklam yok, Veri madenciliği yok, duvarlı bahçeler yok. Merkezi bir otorite yok.
+      not_a_product_title: Sen bir insansın, bir ürün değil
+      real_conversation_body: Emrindeki 500 karakter ve granüler içerik ve medya uyarıları için destek ile kendinizi istediğiniz şekilde ifade edebilirsiniz.
+      real_conversation_title: Gerçek sohbet için üretildi
+      within_reach_body: Geliştirici dostu bir API ekosistemi sayesinde iOS, Android ve diğer platformlar için birden fazla uygulama, arkadaşlarınıza her yerden ulaşmanızı sağlar.
+      within_reach_title: Her zaman ulaşılabilir
+    generic_description: "%{domain} aÄŸdaki bir sunucudur"
+    hosted_on: Mastodon %{domain} üzerinde barındırılıyor
+    learn_more: Daha fazla bilgi edinin
+    other_instances: Sunucu listesi
+    privacy_policy: Gizlilik politikası
     source_code: Kaynak kodu
-    status_count_after: adet gönderi yazıldı.
+    status_count_after:
+      one: durum
+      other: durum
     status_count_before: Åžu ana kadar
-    user_count_after: kullanıcı var.
+    terms: Kullanım şartları
+    user_count_after:
+      one: kullanıcı
+      other: kullanıcı
     user_count_before: Kayıtlı
+    what_is_mastodon: Mastodon nedir?
   accounts:
+    choices_html: "%{name} seçimleri:"
     follow: Takip et
-    followers: Takipçiler
+    followers:
+      one: Takipçi
+      other: Takipçi
     following: Takip ediliyor
+    joined: "%{date} tarihinde katıldı"
+    link_verified_on: Bu bağlantının mülkiyeti %{date} tarihinde kontrol edildi
+    media: Medya
+    moved_html: "%{name}, %{new_profile_link} adresine taşındı:"
+    network_hidden: Bu bilgi mevcut deÄŸil
     nothing_here: Burada henüz hiçbir gönderi yok!
     people_followed_by: Kullanıcı %{name}'in takip ettikleri
     people_who_follow: Kullanıcı %{name}'i takip edenler
-    posts: Gönderiler
+    pin_errors:
+      following: Onaylamak istediğiniz kişiyi zaten takip ediyor olmalısınız
+    posts:
+      one: Toot
+      other: Tootlar
+    posts_tab_heading: Tootlar
+    posts_with_replies: Tootlar ve yanıtlar
+    reserved_username: Kullanıcı adı saklıdır
+    roles:
+      admin: Yönetici
+      bot: Bot
+      moderator: Denetleyici
     unfollow: Takibi bırak
   admin:
+    account_actions:
+      action: Eylemi gerçekleştir
+    account_moderation_notes:
+      create: Not bırakın
+      created_msg: Denetim notu başarıyla oluşturuldu!
+      delete: Sil
+      destroyed_msg: Denetim notu başarıyla yok edildi!
     accounts:
       are_you_sure: Emin misiniz?
+      by_domain: Sunucu
+      change_email:
+        changed_msg: Hesap e-postası başarıyla değiştirildi!
+        current_email: Mevcut e-posta
+        label: E-postayı değiştir
+        new_email: Yeni e-posta
+        submit: E-postayı değiştir
+        title: "%{username} için e-postayı değiştir"
       confirm: Onayla
       confirmed: Onaylandı
       confirming: Onaylama
+      deleted: Silinen
+      disable: Devre dışı
+      disable_two_factor_authentication: 2AD kapat
+      disabled: Kapalı
       display_name: Görünen adınız
       domain: Sunucu
       edit: Düzenle
       email: E-posta
-      email_status: Email Durumu
+      email_status: E-posta durumu
+      enable: EtkinleÅŸtir
+      enabled: Etkin
       feed_url: Besleme linki
       followers: Takipçiler
+      followers_url: Takipçi bağlantısı
       follows: Takip edilen
+      header: Ãœstbilgi
+      inbox_url: Gelen kutusu bağlantısı
+      invited_by: Tarafından davet edildi
+      ip: IP
+      joined: Katıldı
       location:
         all: Hepsi
         local: Yerel
         remote: Uzaktan
         title: Konum
+      login_status: GiriÅŸ durumu
       media_attachments: Medya ekleri
+      memorialize: Bir hatıraya dön
       moderation:
         all: Hepsi
         silenced: Susturulanlar
         suspended: Uzaklaştırılanlar
         title: Yönetim
+      moderation_notes: Denetleme notları
       most_recent_activity: Son aktivite
       most_recent_ip: Son IP
       not_subscribed: Abone edilmedi
-      perform_full_suspension: Tamamen uzaklaştır
+      perform_full_suspension: Askıya al
       profile_url: Profil linki
+      promote: Yükselt
+      protocol: Protokol
       public: Herkese açık
       push_subscription_expires: PuSH aboneliÄŸi dolumu
+      redownload: Profili yenile
+      remove_avatar: Avatarı kaldır
+      remove_header: Üstbilgiyi kaldır
       resend_confirmation:
         already_confirmed: Bu kullanıcı zaten onaylandı
         send: Doğrulama epostasını yeniden gönder
         success: Onay e-postası başarıyla gönderildi!
+      reset: Sıfırla
       reset_password: Parolayı değiştir
+      resubscribe: Yeniden abone ol
+      role: Ä°zinler
+      roles:
+        admin: Yönetici
+        moderator: Denetleyici
+        staff: Personel
+        user: Kullanıcı
       salmon_url: Salmon Linki
+      search: Ara
+      shared_inbox_url: Paylaşılan gelen kutusu bağlantısı
       show:
-        created_reports: Bu hesap tarafından gelen şikayetler
-        targeted_reports: Bu hesaba gelen ÅŸikayetler
+        created_reports: Yapılan şikayetler
+        targeted_reports: Başkaları tarafından şikayet edildi
       silence: Sustur
+      silenced: SusturulmuÅŸ
       statuses: Durumlar
+      subscribe: Abone ol
+      suspended: Askıya alındı
       title: Hesaplar
+      unconfirmed_email: Onaylanmamış e-posta
       undo_silenced: Susturmayı geri al
       undo_suspension: Uzaklaştırmayı geri al
+      unsubscribe: Abonelikten çık
       username: Kullanıcı adı
+      warn: Uyar
       web: Web
+    action_logs:
+      actions:
+        confirm_user: "%{name} %{target} kullanıcısının e-posta adresini onayladı"
+        create_custom_emoji: "%{name} yeni ifade yükledi %{target}"
+        disable_2fa_user: "%{name}, %{target} kullanıcısı için iki adım gereksinimini kapattı"
     domain_blocks:
       add_new: Yeni ekle
       created_msg: Domain bloÄŸu ÅŸu an iÅŸleniyor
@@ -131,7 +235,15 @@ tr:
       last_delivery: Son gönderim
       title: WebSub
       topic: Konu
+    tags:
+      accounts: Hesaplar
+      name: Etiketler
+      title: Etiketler
     title: Yönetim
+    warning_presets:
+      add_new: Yeni ekle
+      delete: Sil
+      edit: Düzenle
   application_mailer:
     settings: 'E-mail tercihlerini deÄŸiÅŸtir: %{link}'
     view: 'Görüntüle:'
-- 
GitLab


From 96db7191d8becc44eb3203ece94f71fe29f32e67 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Sat, 23 Feb 2019 22:20:20 +0100
Subject: [PATCH 122/192] Bump version to 2.7.3 (#10102)

---
 CHANGELOG.md            | 17 +++++++++++++++++
 lib/mastodon/version.rb |  2 +-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index f3356d5422..b7040f9247 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,23 @@ Changelog
 
 All notable changes to this project will be documented in this file.
 
+## [2.7.3] - 2019-02-23
+### Added
+
+- Add domain filter to the admin federation page ([ThibG](https://github.com/tootsuite/mastodon/pull/10071))
+- Add quick link from admin account view to block/unblock instance ([ThibG](https://github.com/tootsuite/mastodon/pull/10073))
+
+### Fixed
+
+- Fix video player width not being updated to fit container width ([ThibG](https://github.com/tootsuite/mastodon/pull/10069))
+- Fix domain filter being shown in admin page when local filter is active ([ThibG](https://github.com/tootsuite/mastodon/pull/10074))
+- Fix crash when conversations have no valid participants ([ThibG](https://github.com/tootsuite/mastodon/pull/10078))
+- Fix error when performing admin actions on no statuses ([ThibG](https://github.com/tootsuite/mastodon/pull/10094))
+
+### Changed
+
+- Change custom emojis to randomize stored file name ([hinaloe](https://github.com/tootsuite/mastodon/pull/10090))
+
 ## [2.7.2] - 2019-02-17
 ### Added
 
diff --git a/lib/mastodon/version.rb b/lib/mastodon/version.rb
index 81dd253ae9..005cd52f6d 100644
--- a/lib/mastodon/version.rb
+++ b/lib/mastodon/version.rb
@@ -13,7 +13,7 @@ module Mastodon
     end
 
     def patch
-      2
+      3
     end
 
     def pre
-- 
GitLab


From 57483f2ffb59aff3e4ab68f8d291e7c5e886dc77 Mon Sep 17 00:00:00 2001
From: Aditoo17 <42938951+Aditoo17@users.noreply.github.com>
Date: Sat, 23 Feb 2019 22:20:35 +0100
Subject: [PATCH 123/192] I18n: Add language options for Kazakh and Lithuanian
 (#10104)

---
 app/helpers/settings_helper.rb | 2 ++
 config/application.rb          | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/app/helpers/settings_helper.rb b/app/helpers/settings_helper.rb
index e868b45c01..241addb832 100644
--- a/app/helpers/settings_helper.rb
+++ b/app/helpers/settings_helper.rb
@@ -29,7 +29,9 @@ module SettingsHelper
     it: 'Italiano',
     ja: '日本語',
     ka: 'ქართული',
+    kk: 'Қазақша',
     ko: '한국어',
+    lt: 'Lietuvių',
     lv: 'Latviešu',
     ml: 'മലയാളം',
     ms: 'Bahasa Melayu',
diff --git a/config/application.rb b/config/application.rb
index ae9ce48970..54df698112 100644
--- a/config/application.rb
+++ b/config/application.rb
@@ -63,7 +63,9 @@ module Mastodon
       :it,
       :ja,
       :ka,
+      :kk,
       :ko,
+      :lt,
       :lv,
       :ms,
       :nl,
-- 
GitLab


From e050958794e436a61863cc62b0d7c54afb971ca4 Mon Sep 17 00:00:00 2001
From: NOGISAKA Sadata <ngsksdt@gmail.com>
Date: Sun, 24 Feb 2019 22:28:36 +0900
Subject: [PATCH 124/192] Skip some methods in BatchedRemoveStatusService when
 account is nil (#10095)

* Skip some methods in BatchedRemoveStatusService when account is nil

Sometimes `bin/tootctl accounts cull` fails with below error:

undefined method `followers_for_local_distribution' for nil:NilClass (NoMethodError)

This commit makes BatchedRemoveStatusService to skip below methods when
`account` is nil:

- unpush_from_home_timelines()
- unpush_from_list_timelines()
- batch_stream_entries()

* Fix rubocop error: Use `next` to skip iteration.
---
 app/services/batched_remove_status_service.rb | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/services/batched_remove_status_service.rb b/app/services/batched_remove_status_service.rb
index cd3b14e08e..e328b17391 100644
--- a/app/services/batched_remove_status_service.rb
+++ b/app/services/batched_remove_status_service.rb
@@ -35,6 +35,8 @@ class BatchedRemoveStatusService < BaseService
     statuses.group_by(&:account_id).each_value do |account_statuses|
       account = account_statuses.first.account
 
+      next unless account
+
       unpush_from_home_timelines(account, account_statuses)
       unpush_from_list_timelines(account, account_statuses)
 
-- 
GitLab


From 1dbf993bce5627e2c3fcab6e9c63b5279dff018a Mon Sep 17 00:00:00 2001
From: Sir-Boops <admin@boops.me>
Date: Sun, 24 Feb 2019 08:32:40 -0700
Subject: [PATCH 125/192] Switch to Ubuntu for docker (#10100)

---
 Dockerfile | 205 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 121 insertions(+), 84 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 2b15381ec5..aaad870ddb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,89 +1,126 @@
-FROM node:8.15-alpine as node
-FROM ruby:2.6-alpine3.9
-
-LABEL maintainer="https://github.com/tootsuite/mastodon" \
-      description="Your self-hosted, globally interconnected microblogging community"
-
+FROM ubuntu:18.04 as build-dep
+
+# Use bash for the shell
+SHELL ["bash", "-c"]
+
+# Install Node
+ENV NODE_VER="8.15.0"
+RUN	echo "Etc/UTC" > /etc/localtime && \
+	apt update && \
+	apt -y dist-upgrade && \
+	apt -y install wget make gcc g++ python && \
+	cd ~ && \
+	wget https://nodejs.org/download/release/v$NODE_VER/node-v$NODE_VER.tar.gz && \
+	tar xf node-v$NODE_VER.tar.gz && \
+	cd node-v$NODE_VER && \
+	./configure --prefix=/opt/node && \
+	make -j$(nproc) > /dev/null && \
+	make install
+
+# Install jemalloc
+ENV JE_VER="5.1.0"
+RUN apt -y install autoconf && \
+	cd ~ && \
+	wget https://github.com/jemalloc/jemalloc/archive/$JE_VER.tar.gz && \
+	tar xf $JE_VER.tar.gz && \
+	cd jemalloc-$JE_VER && \
+	./autogen.sh && \
+	./configure --prefix=/opt/jemalloc && \
+	make -j$(nproc) > /dev/null && \
+	make install_bin install_include install_lib
+
+# Install ruby
+ENV RUBY_VER="2.6.1"
+ENV CPPFLAGS="-I/opt/jemalloc/include"
+ENV LDFLAGS="-L/opt/jemalloc/lib/"
+RUN apt -y install build-essential \
+		bison libyaml-dev libgdbm-dev libreadline-dev \
+		libncurses5-dev libffi-dev zlib1g-dev libssl-dev && \
+	cd ~ && \
+	wget https://cache.ruby-lang.org/pub/ruby/${RUBY_VER%.*}/ruby-$RUBY_VER.tar.gz && \
+	tar xf ruby-$RUBY_VER.tar.gz && \
+	cd ruby-$RUBY_VER && \
+	./configure --prefix=/opt/ruby \
+	  --with-jemalloc \
+	  --with-shared \
+	  --disable-install-doc && \
+	ln -s /opt/jemalloc/lib/* /usr/lib/ && \
+	make -j$(nproc) > /dev/null && \
+	make install
+
+ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin"
+
+RUN npm install -g yarn && \
+	gem install bundler
+
+COPY . /opt/mastodon
+
+RUN apt -y install git libicu-dev libidn11-dev \
+	libpq-dev libprotobuf-dev protobuf-compiler && \
+	cd /opt/mastodon && \
+	bundle install -j$(nproc) --deployment --without development test && \
+	yarn install --pure-lockfile
+
+FROM ubuntu:18.04
+
+# Copy over all the langs needed for runtime
+COPY --from=build-dep /opt/node /opt/node
+COPY --from=build-dep /opt/ruby /opt/ruby
+COPY --from=build-dep /opt/jemalloc /opt/jemalloc
+
+# Add more PATHs to the PATH
+ENV PATH="${PATH}:/opt/ruby/bin:/opt/node/bin:/opt/mastodon/bin"
+
+# Create the mastodon user
 ARG UID=991
 ARG GID=991
-
-ENV PATH=/mastodon/bin:$PATH \
-    RAILS_SERVE_STATIC_FILES=true \
-    RAILS_ENV=production \
-    NODE_ENV=production
-
-ARG LIBICONV_VERSION=1.15
-ARG LIBICONV_DOWNLOAD_SHA256=ccf536620a45458d26ba83887a983b96827001e92a13847b45e4925cc8913178
-
-EXPOSE 3000 4000
-
-WORKDIR /mastodon
-
-COPY --from=node /usr/local/bin/node /usr/local/bin/node
-COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules
-COPY --from=node /usr/local/bin/npm /usr/local/bin/npm
-COPY --from=node /opt/yarn-* /opt/yarn
-
-RUN apk add --no-cache -t build-dependencies \
-    build-base \
-    icu-dev \
-    libidn-dev \
-    openssl \
-    libtool \
-    libxml2-dev \
-    libxslt-dev \
-    postgresql-dev \
-    protobuf-dev \
-    python \
- && apk add --no-cache \
-    ca-certificates \
-    ffmpeg \
-    file \
-    git \
-    icu-libs \
-    imagemagick \
-    libidn \
-    libpq \
-    libxml2 \
-    libxslt \
-    protobuf \
-    tini \
-    tzdata \
- && update-ca-certificates \
- && ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn \
- && ln -s /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg \
- && mkdir -p /tmp/src /opt \
- && wget -O libiconv.tar.gz "https://ftp.gnu.org/pub/gnu/libiconv/libiconv-$LIBICONV_VERSION.tar.gz" \
- && echo "$LIBICONV_DOWNLOAD_SHA256 *libiconv.tar.gz" | sha256sum -c - \
- && tar -xzf libiconv.tar.gz -C /tmp/src \
- && rm libiconv.tar.gz \
- && cd /tmp/src/libiconv-$LIBICONV_VERSION \
- && ./configure --prefix=/usr/local \
- && make -j$(getconf _NPROCESSORS_ONLN)\
- && make install \
- && libtool --finish /usr/local/lib \
- && cd /mastodon \
- && rm -rf /tmp/*
-
-COPY Gemfile Gemfile.lock package.json yarn.lock .yarnclean /mastodon/
-
-RUN bundle config build.nokogiri --use-system-libraries --with-iconv-lib=/usr/local/lib --with-iconv-include=/usr/local/include \
- && bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without test development \
- && yarn install --pure-lockfile --ignore-engines \
- && yarn cache clean
-
-RUN addgroup -g ${GID} mastodon && adduser -h /mastodon -s /bin/sh -D -G mastodon -u ${UID} mastodon \
- && mkdir -p /mastodon/public/system /mastodon/public/assets /mastodon/public/packs \
- && chown -R mastodon:mastodon /mastodon/public
-
-COPY . /mastodon
-
-RUN chown -R mastodon:mastodon /mastodon
-
-VOLUME /mastodon/public/system
-
+RUN apt update && \
+	echo "Etc/UTC" > /etc/localtime && \
+	ln -s /opt/jemalloc/lib/* /usr/lib/ && \
+	apt -y dist-upgrade && \
+	apt install -y whois && \
+	addgroup --gid $GID mastodon && \
+	useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
+	echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd
+
+# Copy over masto source from building and set permissions
+COPY --from=build-dep --chown=mastodon:mastodon /opt/mastodon /opt/mastodon
+
+# Install masto runtime deps
+RUN apt -y --no-install-recommends install \
+	  libssl1.1 libpq5 imagemagick ffmpeg \
+	  libicu60 libprotobuf10 libidn11 libyaml-0-2 \
+	  file ca-certificates tzdata libreadline7 && \
+	apt -y install gcc && \
+	ln -s /opt/mastodon /mastodon && \
+	gem install bundler
+
+# Clean up more dirs
+RUN rm -rf /var/cache && \
+	rm -rf /var/apt
+
+# Add tini
+ENV TINI_VERSION="0.18.0"
+ENV TINI_SUM="12d20136605531b09a2c2dac02ccee85e1b874eb322ef6baf7561cd93f93c855"
+ADD https://github.com/krallin/tini/releases/download/v${TINI_VERSION}/tini /tini
+RUN echo "$TINI_SUM tini" | sha256sum -c -
+RUN chmod +x /tini
+
+# Run masto services in prod mode
+ENV RAILS_ENV="production"
+ENV NODE_ENV="production"
+
+# Tell rails to serve static files
+ENV RAILS_SERVE_STATIC_FILES="true"
+
+# Set the run user
 USER mastodon
 
-RUN OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder bundle exec rails assets:precompile
+# Precompile assets
+RUN cd ~ && \
+	OTP_SECRET=precompile_placeholder SECRET_KEY_BASE=precompile_placeholder rails assets:precompile && \
+	yarn cache clean
 
-ENTRYPOINT ["/sbin/tini", "--"]
+# Set the work dir and the container entry point
+WORKDIR /opt/mastodon
+ENTRYPOINT ["/tini", "--"]
-- 
GitLab


From 3a44827d3f69fedb9a41f9c8fb3b763deec6f723 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 25 Feb 2019 01:10:56 +0100
Subject: [PATCH 126/192] Fix web UI not removing notifications after block
 (#10108)

Regression from #7311
---
 app/javascript/mastodon/reducers/notifications.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/javascript/mastodon/reducers/notifications.js b/app/javascript/mastodon/reducers/notifications.js
index 19a02f5b15..c891f4a522 100644
--- a/app/javascript/mastodon/reducers/notifications.js
+++ b/app/javascript/mastodon/reducers/notifications.js
@@ -108,6 +108,7 @@ export default function notifications(state = initialState, action) {
   case NOTIFICATIONS_EXPAND_SUCCESS:
     return expandNormalizedNotifications(state, action.notifications, action.next);
   case ACCOUNT_BLOCK_SUCCESS:
+    return filterNotifications(state, action.relationship);
   case ACCOUNT_MUTE_SUCCESS:
     return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state;
   case NOTIFICATIONS_CLEAR:
-- 
GitLab


From 16fb39cffc0a959220e376817672f010da87c995 Mon Sep 17 00:00:00 2001
From: mohemohe <mohemohe@users.noreply.github.com>
Date: Mon, 25 Feb 2019 12:06:24 +0900
Subject: [PATCH 127/192] Fix fail health check due to missing wget (#10110)

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index aaad870ddb..1263efc934 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -78,7 +78,7 @@ RUN apt update && \
 	echo "Etc/UTC" > /etc/localtime && \
 	ln -s /opt/jemalloc/lib/* /usr/lib/ && \
 	apt -y dist-upgrade && \
-	apt install -y whois && \
+	apt install -y whois wget && \
 	addgroup --gid $GID mastodon && \
 	useradd -m -u $UID -g $GID -d /opt/mastodon mastodon && \
 	echo "mastodon:`head /dev/urandom | tr -dc A-Za-z0-9 | head -c 24 | mkpasswd -s -m sha-256`" | chpasswd
-- 
GitLab


From 9dd54ffb1c04dd7ba216a4420efce75fb9f603e7 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Mon, 25 Feb 2019 15:54:17 +0100
Subject: [PATCH 128/192] Avoid redundant HTTP request on some error cases
 (#10115)

---
 app/helpers/jsonld_helper.rb | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/helpers/jsonld_helper.rb b/app/helpers/jsonld_helper.rb
index 5323972723..59e4ae6851 100644
--- a/app/helpers/jsonld_helper.rb
+++ b/app/helpers/jsonld_helper.rb
@@ -68,6 +68,7 @@ module JsonLdHelper
       return body_to_json(response.body_with_limit) if response.code == 200
     end
     # If request failed, retry without doing it on behalf of a user
+    return if on_behalf_of.nil?
     build_request(uri).perform do |response|
       response.code == 200 ? body_to_json(response.body_with_limit) : nil
     end
-- 
GitLab


From 66adca6113fe5047c7ce55c031acc9a3e8b00c3b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Mon, 25 Feb 2019 15:55:22 +0100
Subject: [PATCH 129/192] Bump sidekiq-unique-jobs from 6.0.9 to 6.0.11
 (#10113)

Bumps [sidekiq-unique-jobs](https://github.com/mhenrixon/sidekiq-unique-jobs) from 6.0.9 to 6.0.11.
- [Release notes](https://github.com/mhenrixon/sidekiq-unique-jobs/releases)
- [Changelog](https://github.com/mhenrixon/sidekiq-unique-jobs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mhenrixon/sidekiq-unique-jobs/compare/v6.0.9...v6.0.11)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 8d46764e78..02460bb6b0 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -563,9 +563,9 @@ GEM
       rufus-scheduler (~> 3.2)
       sidekiq (>= 3)
       tilt (>= 1.4.0)
-    sidekiq-unique-jobs (6.0.9)
+    sidekiq-unique-jobs (6.0.11)
       concurrent-ruby (~> 1.0, >= 1.0.5)
-      sidekiq (>= 4.0, < 6.0)
+      sidekiq (>= 4.0, < 7.0)
       thor (~> 0)
     simple-navigation (4.0.5)
       activesupport (>= 2.3.2)
-- 
GitLab


From c07e59031f3e25fd0f9c50bcccacabf3ec3c42e1 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Mon, 25 Feb 2019 15:55:53 +0100
Subject: [PATCH 130/192] Bump dotenv-rails from 2.6.0 to 2.7.1 (#10114)

Bumps [dotenv-rails](https://github.com/bkeepers/dotenv) from 2.6.0 to 2.7.1.
- [Release notes](https://github.com/bkeepers/dotenv/releases)
- [Changelog](https://github.com/bkeepers/dotenv/blob/master/Changelog.md)
- [Commits](https://github.com/bkeepers/dotenv/compare/v2.6.0...v2.7.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      |  2 +-
 Gemfile.lock | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/Gemfile b/Gemfile
index 3309be52be..a8bda438a2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -13,7 +13,7 @@ gem 'hamlit-rails', '~> 0.2'
 gem 'pg', '~> 1.1'
 gem 'makara', '~> 0.4'
 gem 'pghero', '~> 2.2'
-gem 'dotenv-rails', '~> 2.6'
+gem 'dotenv-rails', '~> 2.7'
 
 gem 'aws-sdk-s3', '~> 1.30', require: false
 gem 'fog-core', '<= 2.1.0'
diff --git a/Gemfile.lock b/Gemfile.lock
index 02460bb6b0..524c9e51e4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -185,10 +185,10 @@ GEM
       unf (>= 0.0.5, < 1.0.0)
     doorkeeper (5.0.2)
       railties (>= 4.2)
-    dotenv (2.6.0)
-    dotenv-rails (2.6.0)
-      dotenv (= 2.6.0)
-      railties (>= 3.2, < 6.0)
+    dotenv (2.7.1)
+    dotenv-rails (2.7.1)
+      dotenv (= 2.7.1)
+      railties (>= 3.2, < 6.1)
     elasticsearch (6.0.2)
       elasticsearch-api (= 6.0.2)
       elasticsearch-transport (= 6.0.2)
@@ -680,7 +680,7 @@ DEPENDENCIES
   devise-two-factor (~> 3.0)
   devise_pam_authenticatable2 (~> 9.2)
   doorkeeper (~> 5.0)
-  dotenv-rails (~> 2.6)
+  dotenv-rails (~> 2.7)
   fabrication (~> 2.20)
   faker (~> 1.9)
   fast_blank (~> 1.0)
-- 
GitLab


From 775e835ed6e30c95d628abe11aaae7bfc66fde23 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Mon, 25 Feb 2019 15:56:35 +0100
Subject: [PATCH 131/192] Bump rubocop from 0.64.0 to 0.65.0 (#10112)

Bumps [rubocop](https://github.com/rubocop-hq/rubocop) from 0.64.0 to 0.65.0.
- [Release notes](https://github.com/rubocop-hq/rubocop/releases)
- [Changelog](https://github.com/rubocop-hq/rubocop/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop-hq/rubocop/compare/v0.64.0...v0.65.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index a8bda438a2..e6d7bd4d01 100644
--- a/Gemfile
+++ b/Gemfile
@@ -127,7 +127,7 @@ group :development do
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.3'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.64', require: false
+  gem 'rubocop', '~> 0.65', require: false
   gem 'brakeman', '~> 4.4', require: false
   gem 'bundler-audit', '~> 0.6', require: false
   gem 'scss_lint', '~> 0.57', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 524c9e51e4..b7cdf484f4 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -418,6 +418,7 @@ GEM
       pry (~> 0.10)
     pry-rails (0.3.9)
       pry (>= 0.10.4)
+    psych (3.1.0)
     public_suffix (3.0.3)
     puma (3.12.0)
     pundit (2.0.1)
@@ -525,11 +526,12 @@ GEM
       rspec-core (~> 3.0, >= 3.0.0)
       sidekiq (>= 2.4.0)
     rspec-support (3.8.0)
-    rubocop (0.64.0)
+    rubocop (0.65.0)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
       parser (>= 2.5, != 2.5.1.1)
       powerpack (~> 0.1)
+      psych (>= 3.1.0)
       rainbow (>= 2.2.2, < 4.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (~> 1.4.0)
@@ -746,7 +748,7 @@ DEPENDENCIES
   rqrcode (~> 0.10)
   rspec-rails (~> 3.8)
   rspec-sidekiq (~> 3.0)
-  rubocop (~> 0.64)
+  rubocop (~> 0.65)
   sanitize (~> 5.0)
   scss_lint (~> 0.57)
   sidekiq (~> 5.2)
-- 
GitLab


From 6e9481ad7dc95e365c55e862383f2a583b332110 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Tue, 26 Feb 2019 19:46:12 +0900
Subject: [PATCH 132/192] Bump bootsnap from 1.4.0 to 1.4.1 (#10118)

Bumps [bootsnap](https://github.com/Shopify/bootsnap) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/Shopify/bootsnap/releases)
- [Changelog](https://github.com/Shopify/bootsnap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Shopify/bootsnap/compare/v1.4.0...v1.4.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index b7cdf484f4..65f7578037 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -98,7 +98,7 @@ GEM
       rack (>= 0.9.0)
     binding_of_caller (0.8.0)
       debug_inspector (>= 0.0.1)
-    bootsnap (1.4.0)
+    bootsnap (1.4.1)
       msgpack (~> 1.0)
     brakeman (4.4.0)
     browser (2.5.3)
-- 
GitLab


From ea58e31822d07ca2286f971bf6b0275954dd2726 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Tue, 26 Feb 2019 20:16:48 +0900
Subject: [PATCH 133/192] Bump hamlit-rails from 0.2.0 to 0.2.1 (#10120)

Bumps [hamlit-rails](https://github.com/mfung/hamlit-rails) from 0.2.0 to 0.2.1.
- [Release notes](https://github.com/mfung/hamlit-rails/releases)
- [Commits](https://github.com/mfung/hamlit-rails/compare/v0.2.0...v0.2.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index 65f7578037..a92fadb8a8 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -239,11 +239,11 @@ GEM
       http (~> 3.0)
       nokogiri (~> 1.8)
       oj (~> 3.0)
-    hamlit (2.8.8)
+    hamlit (2.9.2)
       temple (>= 0.8.0)
       thor
       tilt
-    hamlit-rails (0.2.0)
+    hamlit-rails (0.2.1)
       actionpack (>= 4.0.1)
       activesupport (>= 4.0.1)
       hamlit (>= 1.2.0)
@@ -603,7 +603,7 @@ GEM
       climate_control (>= 0.0.3, < 1.0)
     thor (0.20.3)
     thread_safe (0.3.6)
-    tilt (2.0.8)
+    tilt (2.0.9)
     timers (4.2.0)
     tty-color (0.4.3)
     tty-command (0.8.2)
-- 
GitLab


From e7f20cc43ff21afa229da40ee4e5755495948772 Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Tue, 26 Feb 2019 15:21:36 +0100
Subject: [PATCH 134/192] Add type, limit, offset, min_id, max_id, account_id
 to search API (#10091)

* Add type, limit, offset, min_id, max_id, account_id to search API

Fix #8939

* Make the offset work on accounts and hashtags search as well

* Assure brakeman we are not doing mass assignment here

* Do not allow paginating unless a type is chosen

* Fix search query and index id field on statuses instead of created_at
---
 app/chewy/statuses_index.rb                   |   2 +-
 .../api/v1/accounts/search_controller.rb      |   5 +-
 app/controllers/api/v1/search_controller.rb   |  26 +--
 app/controllers/api/v2/search_controller.rb   |   2 +-
 app/models/account.rb                         |  16 +-
 app/models/tag.rb                             |   8 +-
 app/services/account_search_service.rb        |  11 +-
 app/services/search_service.rb                |  84 ++++++--
 config/brakeman.ignore                        | 181 ++++--------------
 spec/services/account_search_service_spec.rb  |  36 ++--
 spec/services/search_service_spec.rb          |  20 +-
 11 files changed, 161 insertions(+), 230 deletions(-)

diff --git a/app/chewy/statuses_index.rb b/app/chewy/statuses_index.rb
index eafc1818b8..8ce413f8a4 100644
--- a/app/chewy/statuses_index.rb
+++ b/app/chewy/statuses_index.rb
@@ -48,6 +48,7 @@ class StatusesIndex < Chewy::Index
     end
 
     root date_detection: false do
+      field :id, type: 'long'
       field :account_id, type: 'long'
 
       field :text, type: 'text', value: ->(status) { [status.spoiler_text, Formatter.instance.plaintext(status)].concat(status.media_attachments.map(&:description)).join("\n\n") } do
@@ -55,7 +56,6 @@ class StatusesIndex < Chewy::Index
       end
 
       field :searchable_by, type: 'long', value: ->(status, crutches) { status.searchable_by(crutches) }
-      field :created_at, type: 'date'
     end
   end
 end
diff --git a/app/controllers/api/v1/accounts/search_controller.rb b/app/controllers/api/v1/accounts/search_controller.rb
index 91c9f15472..4217b527a5 100644
--- a/app/controllers/api/v1/accounts/search_controller.rb
+++ b/app/controllers/api/v1/accounts/search_controller.rb
@@ -16,10 +16,11 @@ class Api::V1::Accounts::SearchController < Api::BaseController
   def account_search
     AccountSearchService.new.call(
       params[:q],
-      limit_param(DEFAULT_ACCOUNTS_LIMIT),
       current_account,
+      limit: limit_param(DEFAULT_ACCOUNTS_LIMIT),
       resolve: truthy_param?(:resolve),
-      following: truthy_param?(:following)
+      following: truthy_param?(:following),
+      offset: params[:offset]
     )
   end
 end
diff --git a/app/controllers/api/v1/search_controller.rb b/app/controllers/api/v1/search_controller.rb
index dc1a37599e..6131cbbb69 100644
--- a/app/controllers/api/v1/search_controller.rb
+++ b/app/controllers/api/v1/search_controller.rb
@@ -3,7 +3,7 @@
 class Api::V1::SearchController < Api::BaseController
   include Authorization
 
-  RESULTS_LIMIT = 5
+  RESULTS_LIMIT = 20
 
   before_action -> { doorkeeper_authorize! :read, :'read:search' }
   before_action :require_user!
@@ -11,30 +11,22 @@ class Api::V1::SearchController < Api::BaseController
   respond_to :json
 
   def index
-    @search = Search.new(search)
+    @search = Search.new(search_results)
     render json: @search, serializer: REST::SearchSerializer
   end
 
   private
 
-  def search
-    search_results.tap do |search|
-      search[:statuses].keep_if do |status|
-        begin
-          authorize status, :show?
-        rescue Mastodon::NotPermittedError
-          false
-        end
-      end
-    end
-  end
-
   def search_results
     SearchService.new.call(
       params[:q],
-      RESULTS_LIMIT,
-      truthy_param?(:resolve),
-      current_account
+      current_account,
+      limit_param(RESULTS_LIMIT),
+      search_params.merge(resolve: truthy_param?(:resolve))
     )
   end
+
+  def search_params
+    params.permit(:type, :offset, :min_id, :max_id, :account_id)
+  end
 end
diff --git a/app/controllers/api/v2/search_controller.rb b/app/controllers/api/v2/search_controller.rb
index 2e91d68ee3..9aa6edc696 100644
--- a/app/controllers/api/v2/search_controller.rb
+++ b/app/controllers/api/v2/search_controller.rb
@@ -2,7 +2,7 @@
 
 class Api::V2::SearchController < Api::V1::SearchController
   def index
-    @search = Search.new(search)
+    @search = Search.new(search_results)
     render json: @search, serializer: REST::V2::SearchSerializer
   end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index 12d7a747ee..87ce90178a 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -386,7 +386,7 @@ class Account < ApplicationRecord
       DeliveryFailureTracker.filter(urls)
     end
 
-    def search_for(terms, limit = 10)
+    def search_for(terms, limit = 10, offset = 0)
       textsearch, query = generate_query_for_search(terms)
 
       sql = <<-SQL.squish
@@ -398,15 +398,15 @@ class Account < ApplicationRecord
           AND accounts.suspended = false
           AND accounts.moved_to_account_id IS NULL
         ORDER BY rank DESC
-        LIMIT ?
+        LIMIT ? OFFSET ?
       SQL
 
-      records = find_by_sql([sql, limit])
+      records = find_by_sql([sql, limit, offset])
       ActiveRecord::Associations::Preloader.new.preload(records, :account_stat)
       records
     end
 
-    def advanced_search_for(terms, account, limit = 10, following = false)
+    def advanced_search_for(terms, account, limit = 10, following = false, offset = 0)
       textsearch, query = generate_query_for_search(terms)
 
       if following
@@ -427,10 +427,10 @@ class Account < ApplicationRecord
             AND accounts.moved_to_account_id IS NULL
           GROUP BY accounts.id
           ORDER BY rank DESC
-          LIMIT ?
+          LIMIT ? OFFSET ?
         SQL
 
-        records = find_by_sql([sql, account.id, account.id, account.id, limit])
+        records = find_by_sql([sql, account.id, account.id, account.id, limit, offset])
       else
         sql = <<-SQL.squish
           SELECT
@@ -443,10 +443,10 @@ class Account < ApplicationRecord
             AND accounts.moved_to_account_id IS NULL
           GROUP BY accounts.id
           ORDER BY rank DESC
-          LIMIT ?
+          LIMIT ? OFFSET ?
         SQL
 
-        records = find_by_sql([sql, account.id, account.id, limit])
+        records = find_by_sql([sql, account.id, account.id, limit, offset])
       end
 
       ActiveRecord::Associations::Preloader.new.preload(records, :account_stat)
diff --git a/app/models/tag.rb b/app/models/tag.rb
index 4373e967b2..788a678bde 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -64,9 +64,13 @@ class Tag < ApplicationRecord
   end
 
   class << self
-    def search_for(term, limit = 5)
+    def search_for(term, limit = 5, offset = 0)
       pattern = sanitize_sql_like(term.strip) + '%'
-      Tag.where('lower(name) like lower(?)', pattern).order(:name).limit(limit)
+
+      Tag.where('lower(name) like lower(?)', pattern)
+         .order(:name)
+         .limit(limit)
+         .offset(offset)
     end
   end
 
diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb
index 7edbd9b479..7bdffbbd22 100644
--- a/app/services/account_search_service.rb
+++ b/app/services/account_search_service.rb
@@ -1,11 +1,12 @@
 # frozen_string_literal: true
 
 class AccountSearchService < BaseService
-  attr_reader :query, :limit, :options, :account
+  attr_reader :query, :limit, :offset, :options, :account
 
-  def call(query, limit, account = nil, options = {})
+  def call(query, account = nil, options = {})
     @query   = query.strip
-    @limit   = limit
+    @limit   = options[:limit].to_i
+    @offset  = options[:offset].to_i
     @options = options
     @account = account
 
@@ -83,11 +84,11 @@ class AccountSearchService < BaseService
   end
 
   def advanced_search_results
-    Account.advanced_search_for(terms_for_query, account, limit, options[:following])
+    Account.advanced_search_for(terms_for_query, account, limit, options[:following], offset)
   end
 
   def simple_search_results
-    Account.search_for(terms_for_query, limit)
+    Account.search_for(terms_for_query, limit, offset)
   end
 
   def terms_for_query
diff --git a/app/services/search_service.rb b/app/services/search_service.rb
index 1c31e0509a..e0da61dac5 100644
--- a/app/services/search_service.rb
+++ b/app/services/search_service.rb
@@ -1,18 +1,18 @@
 # frozen_string_literal: true
 
 class SearchService < BaseService
-  attr_accessor :query, :account, :limit, :resolve
-
-  def call(query, limit, resolve = false, account = nil)
+  def call(query, account, limit, options = {})
     @query   = query.strip
     @account = account
-    @limit   = limit
-    @resolve = resolve
+    @options = options
+    @limit   = limit.to_i
+    @offset  = options[:type].blank? ? 0 : options[:offset].to_i
+    @resolve = options[:resolve] || false
 
     default_results.tap do |results|
       if url_query?
         results.merge!(url_resource_results) unless url_resource.nil?
-      elsif query.present?
+      elsif @query.present?
         results[:accounts] = perform_accounts_search! if account_searchable?
         results[:statuses] = perform_statuses_search! if full_text_searchable?
         results[:hashtags] = perform_hashtags_search! if hashtag_searchable?
@@ -23,23 +23,46 @@ class SearchService < BaseService
   private
 
   def perform_accounts_search!
-    AccountSearchService.new.call(query, limit, account, resolve: resolve)
+    AccountSearchService.new.call(
+      @query,
+      @account,
+      limit: @limit,
+      resolve: @resolve,
+      offset: @offset
+    )
   end
 
   def perform_statuses_search!
-    statuses = StatusesIndex.filter(term: { searchable_by: account.id })
-                            .query(multi_match: { type: 'most_fields', query: query, operator: 'and', fields: %w(text text.stemmed) })
-                            .limit(limit)
-                            .objects
-                            .compact
+    definition = StatusesIndex.filter(term: { searchable_by: @account.id })
+                              .query(multi_match: { type: 'most_fields', query: @query, operator: 'and', fields: %w(text text.stemmed) })
+
+    if @options[:account_id].present?
+      definition = definition.filter(term: { account_id: @options[:account_id] })
+    end
+
+    if @options[:min_id].present? || @options[:max_id].present?
+      range      = {}
+      range[:gt] = @options[:min_id].to_i if @options[:min_id].present?
+      range[:lt] = @options[:max_id].to_i if @options[:max_id].present?
+      definition = definition.filter(range: { id: range })
+    end
+
+    results             = definition.limit(@limit).offset(@offset).objects.compact
+    account_ids         = results.map(&:account_id)
+    account_domains     = results.map(&:account_domain)
+    preloaded_relations = relations_map_for_account(@account, account_ids, account_domains)
 
-    statuses.reject { |status| StatusFilter.new(status, account).filtered? }
+    results.reject { |status| StatusFilter.new(status, @account, preloaded_relations).filtered? }
   rescue Faraday::ConnectionFailed
     []
   end
 
   def perform_hashtags_search!
-    Tag.search_for(query.gsub(/\A#/, ''), limit)
+    Tag.search_for(
+      @query.gsub(/\A#/, ''),
+      @limit,
+      @offset
+    )
   end
 
   def default_results
@@ -47,7 +70,7 @@ class SearchService < BaseService
   end
 
   def url_query?
-    query =~ /\Ahttps?:\/\//
+    @options[:type].blank? && @query =~ /\Ahttps?:\/\//
   end
 
   def url_resource_results
@@ -55,7 +78,7 @@ class SearchService < BaseService
   end
 
   def url_resource
-    @_url_resource ||= ResolveURLService.new.call(query, on_behalf_of: @account)
+    @_url_resource ||= ResolveURLService.new.call(@query, on_behalf_of: @account)
   end
 
   def url_resource_symbol
@@ -64,14 +87,37 @@ class SearchService < BaseService
 
   def full_text_searchable?
     return false unless Chewy.enabled?
-    !account.nil? && !((query.start_with?('#') || query.include?('@')) && !query.include?(' '))
+
+    statuses_search? && !@account.nil? && !((@query.start_with?('#') || @query.include?('@')) && !@query.include?(' '))
   end
 
   def account_searchable?
-    !(query.include?('@') && query.include?(' '))
+    account_search? && !(@query.include?('@') && @query.include?(' '))
   end
 
   def hashtag_searchable?
-    !query.include?('@')
+    hashtag_search? && !@query.include?('@')
+  end
+
+  def account_search?
+    @options[:type].blank? || @options[:type] == 'accounts'
+  end
+
+  def hashtag_search?
+    @options[:type].blank? || @options[:type] == 'hashtags'
+  end
+
+  def statuses_search?
+    @options[:type].blank? || @options[:type] == 'statuses'
+  end
+
+  def relations_map_for_account(account, account_ids, domains)
+    {
+      blocking: Account.blocking_map(account_ids, account.id),
+      blocked_by: Account.blocked_by_map(account_ids, account.id),
+      muting: Account.muting_map(account_ids, account.id),
+      following: Account.following_map(account_ids, account.id),
+      domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id),
+    }
   end
 end
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 58fb243da4..7e3828f7e0 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -1,5 +1,25 @@
 {
   "ignored_warnings": [
+    {
+      "warning_type": "Mass Assignment",
+      "warning_code": 105,
+      "fingerprint": "0117d2be5947ea4e4fbed9c15f23c6615b12c6892973411820c83d079808819d",
+      "check_name": "PermitAttributes",
+      "message": "Potentially dangerous key allowed for mass assignment",
+      "file": "app/controllers/api/v1/search_controller.rb",
+      "line": 30,
+      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
+      "code": "params.permit(:type, :offset, :min_id, :max_id, :account_id)",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Api::V1::SearchController",
+        "method": "search_params"
+      },
+      "user_input": ":account_id",
+      "confidence": "High",
+      "note": ""
+    },
     {
       "warning_type": "SQL Injection",
       "warning_code": 0,
@@ -20,25 +40,6 @@
       "confidence": "High",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "0adbe361b91afff22ba51e5fc2275ec703cc13255a0cb3eecd8dab223ab9f61e",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 167,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).inbox_url, Account.find(params[:id]).inbox_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).inbox_url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "SQL Injection",
       "warning_code": 0,
@@ -46,7 +47,7 @@
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 84,
+      "line": 87,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "result.joins(\"INNER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
       "render_path": null,
@@ -59,44 +60,6 @@
       "confidence": "Weak",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "1fc29c578d0c89bf13bd5476829d272d54cd06b92ccf6df18568fa1f2674926e",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 173,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).shared_inbox_url, Account.find(params[:id]).shared_inbox_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).shared_inbox_url",
-      "confidence": "Weak",
-      "note": ""
-    },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "2129d4c1e63a351d28d8d2937ff0b50237809c3df6725c0c5ef82b881dbb2086",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 75,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).url, Account.find(params[:id]).url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "Mass Assignment",
       "warning_code": 105,
@@ -104,7 +67,7 @@
       "check_name": "PermitAttributes",
       "message": "Potentially dangerous key allowed for mass assignment",
       "file": "app/controllers/admin/reports_controller.rb",
-      "line": 80,
+      "line": 56,
       "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
       "code": "params.permit(:account_id, :resolved, :target_account_id)",
       "render_path": null,
@@ -127,7 +90,7 @@
       "line": 4,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => Admin::ActionLog.page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::ActionLogsController","method":"index","line":7,"file":"app/controllers/admin/action_logs_controller.rb"}],
+      "render_path": [{"type":"controller","class":"Admin::ActionLogsController","method":"index","line":7,"file":"app/controllers/admin/action_logs_controller.rb","rendered":{"name":"admin/action_logs/index","file":"/home/eugr/Projects/mastodon/app/views/admin/action_logs/index.html.haml"}}],
       "location": {
         "type": "template",
         "template": "admin/action_logs/index"
@@ -143,7 +106,7 @@
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
       "file": "app/controllers/remote_interaction_controller.rb",
-      "line": 20,
+      "line": 21,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
       "code": "redirect_to(RemoteFollow.new(resource_params).interact_address_for(Status.find(params[:id])))",
       "render_path": null,
@@ -156,25 +119,6 @@
       "confidence": "High",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "64b5b2a02ede9c2b3598881eb5a466d63f7d27fe0946aa00d570111ec7338d2e",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 176,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).followers_url, Account.find(params[:id]).followers_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).followers_url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
@@ -185,7 +129,7 @@
       "line": 3,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :centered => true, :autoplay => ActiveModel::Type::Boolean.new.cast(params[:autoplay]) })",
-      "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":59,"file":"app/controllers/statuses_controller.rb"}],
+      "render_path": [{"type":"controller","class":"StatusesController","method":"embed","line":63,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/embed","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/embed.html.haml"}}],
       "location": {
         "type": "template",
         "template": "stream_entries/embed"
@@ -201,7 +145,7 @@
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 89,
+      "line": 92,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "result.joins(\"LEFT OUTER JOIN statuses_tags t#{id} ON t#{id}.status_id = statuses.id AND t#{id}.tag_id = #{id}\")",
       "render_path": null,
@@ -214,25 +158,6 @@
       "confidence": "Weak",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "82f7b0d09beb3ab68e0fa16be63cedf4e820f2490326e9a1cec05761d92446cd",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 149,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).salmon_url, Account.find(params[:id]).salmon_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).salmon_url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
@@ -243,7 +168,7 @@
       "line": 45,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => filtered_custom_emojis.eager_load(:local_counterpart).page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":11,"file":"app/controllers/admin/custom_emojis_controller.rb"}],
+      "render_path": [{"type":"controller","class":"Admin::CustomEmojisController","method":"index","line":11,"file":"app/controllers/admin/custom_emojis_controller.rb","rendered":{"name":"admin/custom_emojis/index","file":"/home/eugr/Projects/mastodon/app/views/admin/custom_emojis/index.html.haml"}}],
       "location": {
         "type": "template",
         "template": "admin/custom_emojis/index"
@@ -279,10 +204,10 @@
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/admin/accounts/index.html.haml",
-      "line": 67,
+      "line": 47,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(action => filtered_accounts.page(params[:page]), {})",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":12,"file":"app/controllers/admin/accounts_controller.rb"}],
+      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"index","line":12,"file":"app/controllers/admin/accounts_controller.rb","rendered":{"name":"admin/accounts/index","file":"/home/eugr/Projects/mastodon/app/views/admin/accounts/index.html.haml"}}],
       "location": {
         "type": "template",
         "template": "admin/accounts/index"
@@ -298,7 +223,7 @@
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
       "file": "app/controllers/media_controller.rb",
-      "line": 10,
+      "line": 14,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
       "code": "redirect_to(MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original))",
       "render_path": null,
@@ -311,25 +236,6 @@
       "confidence": "High",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "bb0ad5c4a42e06e3846c2089ff5269c17f65483a69414f6ce65eecf2bb11fab7",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 138,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).remote_url, Account.find(params[:id]).remote_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).remote_url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "Redirect",
       "warning_code": 18,
@@ -350,25 +256,6 @@
       "confidence": "High",
       "note": ""
     },
-    {
-      "warning_type": "Cross-Site Scripting",
-      "warning_code": 4,
-      "fingerprint": "e04aafe1e06cf8317fb6ac0a7f35783e45aa1274272ee6eaf28d39adfdad489b",
-      "check_name": "LinkToHref",
-      "message": "Potentially unsafe model attribute in link_to href",
-      "file": "app/views/admin/accounts/show.html.haml",
-      "line": 170,
-      "link": "https://brakemanscanner.org/docs/warning_types/link_to_href",
-      "code": "link_to(Account.find(params[:id]).outbox_url, Account.find(params[:id]).outbox_url)",
-      "render_path": [{"type":"controller","class":"Admin::AccountsController","method":"show","line":18,"file":"app/controllers/admin/accounts_controller.rb"}],
-      "location": {
-        "type": "template",
-        "template": "admin/accounts/show"
-      },
-      "user_input": "Account.find(params[:id]).outbox_url",
-      "confidence": "Weak",
-      "note": ""
-    },
     {
       "warning_type": "Mass Assignment",
       "warning_code": 105,
@@ -376,7 +263,7 @@
       "check_name": "PermitAttributes",
       "message": "Potentially dangerous key allowed for mass assignment",
       "file": "app/controllers/api/v1/reports_controller.rb",
-      "line": 37,
+      "line": 36,
       "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
       "code": "params.permit(:account_id, :comment, :forward, :status_ids => ([]))",
       "render_path": null,
@@ -399,7 +286,7 @@
       "line": 23,
       "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
       "code": "render(partial => \"stream_entries/#{Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase}\", { :locals => ({ Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity_type.downcase.to_sym => Account.find_local!(params[:account_username]).statuses.find(params[:id]).stream_entry.activity, :include_threads => true }) })",
-      "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":30,"file":"app/controllers/statuses_controller.rb"}],
+      "render_path": [{"type":"controller","class":"StatusesController","method":"show","line":34,"file":"app/controllers/statuses_controller.rb","rendered":{"name":"stream_entries/show","file":"/home/eugr/Projects/mastodon/app/views/stream_entries/show.html.haml"}}],
       "location": {
         "type": "template",
         "template": "stream_entries/show"
@@ -409,6 +296,6 @@
       "note": ""
     }
   ],
-  "updated": "2018-10-20 23:24:45 +1300",
-  "brakeman_version": "4.2.1"
+  "updated": "2019-02-21 02:30:29 +0100",
+  "brakeman_version": "4.4.0"
 }
diff --git a/spec/services/account_search_service_spec.rb b/spec/services/account_search_service_spec.rb
index c6cbdcce10..7b071b378e 100644
--- a/spec/services/account_search_service_spec.rb
+++ b/spec/services/account_search_service_spec.rb
@@ -4,18 +4,18 @@ describe AccountSearchService, type: :service do
   describe '.call' do
     describe 'with a query to ignore' do
       it 'returns empty array for missing query' do
-        results = subject.call('', 10)
+        results = subject.call('', nil, limit: 10)
 
         expect(results).to eq []
       end
       it 'returns empty array for hashtag query' do
-        results = subject.call('#tag', 10)
+        results = subject.call('#tag', nil, limit: 10)
 
         expect(results).to eq []
       end
       it 'returns empty array for limit zero' do
         Fabricate(:account, username: 'match')
-        results = subject.call('match', 0)
+        results = subject.call('match', nil, limit: 0)
 
         expect(results).to eq []
       end
@@ -25,7 +25,7 @@ describe AccountSearchService, type: :service do
       it 'does not return a nil entry in the array for the exact match' do
         match = Fabricate(:account, username: 'matchingusername')
 
-        results = subject.call('match', 5)
+        results = subject.call('match', nil, limit: 5)
         expect(results).to eq [match]
       end
     end
@@ -35,7 +35,7 @@ describe AccountSearchService, type: :service do
         before do
           allow(Account).to receive(:find_local)
           allow(Account).to receive(:search_for)
-          subject.call('@', 10)
+          subject.call('@', nil, limit: 10)
         end
 
         it 'uses find_local with empty query to look for local accounts' do
@@ -47,7 +47,7 @@ describe AccountSearchService, type: :service do
         before do
           allow(Account).to receive(:find_local)
           allow(Account).to receive(:search_for)
-          subject.call('one', 10)
+          subject.call('one', nil, limit: 10)
         end
 
         it 'uses find_local to look for local accounts' do
@@ -55,7 +55,7 @@ describe AccountSearchService, type: :service do
         end
 
         it 'uses search_for to find matches' do
-          expect(Account).to have_received(:search_for).with('one', 10)
+          expect(Account).to have_received(:search_for).with('one', 10, 0)
         end
       end
 
@@ -65,16 +65,16 @@ describe AccountSearchService, type: :service do
         end
 
         it 'uses find_remote to look for remote accounts' do
-          subject.call('two@example.com', 10)
+          subject.call('two@example.com', nil, limit: 10)
           expect(Account).to have_received(:find_remote).with('two', 'example.com')
         end
 
         describe 'and there is no account provided' do
           it 'uses search_for to find matches' do
             allow(Account).to receive(:search_for)
-            subject.call('two@example.com', 10, nil, resolve: false)
+            subject.call('two@example.com', nil, limit: 10, resolve: false)
 
-            expect(Account).to have_received(:search_for).with('two example.com', 10)
+            expect(Account).to have_received(:search_for).with('two example.com', 10, 0)
           end
         end
 
@@ -82,9 +82,9 @@ describe AccountSearchService, type: :service do
           it 'uses advanced_search_for to find matches' do
             account = Fabricate(:account)
             allow(Account).to receive(:advanced_search_for)
-            subject.call('two@example.com', 10, account, resolve: false)
+            subject.call('two@example.com', account, limit: 10, resolve: false)
 
-            expect(Account).to have_received(:advanced_search_for).with('two example.com', account, 10, nil)
+            expect(Account).to have_received(:advanced_search_for).with('two example.com', account, 10, nil, 0)
           end
         end
       end
@@ -95,7 +95,7 @@ describe AccountSearchService, type: :service do
         partial = Fabricate(:account, username: 'exactness')
         exact = Fabricate(:account, username: 'exact')
 
-        results = subject.call('exact', 10)
+        results = subject.call('exact', nil, limit: 10)
         expect(results.size).to eq 2
         expect(results).to eq [exact, partial]
       end
@@ -114,7 +114,7 @@ describe AccountSearchService, type: :service do
         exact = Fabricate(:account, username: 'e')
         Rails.configuration.x.local_domain = 'example.com'
 
-        results = subject.call('e@example.com', 2)
+        results = subject.call('e@example.com', nil, limit: 2)
         expect(results.size).to eq 2
         expect(results).to eq([exact, remote]).or eq([exact, remote_too])
       end
@@ -125,7 +125,7 @@ describe AccountSearchService, type: :service do
         service = double(call: nil)
         allow(ResolveAccountService).to receive(:new).and_return(service)
 
-        results = subject.call('newuser@remote.com', 10, nil, resolve: true)
+        results = subject.call('newuser@remote.com', nil, limit: 10, resolve: true)
         expect(service).to have_received(:call).with('newuser@remote.com')
       end
 
@@ -133,7 +133,7 @@ describe AccountSearchService, type: :service do
         service = double(call: nil)
         allow(ResolveAccountService).to receive(:new).and_return(service)
 
-        results = subject.call('newuser@remote.com', 10, nil, resolve: false)
+        results = subject.call('newuser@remote.com', nil, limit: 10, resolve: false)
         expect(service).not_to have_received(:call)
       end
     end
@@ -143,7 +143,7 @@ describe AccountSearchService, type: :service do
         partial = Fabricate(:account, username: 'exactness')
         exact = Fabricate(:account, username: 'exact', suspended: true)
 
-        results = subject.call('exact', 10)
+        results = subject.call('exact', nil, limit: 10)
         expect(results.size).to eq 1
         expect(results).to eq [partial]
       end
@@ -151,7 +151,7 @@ describe AccountSearchService, type: :service do
       it "does not return suspended remote accounts" do
         remote = Fabricate(:account, username: 'a', domain: 'remote', display_name: 'e', suspended: true)
 
-        results = subject.call('a@example.com', 2)
+        results = subject.call('a@example.com', nil, limit: 2)
         expect(results.size).to eq 0
         expect(results).to eq []
       end
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
index 671080f1d9..d064cd9b85 100644
--- a/spec/services/search_service_spec.rb
+++ b/spec/services/search_service_spec.rb
@@ -10,7 +10,7 @@ describe SearchService, type: :service do
       it 'returns empty results without searching' do
         allow(AccountSearchService).to receive(:new)
         allow(Tag).to receive(:search_for)
-        results = subject.call('', 10)
+        results = subject.call('', nil, 10)
 
         expect(results).to eq(empty_results)
         expect(AccountSearchService).not_to have_received(:new)
@@ -27,7 +27,7 @@ describe SearchService, type: :service do
         it 'returns the empty results' do
           service = double(call: nil)
           allow(ResolveURLService).to receive(:new).and_return(service)
-          results = subject.call(@query, 10)
+          results = subject.call(@query, nil, 10)
 
           expect(service).to have_received(:call).with(@query, on_behalf_of: nil)
           expect(results).to eq empty_results
@@ -40,7 +40,7 @@ describe SearchService, type: :service do
           service = double(call: account)
           allow(ResolveURLService).to receive(:new).and_return(service)
 
-          results = subject.call(@query, 10)
+          results = subject.call(@query, nil, 10)
           expect(service).to have_received(:call).with(@query, on_behalf_of: nil)
           expect(results).to eq empty_results.merge(accounts: [account])
         end
@@ -52,7 +52,7 @@ describe SearchService, type: :service do
           service = double(call: status)
           allow(ResolveURLService).to receive(:new).and_return(service)
 
-          results = subject.call(@query, 10)
+          results = subject.call(@query, nil, 10)
           expect(service).to have_received(:call).with(@query, on_behalf_of: nil)
           expect(results).to eq empty_results.merge(statuses: [status])
         end
@@ -67,8 +67,8 @@ describe SearchService, type: :service do
           service = double(call: [account])
           allow(AccountSearchService).to receive(:new).and_return(service)
 
-          results = subject.call(query, 10)
-          expect(service).to have_received(:call).with(query, 10, nil, resolve: false)
+          results = subject.call(query, nil, 10)
+          expect(service).to have_received(:call).with(query, nil, limit: 10, offset: 0, resolve: false)
           expect(results).to eq empty_results.merge(accounts: [account])
         end
       end
@@ -77,17 +77,17 @@ describe SearchService, type: :service do
         it 'includes the tag in the results' do
           query = '#tag'
           tag = Tag.new
-          allow(Tag).to receive(:search_for).with('tag', 10).and_return([tag])
+          allow(Tag).to receive(:search_for).with('tag', 10, 0).and_return([tag])
 
-          results = subject.call(query, 10)
-          expect(Tag).to have_received(:search_for).with('tag', 10)
+          results = subject.call(query, nil, 10)
+          expect(Tag).to have_received(:search_for).with('tag', 10, 0)
           expect(results).to eq empty_results.merge(hashtags: [tag])
         end
         it 'does not include tag when starts with @ character' do
           query = '@username'
           allow(Tag).to receive(:search_for)
 
-          results = subject.call(query, 10)
+          results = subject.call(query, nil, 10)
           expect(Tag).not_to have_received(:search_for)
           expect(results).to eq empty_results
         end
-- 
GitLab


From a5e7ada62fa2824be158f0b3bed7f3c39ce9c0fa Mon Sep 17 00:00:00 2001
From: abcang <abcang1015@gmail.com>
Date: Tue, 26 Feb 2019 23:23:24 +0900
Subject: [PATCH 135/192] Improve account media query (#10121)

---
 app/controllers/api/v1/accounts/statuses_controller.rb | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/controllers/api/v1/accounts/statuses_controller.rb b/app/controllers/api/v1/accounts/statuses_controller.rb
index 6fdc827cb2..ed10f3f6a7 100644
--- a/app/controllers/api/v1/accounts/statuses_controller.rb
+++ b/app/controllers/api/v1/accounts/statuses_controller.rb
@@ -51,9 +51,9 @@ class Api::V1::Accounts::StatusesController < Api::BaseController
     # Also, Avoid getting slow by not narrowing down by `statuses.account_id`.
     # When narrowing down by `statuses.account_id`, `index_statuses_20180106` will be used
     # and the table will be joined by `Merge Semi Join`, so the query will be slow.
-    Status.joins(:media_attachments).merge(@account.media_attachments).permitted_for(@account, current_account)
-          .paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
-          .reorder(id: :desc).distinct(:id).pluck(:id)
+    @account.statuses.joins(:media_attachments).merge(@account.media_attachments).permitted_for(@account, current_account)
+            .paginate_by_max_id(limit_param(DEFAULT_STATUSES_LIMIT), params[:max_id], params[:since_id])
+            .reorder(id: :desc).distinct(:id).pluck(:id)
   end
 
   def pinned_scope
-- 
GitLab


From 7209a8b32f334726c0b0a78724152740ba0031be Mon Sep 17 00:00:00 2001
From: abcang <abcang1015@gmail.com>
Date: Wed, 2 May 2018 23:14:51 +0900
Subject: [PATCH 136/192] Keep notification when muting_notifications is true
 (#7311)

* Keep notification when muting_notifications is true

* Retrun mute object

* Fix test
---
 app/javascript/flavours/glitch/reducers/notifications.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index 6667966c02..c44674a80d 100644
--- a/app/javascript/flavours/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -208,7 +208,7 @@ export default function notifications(state = initialState, action) {
     return expandNormalizedNotifications(state, action.notifications, action.next);
   case ACCOUNT_BLOCK_SUCCESS:
   case ACCOUNT_MUTE_SUCCESS:
-    return filterNotifications(state, action.relationship);
+    return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state;
   case NOTIFICATIONS_CLEAR:
     return state.set('items', ImmutableList()).set('hasMore', false);
   case TIMELINE_DELETE:
-- 
GitLab


From 1e06ca1c0af98cf61b1114b93249fb447e795edb Mon Sep 17 00:00:00 2001
From: Eugen Rochko <eugen@zeonfederated.com>
Date: Mon, 25 Feb 2019 01:10:56 +0100
Subject: [PATCH 137/192] Fix web UI not removing notifications after block
 (#10108)

Regression from #7311
---
 app/javascript/flavours/glitch/reducers/notifications.js | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/javascript/flavours/glitch/reducers/notifications.js b/app/javascript/flavours/glitch/reducers/notifications.js
index c44674a80d..04ae3d406e 100644
--- a/app/javascript/flavours/glitch/reducers/notifications.js
+++ b/app/javascript/flavours/glitch/reducers/notifications.js
@@ -207,6 +207,7 @@ export default function notifications(state = initialState, action) {
   case NOTIFICATIONS_EXPAND_SUCCESS:
     return expandNormalizedNotifications(state, action.notifications, action.next);
   case ACCOUNT_BLOCK_SUCCESS:
+    return filterNotifications(state, action.relationship);
   case ACCOUNT_MUTE_SUCCESS:
     return action.relationship.muting_notifications ? filterNotifications(state, action.relationship) : state;
   case NOTIFICATIONS_CLEAR:
-- 
GitLab


From 9edab463682f5d5beb0a7f4e4574d708c95bbc52 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 27 Feb 2019 14:57:14 +0100
Subject: [PATCH 138/192] Fix mention processing for unknwon accounts on
 incoming ActivityPub Notes (#10125)

`::FetchRemoteAccountService` is not `ActivityPub::FetchRemoteAccountService`,
its second argument is the pre-fetched body. Passing `id: false` actually passed
a `Hash` as the prefetched body, instead of properly resolving unknown remote
accounts.
---
 app/lib/activitypub/activity/create.rb | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index d7bd65c806..6d58aba709 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -159,7 +159,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     return if tag['href'].blank?
 
     account = account_from_uri(tag['href'])
-    account = ::FetchRemoteAccountService.new.call(tag['href'], id: false) if account.nil?
+    account = ::FetchRemoteAccountService.new.call(tag['href']) if account.nil?
 
     return if account.nil?
 
-- 
GitLab


From 74258ef77a24211a1fe59f6a9cb9244a4ad3caa3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 27 Feb 2019 14:58:08 +0100
Subject: [PATCH 139/192] Bump hamlit-rails from 0.2.1 to 0.2.2 (#10124)

Bumps [hamlit-rails](https://github.com/mfung/hamlit-rails) from 0.2.1 to 0.2.2.
- [Release notes](https://github.com/mfung/hamlit-rails/releases)
- [Commits](https://github.com/mfung/hamlit-rails/compare/v0.2.1...v0.2.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile.lock | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Gemfile.lock b/Gemfile.lock
index a92fadb8a8..d23f894407 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -243,7 +243,7 @@ GEM
       temple (>= 0.8.0)
       thor
       tilt
-    hamlit-rails (0.2.1)
+    hamlit-rails (0.2.2)
       actionpack (>= 4.0.1)
       activesupport (>= 4.0.1)
       hamlit (>= 1.2.0)
-- 
GitLab


From 34315fcda53a3ce29a50a253bd63f7e70ef8e4b3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <dependabot[bot]@users.noreply.github.com>
Date: Wed, 27 Feb 2019 15:02:57 +0100
Subject: [PATCH 140/192] Bump capybara from 3.13.2 to 3.14.0 (#10119)

Bumps [capybara](https://github.com/teamcapybara/capybara) from 3.13.2 to 3.14.0.
- [Release notes](https://github.com/teamcapybara/capybara/releases)
- [Changelog](https://github.com/teamcapybara/capybara/blob/master/History.md)
- [Commits](https://github.com/teamcapybara/capybara/compare/3.13.2...3.14.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
---
 Gemfile      | 2 +-
 Gemfile.lock | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/Gemfile b/Gemfile
index e6d7bd4d01..46d77f6626 100644
--- a/Gemfile
+++ b/Gemfile
@@ -107,7 +107,7 @@ group :production, :test do
 end
 
 group :test do
-  gem 'capybara', '~> 3.13'
+  gem 'capybara', '~> 3.14'
   gem 'climate_control', '~> 0.2'
   gem 'faker', '~> 1.9'
   gem 'microformats', '~> 4.1'
diff --git a/Gemfile.lock b/Gemfile.lock
index d23f894407..447444740a 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -126,7 +126,7 @@ GEM
       sshkit (~> 1.3)
     capistrano-yarn (2.0.2)
       capistrano (~> 3.0)
-    capybara (3.13.2)
+    capybara (3.14.0)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
@@ -671,7 +671,7 @@ DEPENDENCIES
   capistrano-rails (~> 1.4)
   capistrano-rbenv (~> 2.1)
   capistrano-yarn (~> 2.0)
-  capybara (~> 3.13)
+  capybara (~> 3.14)
   charlock_holmes (~> 0.7.6)
   chewy (~> 5.0)
   cld3 (~> 3.2.3)
-- 
GitLab


From df0120670398246739144466bf327193383ba530 Mon Sep 17 00:00:00 2001
From: trwnh <a@trwnh.com>
Date: Wed, 27 Feb 2019 08:03:28 -0600
Subject: [PATCH 141/192] Allow getting-started to scroll on short screens
 (#10075)

At 480px height, there is not enough space to fully display the footer.
---
 app/javascript/styles/mastodon/components.scss | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index d88557559e..0163e90b93 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -2336,6 +2336,7 @@ a.account__display-name {
 
 .getting-started {
   color: $dark-text-color;
+  overflow: auto;
 
   &__footer {
     flex: 0 0 auto;
-- 
GitLab


From 76ed481aa7b67d624675cdaa85bac583853fd24d Mon Sep 17 00:00:00 2001
From: Thibaut Girka <thib@sitedethib.com>
Date: Tue, 19 Feb 2019 11:35:13 +0100
Subject: [PATCH 142/192] Port public page mastodon-light fixes from upstream

---
 .../glitch/styles/mastodon-light/diff.scss    | 55 +++++++++++++++++++
 1 file changed, 55 insertions(+)

diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
index 339ee7cf08..6f105d3fad 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/diff.scss
@@ -317,3 +317,58 @@
   }
 }
 
+.button.logo-button {
+  color: $white;
+
+  svg path:first-child {
+    fill: $white;
+  }
+}
+
+.public-layout {
+  .header,
+  .public-account-header,
+  .public-account-bio {
+    box-shadow: none;
+  }
+
+  .header {
+    background: lighten($ui-base-color, 12%);
+  }
+
+  .public-account-header {
+    &__image {
+      background: lighten($ui-base-color, 12%);
+
+      &::after {
+        box-shadow: none;
+      }
+    }
+
+    &__tabs {
+      &__name {
+        h1,
+        h1 small {
+          color: $white;
+        }
+      }
+    }
+  }
+}
+
+.account__section-headline a.active::after {
+  border-color: transparent transparent $white;
+}
+
+.hero-widget,
+.box-widget,
+.contact-widget,
+.landing-page__information.contact-widget,
+.moved-account-widget,
+.memoriam-widget,
+.activity-stream,
+.nothing-here,
+.directory__tag > a,
+.directory__tag > div {
+  box-shadow: none;
+}
-- 
GitLab


From 6e8743d17a92438bd2332e97f824bc212fa4b96e Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Wed, 27 Feb 2019 19:13:16 +0100
Subject: [PATCH 143/192] Fix direct timeline pagination in the WebUI (#10126)

The `hasMore` property of timelines in redux store was set whenever an API
request returned only one page of results, *even* if the query only requested
newer conversations (using `since_id`), causing `hasMore` to be incorrectly set to
false whenever fetching new toots in the direct timeline, which happens each time
the direct message column is opened.

(Basically #9516 for direct messages)
---
 app/javascript/mastodon/actions/conversations.js  | 7 +++++--
 app/javascript/mastodon/reducers/conversations.js | 6 +++---
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js
index 3c2ea96806..c6e062ef73 100644
--- a/app/javascript/mastodon/actions/conversations.js
+++ b/app/javascript/mastodon/actions/conversations.js
@@ -41,13 +41,15 @@ export const expandConversations = ({ maxId } = {}) => (dispatch, getState) => {
     params.since_id = getState().getIn(['conversations', 'items', 0, 'last_status']);
   }
 
+  const isLoadingRecent = !!params.since_id;
+
   api(getState).get('/api/v1/conversations', { params })
     .then(response => {
       const next = getLinks(response).refs.find(link => link.rel === 'next');
 
       dispatch(importFetchedAccounts(response.data.reduce((aggr, item) => aggr.concat(item.accounts), [])));
       dispatch(importFetchedStatuses(response.data.map(item => item.last_status).filter(x => !!x)));
-      dispatch(expandConversationsSuccess(response.data, next ? next.uri : null));
+      dispatch(expandConversationsSuccess(response.data, next ? next.uri : null, isLoadingRecent));
     })
     .catch(err => dispatch(expandConversationsFail(err)));
 };
@@ -56,10 +58,11 @@ export const expandConversationsRequest = () => ({
   type: CONVERSATIONS_FETCH_REQUEST,
 });
 
-export const expandConversationsSuccess = (conversations, next) => ({
+export const expandConversationsSuccess = (conversations, next, isLoadingRecent) => ({
   type: CONVERSATIONS_FETCH_SUCCESS,
   conversations,
   next,
+  isLoadingRecent,
 });
 
 export const expandConversationsFail = error => ({
diff --git a/app/javascript/mastodon/reducers/conversations.js b/app/javascript/mastodon/reducers/conversations.js
index 955a07754d..9564bffcd2 100644
--- a/app/javascript/mastodon/reducers/conversations.js
+++ b/app/javascript/mastodon/reducers/conversations.js
@@ -35,7 +35,7 @@ const updateConversation = (state, item) => state.update('items', list => {
   }
 });
 
-const expandNormalizedConversations = (state, conversations, next) => {
+const expandNormalizedConversations = (state, conversations, next, isLoadingRecent) => {
   let items = ImmutableList(conversations.map(conversationToMap));
 
   return state.withMutations(mutable => {
@@ -66,7 +66,7 @@ const expandNormalizedConversations = (state, conversations, next) => {
       });
     }
 
-    if (!next) {
+    if (!next && !isLoadingRecent) {
       mutable.set('hasMore', false);
     }
 
@@ -81,7 +81,7 @@ export default function conversations(state = initialState, action) {
   case CONVERSATIONS_FETCH_FAIL:
     return state.set('isLoading', false);
   case CONVERSATIONS_FETCH_SUCCESS:
-    return expandNormalizedConversations(state, action.conversations, action.next);
+    return expandNormalizedConversations(state, action.conversations, action.next, action.isLoadingRecent);
   case CONVERSATIONS_UPDATE:
     return updateConversation(state, action.conversation);
   case CONVERSATIONS_MOUNT:
-- 
GitLab


From 9d3c6f1849120e732a9230959cb302575765ea8c Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Thu, 28 Feb 2019 15:22:21 +0100
Subject: [PATCH 144/192] Improved remote thread fetching (#10106)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Fetch up to 5 replies when discovering a new remote status

This is used for resolving threads downwards. The originating
server must add a “replies” attributes with such replies for it to
be useful.

* Add some tests for ActivityPub::FetchRepliesWorker

* Add specs for ActivityPub::FetchRepliesService

* Serialize up to 5 public self-replies for ActivityPub notes

* Add specs for ActivityPub::NoteSerializer

* Move exponential backoff logic to a worker concern

* Fetch first page of paginated collections when fetching thread replies

* Add specs for paginated collections in replies

* Move Note replies serialization to a first CollectionPage

The collection isn't actually paginable yet as it has no id nor
a `next` field. This may come in another PR.

* Use pluck(:uri) instead of map(&:uri) to improve performances

* Fix fetching replies when they are in a CollectionPage
---
 app/lib/activitypub/activity/create.rb        |  10 ++
 .../concerns/status_threading_concern.rb      |   4 +
 .../activitypub/collection_presenter.rb       |   2 +-
 .../activitypub/collection_serializer.rb      |   5 +-
 .../activitypub/note_serializer.rb            |  13 ++
 .../activitypub/fetch_replies_service.rb      |  60 +++++++++
 .../activitypub/fetch_replies_worker.rb       |  12 ++
 app/workers/concerns/exponential_backoff.rb   |  11 ++
 app/workers/fetch_reply_worker.rb             |  12 ++
 app/workers/thread_resolve_worker.rb          |   5 +-
 spec/serializers/activitypub/note_spec.rb     |  44 +++++++
 .../activitypub/fetch_replies_service_spec.rb | 122 ++++++++++++++++++
 .../activitypub/fetch_replies_worker_spec.rb  |  40 ++++++
 13 files changed, 333 insertions(+), 7 deletions(-)
 create mode 100644 app/services/activitypub/fetch_replies_service.rb
 create mode 100644 app/workers/activitypub/fetch_replies_worker.rb
 create mode 100644 app/workers/concerns/exponential_backoff.rb
 create mode 100644 app/workers/fetch_reply_worker.rb
 create mode 100644 spec/serializers/activitypub/note_spec.rb
 create mode 100644 spec/services/activitypub/fetch_replies_service_spec.rb
 create mode 100644 spec/workers/activitypub/fetch_replies_worker_spec.rb

diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 6d58aba709..0980f94bac 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -40,6 +40,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     end
 
     resolve_thread(@status)
+    fetch_replies(@status)
     distribute(@status)
     forward_for_reply if @status.public_visibility? || @status.unlisted_visibility?
   end
@@ -213,6 +214,15 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     ThreadResolveWorker.perform_async(status.id, in_reply_to_uri)
   end
 
+  def fetch_replies(status)
+    collection = @object['replies']
+    return if collection.nil?
+    replies = ActivityPub::FetchRepliesService.new.call(status, collection, false)
+    return if replies.present?
+    uri = value_or_id(collection)
+    ActivityPub::FetchRepliesWorker.perform_async(status.id, uri) unless uri.nil?
+  end
+
   def conversation_from_uri(uri)
     return nil if uri.nil?
     return Conversation.find_by(id: OStatus::TagManager.instance.unique_tag_to_local_id(uri, 'Conversation')) if OStatus::TagManager.instance.local_id?(uri)
diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb
index b9c800c2aa..15eb695cd0 100644
--- a/app/models/concerns/status_threading_concern.rb
+++ b/app/models/concerns/status_threading_concern.rb
@@ -11,6 +11,10 @@ module StatusThreadingConcern
     find_statuses_from_tree_path(descendant_ids(limit, max_child_id, since_child_id, depth), account, promote: true)
   end
 
+  def self_replies(limit)
+    account.statuses.where(in_reply_to_id: id, visibility: [:public, :unlisted]).reorder(id: :asc).limit(limit)
+  end
+
   private
 
   def ancestor_ids(limit)
diff --git a/app/presenters/activitypub/collection_presenter.rb b/app/presenters/activitypub/collection_presenter.rb
index ec84ab1a3d..28331f0c41 100644
--- a/app/presenters/activitypub/collection_presenter.rb
+++ b/app/presenters/activitypub/collection_presenter.rb
@@ -1,5 +1,5 @@
 # frozen_string_literal: true
 
 class ActivityPub::CollectionPresenter < ActiveModelSerializers::Model
-  attributes :id, :type, :size, :items, :part_of, :first, :last, :next, :prev
+  attributes :id, :type, :size, :items, :page, :part_of, :first, :last, :next, :prev
 end
diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb
index e8960131bb..b03609957d 100644
--- a/app/serializers/activitypub/collection_serializer.rb
+++ b/app/serializers/activitypub/collection_serializer.rb
@@ -7,7 +7,8 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer
     super
   end
 
-  attributes :id, :type
+  attribute :id, if: -> { object.id.present? }
+  attribute :type
   attribute :total_items, if: -> { object.size.present? }
   attribute :next, if: -> { object.next.present? }
   attribute :prev, if: -> { object.prev.present? }
@@ -37,6 +38,6 @@ class ActivityPub::CollectionSerializer < ActiveModel::Serializer
   end
 
   def page?
-    object.part_of.present?
+    object.part_of.present? || object.page.present?
   end
 end
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index c9d23e25fa..6b0978ad3c 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -13,6 +13,8 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   has_many :media_attachments, key: :attachment
   has_many :virtual_tags, key: :tag
 
+  has_one :replies, serializer: ActivityPub::CollectionSerializer
+
   def id
     ActivityPub::TagManager.instance.uri_for(object)
   end
@@ -33,6 +35,17 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
     { object.language => Formatter.instance.format(object) }
   end
 
+  def replies
+    ActivityPub::CollectionPresenter.new(
+      type: :unordered,
+      first: ActivityPub::CollectionPresenter.new(
+        type: :unordered,
+        page: true,
+        items: object.self_replies(5).pluck(:uri)
+      )
+    )
+  end
+
   def language?
     object.language.present?
   end
diff --git a/app/services/activitypub/fetch_replies_service.rb b/app/services/activitypub/fetch_replies_service.rb
new file mode 100644
index 0000000000..95c486a431
--- /dev/null
+++ b/app/services/activitypub/fetch_replies_service.rb
@@ -0,0 +1,60 @@
+# frozen_string_literal: true
+
+class ActivityPub::FetchRepliesService < BaseService
+  include JsonLdHelper
+
+  def call(parent_status, collection_or_uri, allow_synchronous_requests = true)
+    @account = parent_status.account
+    @allow_synchronous_requests = allow_synchronous_requests
+
+    @items = collection_items(collection_or_uri)
+    return if @items.nil?
+
+    FetchReplyWorker.push_bulk(filtered_replies)
+
+    @items
+  end
+
+  private
+
+  def collection_items(collection_or_uri)
+    collection = fetch_collection(collection_or_uri)
+    return unless collection.is_a?(Hash)
+
+    collection = fetch_collection(collection['first']) if collection['first'].present?
+    return unless collection.is_a?(Hash)
+
+    case collection['type']
+    when 'Collection', 'CollectionPage'
+      collection['items']
+    when 'OrderedCollection', 'OrderedCollectionPage'
+      collection['orderedItems']
+    end
+  end
+
+  def fetch_collection(collection_or_uri)
+    return collection_or_uri if collection_or_uri.is_a?(Hash)
+    return unless @allow_synchronous_requests
+    return if invalid_origin?(collection_or_uri)
+    collection = fetch_resource_without_id_validation(collection_or_uri)
+    raise Mastodon::UnexpectedResponseError if collection.nil?
+    collection
+  end
+
+  def filtered_replies
+    # Only fetch replies to the same server as the original status to avoid
+    # amplification attacks.
+
+    # Also limit to 5 fetched replies to limit potential for DoS.
+    @items.map { |item| value_or_id(item) }.reject { |uri| invalid_origin?(uri) }.take(5)
+  end
+
+  def invalid_origin?(url)
+    return true if unsupported_uri_scheme?(url)
+
+    needle   = Addressable::URI.parse(url).host
+    haystack = Addressable::URI.parse(@account.uri).host
+
+    !haystack.casecmp(needle).zero?
+  end
+end
diff --git a/app/workers/activitypub/fetch_replies_worker.rb b/app/workers/activitypub/fetch_replies_worker.rb
new file mode 100644
index 0000000000..bf466db542
--- /dev/null
+++ b/app/workers/activitypub/fetch_replies_worker.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class ActivityPub::FetchRepliesWorker
+  include Sidekiq::Worker
+  include ExponentialBackoff
+
+  sidekiq_options queue: 'pull', retry: 3
+
+  def perform(parent_status_id, replies_uri)
+    ActivityPub::FetchRepliesService.new.call(Status.find(parent_status_id), replies_uri)
+  end
+end
diff --git a/app/workers/concerns/exponential_backoff.rb b/app/workers/concerns/exponential_backoff.rb
new file mode 100644
index 0000000000..f2b931e331
--- /dev/null
+++ b/app/workers/concerns/exponential_backoff.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module ExponentialBackoff
+  extend ActiveSupport::Concern
+
+  included do
+    sidekiq_retry_in do |count|
+      15 + 10 * (count**4) + rand(10 * (count**4))
+    end
+  end
+end
diff --git a/app/workers/fetch_reply_worker.rb b/app/workers/fetch_reply_worker.rb
new file mode 100644
index 0000000000..f7aa25e815
--- /dev/null
+++ b/app/workers/fetch_reply_worker.rb
@@ -0,0 +1,12 @@
+# frozen_string_literal: true
+
+class FetchReplyWorker
+  include Sidekiq::Worker
+  include ExponentialBackoff
+
+  sidekiq_options queue: 'pull', retry: 3
+
+  def perform(child_url)
+    FetchRemoteStatusService.new.call(child_url)
+  end
+end
diff --git a/app/workers/thread_resolve_worker.rb b/app/workers/thread_resolve_worker.rb
index c18a778d55..8bba9ca75e 100644
--- a/app/workers/thread_resolve_worker.rb
+++ b/app/workers/thread_resolve_worker.rb
@@ -2,13 +2,10 @@
 
 class ThreadResolveWorker
   include Sidekiq::Worker
+  include ExponentialBackoff
 
   sidekiq_options queue: 'pull', retry: 3
 
-  sidekiq_retry_in do |count|
-    15 + 10 * (count**4) + rand(10 * (count**4))
-  end
-
   def perform(child_status_id, parent_url)
     child_status  = Status.find(child_status_id)
     parent_status = FetchRemoteStatusService.new.call(parent_url)
diff --git a/spec/serializers/activitypub/note_spec.rb b/spec/serializers/activitypub/note_spec.rb
new file mode 100644
index 0000000000..55bfbc16bf
--- /dev/null
+++ b/spec/serializers/activitypub/note_spec.rb
@@ -0,0 +1,44 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ActivityPub::NoteSerializer do
+  let!(:account) { Fabricate(:account) }
+  let!(:other)   { Fabricate(:account) }
+  let!(:parent)  { Fabricate(:status, account: account, visibility: :public) }
+  let!(:reply1)  { Fabricate(:status, account: account, thread: parent, visibility: :public) }
+  let!(:reply2)  { Fabricate(:status, account: account, thread: parent, visibility: :public) }
+  let!(:reply3)  { Fabricate(:status, account: other, thread: parent, visibility: :public) }
+  let!(:reply4)  { Fabricate(:status, account: account, thread: parent, visibility: :public) }
+  let!(:reply5)  { Fabricate(:status, account: account, thread: parent, visibility: :direct) }
+
+  before(:each) do
+    @serialization = ActiveModelSerializers::SerializableResource.new(parent, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter)
+  end
+
+  subject { JSON.parse(@serialization.to_json) }
+
+  it 'has a Note type' do
+    expect(subject['type']).to eql('Note')
+  end
+
+  it 'has a replies collection' do
+    expect(subject['replies']['type']).to eql('Collection')
+  end
+
+  it 'has a replies collection with a first Page' do
+    expect(subject['replies']['first']['type']).to eql('CollectionPage')
+  end
+
+  it 'includes public self-replies in its replies collection' do
+    expect(subject['replies']['first']['items']).to include(reply1.uri, reply2.uri, reply4.uri)
+  end
+
+  it 'does not include replies from others in its replies collection' do
+    expect(subject['replies']['first']['items']).to_not include(reply3.uri)
+  end
+
+  it 'does not include replies with direct visibility in its replies collection' do
+    expect(subject['replies']['first']['items']).to_not include(reply5.uri)
+  end
+end
diff --git a/spec/services/activitypub/fetch_replies_service_spec.rb b/spec/services/activitypub/fetch_replies_service_spec.rb
new file mode 100644
index 0000000000..65c4533411
--- /dev/null
+++ b/spec/services/activitypub/fetch_replies_service_spec.rb
@@ -0,0 +1,122 @@
+require 'rails_helper'
+
+RSpec.describe ActivityPub::FetchRepliesService, type: :service do
+  let(:actor)          { Fabricate(:account, domain: 'example.com', uri: 'http://example.com/account') }
+  let(:status)         { Fabricate(:status, account: actor) }
+  let(:collection_uri) { 'http://example.com/replies/1' }
+
+  let(:items) do
+    [
+      'http://example.com/self-reply-1',
+      'http://example.com/self-reply-2',
+      'http://example.com/self-reply-3',
+      'http://other.com/other-reply-1',
+      'http://other.com/other-reply-2',
+      'http://other.com/other-reply-3',
+      'http://example.com/self-reply-4',
+      'http://example.com/self-reply-5',
+      'http://example.com/self-reply-6',
+    ]
+  end
+
+  let(:payload) do
+    {
+      '@context': 'https://www.w3.org/ns/activitystreams',
+      type: 'Collection',
+      id: collection_uri,
+      items: items,
+    }.with_indifferent_access
+  end
+
+  subject { described_class.new }
+
+  describe '#call' do
+    context 'when the payload is a Collection with inlined replies' do
+      context 'when passing the collection itself' do
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, payload)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+
+      context 'when passing the URL to the collection' do
+        before do
+          stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload))
+        end
+
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, collection_uri)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+    end
+
+    context 'when the payload is an OrderedCollection with inlined replies' do
+      let(:payload) do
+        {
+          '@context': 'https://www.w3.org/ns/activitystreams',
+          type: 'OrderedCollection',
+          id: collection_uri,
+          orderedItems: items,
+        }.with_indifferent_access
+      end
+
+      context 'when passing the collection itself' do
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, payload)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+
+      context 'when passing the URL to the collection' do
+        before do
+          stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload))
+        end
+
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, collection_uri)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+    end
+
+    context 'when the payload is a paginated Collection with inlined replies' do
+      let(:payload) do
+        {
+          '@context': 'https://www.w3.org/ns/activitystreams',
+          type: 'Collection',
+          id: collection_uri,
+          first: {
+            type: 'CollectionPage',
+            partOf: collection_uri,
+            items: items,
+          }
+        }.with_indifferent_access
+      end
+
+      context 'when passing the collection itself' do
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, payload)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+
+      context 'when passing the URL to the collection' do
+        before do
+          stub_request(:get, collection_uri).to_return(status: 200, body: Oj.dump(payload))
+        end
+
+        it 'spawns workers for up to 5 replies on the same server' do
+          allow(FetchReplyWorker).to receive(:push_bulk)
+          subject.call(status, collection_uri)
+          expect(FetchReplyWorker).to have_received(:push_bulk).with(['http://example.com/self-reply-1', 'http://example.com/self-reply-2', 'http://example.com/self-reply-3', 'http://example.com/self-reply-4', 'http://example.com/self-reply-5'])
+        end
+      end
+    end
+  end
+end
diff --git a/spec/workers/activitypub/fetch_replies_worker_spec.rb b/spec/workers/activitypub/fetch_replies_worker_spec.rb
new file mode 100644
index 0000000000..91ef3c4b92
--- /dev/null
+++ b/spec/workers/activitypub/fetch_replies_worker_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe ActivityPub::FetchRepliesWorker do
+  subject { described_class.new }
+
+  let(:account) { Fabricate(:account, uri: 'https://example.com/user/1') }
+  let(:status)  { Fabricate(:status, account: account) }
+
+  let(:payload) do
+    {
+      '@context': 'https://www.w3.org/ns/activitystreams',
+      id: 'https://example.com/statuses_replies/1',
+      type: 'Collection',
+      items: [],
+    }
+  end
+
+  let(:json) { Oj.dump(payload) }
+
+  describe 'perform' do
+    it 'performs a request if the collection URI is from the same host' do
+      stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 200, body: json)
+      subject.perform(status.id, 'https://example.com/statuses_replies/1')
+      expect(a_request(:get, 'https://example.com/statuses_replies/1')).to have_been_made.once
+    end
+
+    it 'does not perform a request if the collection URI is from a different host' do
+      stub_request(:get, 'https://other.com/statuses_replies/1').to_return(status: 200)
+      subject.perform(status.id, 'https://other.com/statuses_replies/1')
+      expect(a_request(:get, 'https://other.com/statuses_replies/1')).to_not have_been_made
+    end
+
+    it 'raises when request fails' do
+      stub_request(:get, 'https://example.com/statuses_replies/1').to_return(status: 500)
+      expect { subject.perform(status.id, 'https://example.com/statuses_replies/1') }.to raise_error Mastodon::UnexpectedResponseError
+    end
+  end
+end
-- 
GitLab


From d8498b39838eb352a9b268e0f22b1b025320dc73 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Thu, 28 Feb 2019 18:16:34 +0100
Subject: [PATCH 145/192] Give the `replies` collection an identifier and
 enable pagination (#10128)

---
 app/controllers/statuses_controller.rb        | 53 +++++++++++++++++++
 app/lib/activitypub/tag_manager.rb            |  6 +++
 .../activitypub/note_serializer.rb            | 10 ++--
 config/routes.rb                              |  1 +
 4 files changed, 67 insertions(+), 3 deletions(-)

diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index 15d59fd893..3686bd9fd8 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -18,6 +18,7 @@ class StatusesController < ApplicationController
   before_action :redirect_to_original, only: [:show]
   before_action :set_referrer_policy_header, only: [:show]
   before_action :set_cache_headers
+  before_action :set_replies, only: [:replies]
 
   content_security_policy only: :embed do |p|
     p.frame_ancestors(false)
@@ -63,8 +64,37 @@ class StatusesController < ApplicationController
     render 'stream_entries/embed', layout: 'embedded'
   end
 
+  def replies
+    skip_session!
+
+    render json: replies_collection_presenter,
+           serializer: ActivityPub::CollectionSerializer,
+           adapter: ActivityPub::Adapter,
+           content_type: 'application/activity+json',
+           skip_activities: true
+  end
+
   private
 
+  def replies_collection_presenter
+    page = ActivityPub::CollectionPresenter.new(
+      id: replies_account_status_url(@account, @status, page_params),
+      type: :unordered,
+      part_of: replies_account_status_url(@account, @status),
+      next: next_page,
+      items: @replies.map { |status| status.local ? status : status.id }
+    )
+    if page_requested?
+      page
+    else
+      ActivityPub::CollectionPresenter.new(
+        id: replies_account_status_url(@account, @status),
+        type: :unordered,
+        first: page
+      )
+    end
+  end
+
   def create_descendant_thread(starting_depth, statuses)
     depth = starting_depth + statuses.size
     if depth < DESCENDANTS_DEPTH_LIMIT
@@ -174,4 +204,27 @@ class StatusesController < ApplicationController
     return if @status.public_visibility? || @status.unlisted_visibility?
     response.headers['Referrer-Policy'] = 'origin'
   end
+
+  def page_requested?
+    params[:page] == 'true'
+  end
+
+  def set_replies
+    @replies = page_params[:other_accounts] ? Status.where.not(account_id: @account.id) : @account.statuses
+    @replies = @replies.where(in_reply_to_id: @status.id, visibility: [:public, :unlisted])
+    @replies = @replies.paginate_by_min_id(DESCENDANTS_LIMIT, params[:min_id])
+  end
+
+  def next_page
+    last_reply = @replies.last
+    return if last_reply.nil?
+    same_account = last_reply.account_id == @account.id
+    return unless same_account || @replies.size == DESCENDANTS_LIMIT
+    same_account = false unless @replies.size == DESCENDANTS_LIMIT
+    replies_account_status_url(@account, @status, page: true, min_id: last_reply.id, other_accounts: !same_account)
+  end
+
+  def page_params
+    { page: true, other_accounts: params[:other_accounts], min_id: params[:min_id] }.compact
+  end
 end
diff --git a/app/lib/activitypub/tag_manager.rb b/app/lib/activitypub/tag_manager.rb
index be3a562d00..892bb9974a 100644
--- a/app/lib/activitypub/tag_manager.rb
+++ b/app/lib/activitypub/tag_manager.rb
@@ -48,6 +48,12 @@ class ActivityPub::TagManager
     activity_account_status_url(target.account, target)
   end
 
+  def replies_uri_for(target, page_params = nil)
+    raise ArgumentError, 'target must be a local activity' unless %i(note comment activity).include?(target.object_type) && target.local?
+
+    replies_account_status_url(target.account, target, page_params)
+  end
+
   # Primary audience of a status
   # Public statuses go out to primarily the public collection
   # Unlisted and private statuses go out primarily to the followers collection
diff --git a/app/serializers/activitypub/note_serializer.rb b/app/serializers/activitypub/note_serializer.rb
index 6b0978ad3c..4aab993a9c 100644
--- a/app/serializers/activitypub/note_serializer.rb
+++ b/app/serializers/activitypub/note_serializer.rb
@@ -13,7 +13,7 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   has_many :media_attachments, key: :attachment
   has_many :virtual_tags, key: :tag
 
-  has_one :replies, serializer: ActivityPub::CollectionSerializer
+  has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local?
 
   def id
     ActivityPub::TagManager.instance.uri_for(object)
@@ -36,12 +36,16 @@ class ActivityPub::NoteSerializer < ActiveModel::Serializer
   end
 
   def replies
+    replies = object.self_replies(5).pluck(:id, :uri)
+    last_id = replies.last&.first
     ActivityPub::CollectionPresenter.new(
       type: :unordered,
+      id: ActivityPub::TagManager.instance.replies_uri_for(object),
       first: ActivityPub::CollectionPresenter.new(
         type: :unordered,
-        page: true,
-        items: object.self_replies(5).pluck(:uri)
+        part_of: ActivityPub::TagManager.instance.replies_uri_for(object),
+        items: replies.map(&:second),
+        next: last_id ? ActivityPub::TagManager.instance.replies_uri_for(object, page: true, min_id: last_id) : nil
       )
     )
   end
diff --git a/config/routes.rb b/config/routes.rb
index ded62981d4..9a83d0f882 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -56,6 +56,7 @@ Rails.application.routes.draw do
       member do
         get :activity
         get :embed
+        get :replies
       end
     end
 
-- 
GitLab


From ee7d79c0ce411ff7754e3ac31dbf27cb9e298f73 Mon Sep 17 00:00:00 2001
From: ThibG <thib@sitedethib.com>
Date: Thu, 28 Feb 2019 21:35:16 +0100
Subject: [PATCH 146/192] Fix serialization of boosts (#10129)

The condition introduced by #9998 was wrong, serializing boosts
that weren't self-boosts, and not serializing self-boosts.
---
 app/serializers/activitypub/activity_serializer.rb | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index b51e8c5442..c001e28aae 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -3,8 +3,8 @@
 class ActivityPub::ActivitySerializer < ActiveModel::Serializer
   attributes :id, :type, :actor, :published, :to, :cc
 
-  has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, unless: :owned_announce?
-  attribute :proper_uri, key: :object, if: :owned_announce?
+  has_one :proper, key: :object, serializer: ActivityPub::NoteSerializer, if: :serialize_object?
+  attribute :proper_uri, key: :object, unless: :serialize_object?
   attribute :atom_uri, if: :announce?
 
   def id
@@ -43,7 +43,9 @@ class ActivityPub::ActivitySerializer < ActiveModel::Serializer
     object.reblog?
   end
 
-  def owned_announce?
-    announce? && object.account == object.proper.account && object.proper.private_visibility?
+  def serialize_object?
+    return true unless announce?
+    # Serialize private self-boosts of local toots
+    object.account == object.proper.account && object.proper.private_visibility? && object.local?
   end
 end
-- 
GitLab


From 54179b652993fd773332f61e89d3b1a14a3817ce Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Feb 2019 16:32:07 +0100
Subject: [PATCH 147/192] {mastodon,flavours/glitch/util}/api.js: Remove
 csrf-token query

---
 app/javascript/flavours/glitch/util/api.js | 12 ++----------
 app/javascript/mastodon/api.js             | 12 ++----------
 2 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/app/javascript/flavours/glitch/util/api.js b/app/javascript/flavours/glitch/util/api.js
index 033d2d67b5..65aa61ba71 100644
--- a/app/javascript/flavours/glitch/util/api.js
+++ b/app/javascript/flavours/glitch/util/api.js
@@ -1,5 +1,4 @@
 import axios from 'axios';
-import ready from './ready';
 import LinkHeader from 'http-link-header';
 
 export const getLinks = response => {
@@ -12,17 +11,10 @@ export const getLinks = response => {
   return LinkHeader.parse(value);
 };
 
-let csrfHeader = {};
-function setCSRFHeader() {
-  const csrfToken = document.querySelector('meta[name=csrf-token]').content;
-  csrfHeader['X-CSRF-Token'] = csrfToken;
-}
-ready(setCSRFHeader);
-
 export default getState => axios.create({
-  headers: Object.assign(csrfHeader, getState ? {
+  headers: getState ? {
     'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`,
-  } : {}),
+  } : {},
 
   transformResponse: [function (data) {
     try {
diff --git a/app/javascript/mastodon/api.js b/app/javascript/mastodon/api.js
index 4be3eadb02..65aa61ba71 100644
--- a/app/javascript/mastodon/api.js
+++ b/app/javascript/mastodon/api.js
@@ -1,6 +1,5 @@
 import axios from 'axios';
 import LinkHeader from 'http-link-header';
-import ready from './ready';
 
 export const getLinks = response => {
   const value = response.headers.link;
@@ -12,17 +11,10 @@ export const getLinks = response => {
   return LinkHeader.parse(value);
 };
 
-let csrfHeader = {};
-function setCSRFHeader() {
-  const csrfToken = document.querySelector('meta[name=csrf-token]').content;
-  csrfHeader['X-CSRF-Token'] = csrfToken;
-}
-ready(setCSRFHeader);
-
 export default getState => axios.create({
-  headers: Object.assign(csrfHeader, getState ? {
+  headers: getState ? {
     'Authorization': `Bearer ${getState().getIn(['meta', 'access_token'], '')}`,
-  } : {}),
+  } : {},
 
   transformResponse: [function (data) {
     try {
-- 
GitLab


From d680a5aad20d433f5959c2e7f31f9fab82f782e4 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Feb 2019 16:37:53 +0100
Subject: [PATCH 148/192] package.json: Add (npm run) dev command

---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index ecd9f86ebd..e20462a4dc 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
     "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack",
     "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack",
     "manage:translations": "node ./config/webpack/translationRunner.js",
+    "dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack/development.js --progress --color",
     "start": "node ./streaming/index.js",
     "test": "${npm_execpath} run test:lint && ${npm_execpath} run test:jest",
     "test:lint": "eslint --ext=js .",
-- 
GitLab


From b0c19578f197ee0a3e358a05c46ac4837de64ba7 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Thu, 29 Mar 2018 01:46:07 +0200
Subject: [PATCH 149/192] README.md: full rewrite for pleroma

---
 README.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 69 insertions(+), 7 deletions(-)

diff --git a/README.md b/README.md
index 470e379dc0..d512a01952 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,74 @@
-#  Mastodon Glitch Edition  #
+# Glitch-fe: glitch-soc frontend for pleroma
 
->   Now with automated deploys!
+Here is a fork of mastodon. We could really just remove all of the code except
+for the frontend, but to easily pull the upstream repo we'll just keep
+everything. This is my fork for the moment with the idea of making the mastofe
+just as polished as the pleromafe. If you want to get access, open an issue or
+hit me up at howl@social.zxq.co.
 
-[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci]
+# Development
 
-[circleci]: https://circleci.com/gh/glitch-soc/mastodon
+I use a combination of the pleroma backend + yarn + nginx to do local
+development. I refuse to install Ruby. Here's how to get it running on your own
+machine:
 
-So here's the deal: we all work on this code, and then it runs on dev.glitch.social and anyone who uses that does so absolutely at their own risk. can you dig it?
+## Install yarn
 
-- You can view documentation for this project at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/).
-- And contributing guidelines are available [here](CONTRIBUTING.md) and [here](https://glitch-soc.github.io/docs/contributing/).
+Yarn will be needed to set up the mastodon frontend for development. Check out
+https://yarnpkg.com/lang/en/docs/install/ . For Debian, it's like this:
+
+```sh
+# import yarn pub key and repo
+curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
+echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
+sudo apt-get update
+sudo apt-get install yarn
+```
+
+## Mastodon Frontend Setup
+
+```sh
+# Install dependencies
+yarn install -D
+npm run dev
+# check that http://localhost:3035/packs/common.css works in your browser once
+# webpack is done compiling. if css shows up, then it should have worked!
+```
+
+## nginx setup
+
+I'll assume that you have already fired up pleroma using the installation guide.
+To work on the frontend while still having the backend up, use this nginx
+config.
+
+```
+server {
+    listen 80;
+    server_name pleroma.testing;
+
+    location /packs {
+        add_header 'Access-Control-Allow-Origin' '*';
+        proxy_http_version 1.1;
+        proxy_set_header Host $http_host;
+
+        proxy_pass http://localhost:3035;
+    }
+
+    location / {
+        add_header 'Access-Control-Allow-Origin' '*';
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+        proxy_set_header Host $http_host;
+
+        proxy_pass http://localhost:4000;
+    }
+}
+```
+
+Change the `server_name` if you like. I personally like to create a new entry
+in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you.
+
+If you have enough luck, navigating to your \<server\_name\>/web should show
+you the mastodon frontend, and should also work with all the nice things of
+webpack such as hot reloading. Have fun!
-- 
GitLab


From 284e503556c75a824c62d6c7ca8849144a072243 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Thu, 29 Mar 2018 23:47:13 +0200
Subject: [PATCH 150/192] Fix going to /web and getting redirected to /web/web

---
 app/javascript/mastodon/main.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/main.js b/app/javascript/mastodon/main.js
index 5d73caa108..da4884fd3d 100644
--- a/app/javascript/mastodon/main.js
+++ b/app/javascript/mastodon/main.js
@@ -12,7 +12,7 @@ function main() {
   if (window.history && history.replaceState) {
     const { pathname, search, hash } = window.location;
     const path = pathname + search + hash;
-    if (!(/^\/web[$/]/).test(path)) {
+    if (!(/^\/web($|\/)/).test(path)) {
       history.replaceState(null, document.title, `/web${path}`);
     }
   }
-- 
GitLab


From d629448248b285908f9606c221f504585c84b5e3 Mon Sep 17 00:00:00 2001
From: Lain Iwakura <lain@soykaf.club>
Date: Tue, 14 Nov 2017 16:24:10 +0100
Subject: [PATCH 151/192] Handle character limit in initial state in frontend.

---
 app/javascript/mastodon/initial_state.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 6068246ae5..418659b918 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -12,7 +12,7 @@ export const boostModal = getMeta('boost_modal');
 export const deleteModal = getMeta('delete_modal');
 export const me = getMeta('me');
 export const searchEnabled = getMeta('search_enabled');
-export const maxChars = (initialState && initialState.max_toot_chars) || 500;
+export const maxChars = getMeta('max_toot_chars') || getMeta('char_limit') || 5000;
 export const invitesEnabled = getMeta('invites_enabled');
 export const version = getMeta('version');
 export const mascot = getMeta('mascot');
-- 
GitLab


From 57e9ddf4a7b9c4da357656a004d6df9b64d704b5 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 16:50:55 +0200
Subject: [PATCH 152/192] Remove unnecessary ruby from build scripts

---
 package.json | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index e20462a4dc..37b64a0e1e 100644
--- a/package.json
+++ b/package.json
@@ -6,8 +6,9 @@
   },
   "scripts": {
     "postversion": "git push --tags",
-    "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack",
-    "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack",
+    "build:development": "cross-env NODE_ENV=development webpack --config config/webpack/development.js",
+    "build:production": "cross-env NODE_ENV=production webpack --config config/webpack/production.js",
+    "build": "cross-env NODE_ENV=production webpack --config config/webpack/production.js",
     "manage:translations": "node ./config/webpack/translationRunner.js",
     "dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack/development.js --progress --color",
     "start": "node ./streaming/index.js",
-- 
GitLab


From b7749da458984703bc96a984b3dd885f35906264 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 18:31:24 +0200
Subject: [PATCH 153/192] remove bundle analyzer, remove chunk hashes from css

---
 config/webpack/production.js | 11 -----
 config/webpack/shared.js     |  2 +-
 package.json                 |  1 -
 yarn.lock                    | 83 +++---------------------------------
 4 files changed, 6 insertions(+), 91 deletions(-)

diff --git a/config/webpack/production.js b/config/webpack/production.js
index d37e11792b..e938367c29 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -5,7 +5,6 @@ const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
 const CompressionPlugin = require('compression-webpack-plugin');
 const zopfli = require('@gfx/zopfli');
 const sharedConfig = require('./shared.js');
-const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
 const OfflinePlugin = require('offline-plugin');
 const { publicPath } = require('./configuration.js');
 const path = require('path');
@@ -65,16 +64,6 @@ module.exports = merge(sharedConfig, {
       },
       test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/,
     }),
-    new BundleAnalyzerPlugin({ // generates report.html and stats.json
-      analyzerMode: 'static',
-      generateStatsFile: true,
-      statsOptions: {
-        // allows usage with http://chrisbateman.github.io/webpack-visualizer/
-        chunkModules: true,
-      },
-      openAnalyzer: false,
-      logLevel: 'silent', // do not bother Webpacker, who runs with --json and parses stdout
-    }),
     new OfflinePlugin({
       publicPath: publicPath, // sw.js must be served from the root to avoid scope issues
       caches: {
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 938bab9f5e..f1ce03900f 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -98,7 +98,7 @@ module.exports = {
       }
     ),
     new MiniCssExtractPlugin({
-      filename: env.NODE_ENV === 'production' ? '[name]-[contenthash].css' : '[name].css',
+      filename: '[name].css',
     }),
     new AssetsManifestPlugin({
       publicPath: true,
diff --git a/package.json b/package.json
index 37b64a0e1e..6fe70a36ee 100644
--- a/package.json
+++ b/package.json
@@ -135,7 +135,6 @@
     "uws": "10.148.0",
     "webpack": "^4.28.3",
     "webpack-assets-manifest": "^3.1.1",
-    "webpack-bundle-analyzer": "^3.0.3",
     "webpack-cli": "^3.1.2",
     "webpack-merge": "^4.1.5",
     "websocket.js": "^0.1.12"
diff --git a/yarn.lock b/yarn.lock
index 3137b08563..297941b061 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -991,7 +991,7 @@ acorn-walk@^6.0.1:
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
   integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
 
-acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2, acorn@^5.7.3:
+acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2:
   version "5.7.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
@@ -1584,16 +1584,6 @@ bcrypt-pbkdf@^1.0.0:
   dependencies:
     tweetnacl "^0.14.3"
 
-bfj@^6.1.1:
-  version "6.1.1"
-  resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.1.tgz#05a3b7784fbd72cfa3c22e56002ef99336516c48"
-  integrity sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==
-  dependencies:
-    bluebird "^3.5.1"
-    check-types "^7.3.0"
-    hoopy "^0.1.2"
-    tryer "^1.0.0"
-
 big.js@^3.1.3:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
@@ -1609,7 +1599,7 @@ binary-extensions@^1.0.0:
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
   integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==
 
-bluebird@^3.5.1, bluebird@^3.5.3:
+bluebird@^3.5.3:
   version "3.5.3"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
   integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
@@ -1956,11 +1946,6 @@ chardet@^0.7.0:
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
   integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
-check-types@^7.3.0:
-  version "7.4.0"
-  resolved "https://registry.yarnpkg.com/check-types/-/check-types-7.4.0.tgz#0378ec1b9616ec71f774931a3c6516fad8c152f4"
-  integrity sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==
-
 cheerio@^1.0.0-rc.2:
   version "1.0.0-rc.2"
   resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db"
@@ -2150,7 +2135,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.11.0, commander@^2.18.0, commander@^2.19.0:
+commander@^2.11.0, commander@^2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
   integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
@@ -2987,11 +2972,6 @@ double-ended-queue@^2.1.0-0:
   resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
   integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
 
-duplexer@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
-  integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
-
 duplexify@^3.4.2, duplexify@^3.6.0:
   version "3.6.1"
   resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125"
@@ -3015,7 +2995,7 @@ ee-first@1.1.1:
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
-ejs@^2.3.4, ejs@^2.6.1:
+ejs@^2.3.4:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
   integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
@@ -3516,7 +3496,7 @@ expect@^23.6.0:
     jest-message-util "^23.4.0"
     jest-regex-util "^23.3.0"
 
-express@^4.16.2, express@^4.16.3, express@^4.16.4:
+express@^4.16.2, express@^4.16.4:
   version "4.16.4"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
   integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
@@ -3718,11 +3698,6 @@ fileset@^2.0.2:
     glob "^7.0.3"
     minimatch "^3.0.3"
 
-filesize@^3.6.1:
-  version "3.6.1"
-  resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
-  integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
-
 fill-range@^2.1.0:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
@@ -4058,14 +4033,6 @@ growly@^1.3.0:
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
   integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
 
-gzip-size@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80"
-  integrity sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==
-  dependencies:
-    duplexer "^0.1.1"
-    pify "^3.0.0"
-
 handle-thing@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
@@ -4221,11 +4188,6 @@ home-or-tmp@^2.0.0:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.1"
 
-hoopy@^0.1.2:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
-  integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
-
 hosted-git-info@^2.1.4:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
@@ -6464,11 +6426,6 @@ onetime@^2.0.0:
   dependencies:
     mimic-fn "^1.0.0"
 
-opener@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
-  integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
-
 opn@^5.1.0:
   version "5.4.0"
   resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035"
@@ -9114,11 +9071,6 @@ trim-right@^1.0.1:
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
   integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
 
-tryer@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
-  integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
-
 tslib@^1.9.0:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
@@ -9462,24 +9414,6 @@ webpack-assets-manifest@^3.1.1:
     tapable "^1.0.0"
     webpack-sources "^1.0.0"
 
-webpack-bundle-analyzer@^3.0.3:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.0.3.tgz#dbc7fff8f52058b6714a20fddf309d0790e3e0a0"
-  integrity sha512-naLWiRfmtH4UJgtUktRTLw6FdoZJ2RvCR9ePbwM9aRMsS/KjFerkPZG9epEvXRAw5d5oPdrs9+3p+afNjxW8Xw==
-  dependencies:
-    acorn "^5.7.3"
-    bfj "^6.1.1"
-    chalk "^2.4.1"
-    commander "^2.18.0"
-    ejs "^2.6.1"
-    express "^4.16.3"
-    filesize "^3.6.1"
-    gzip-size "^5.0.0"
-    lodash "^4.17.10"
-    mkdirp "^0.5.1"
-    opener "^1.5.1"
-    ws "^6.0.0"
-
 webpack-cli@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746"
@@ -9722,13 +9656,6 @@ ws@^5.2.0:
   dependencies:
     async-limiter "~1.0.0"
 
-ws@^6.0.0:
-  version "6.1.2"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
-  integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
-  dependencies:
-    async-limiter "~1.0.0"
-
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
-- 
GitLab


From 9215eb120291e00f79801275733e1a7ca82aab66 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 17:55:08 +0200
Subject: [PATCH 154/192] remove gzip on assets, add build.sh

pickups:
- build.sh: Make the target dir configurable
- build.sh: Auto-update yarn dependencies

Co-authored-by: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
---
 build.sh                     | 10 ++++++++++
 config/webpack/production.js | 13 ++-----------
 package.json                 |  1 -
 yarn.lock                    | 14 +-------------
 4 files changed, 13 insertions(+), 25 deletions(-)
 create mode 100755 build.sh

diff --git a/build.sh b/build.sh
new file mode 100755
index 0000000000..9a218c3a2e
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+TARGET="../pleroma" # Where pleroma’s repository is sitting
+
+yarn install -D
+
+rm -rf public/packs public/assets
+env -i "PATH=$PATH" npm run build
+cp public/assets/sw.js "${TARGET}/priv/static/sw.js"
+rm -rf "${TARGET}/priv/static/packs"
+cp -r public/packs "${TARGET}/priv/static/packs"
diff --git a/config/webpack/production.js b/config/webpack/production.js
index e938367c29..0e9aa0c1c0 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -2,8 +2,6 @@
 
 const merge = require('webpack-merge');
 const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
-const CompressionPlugin = require('compression-webpack-plugin');
-const zopfli = require('@gfx/zopfli');
 const sharedConfig = require('./shared.js');
 const OfflinePlugin = require('offline-plugin');
 const { publicPath } = require('./configuration.js');
@@ -29,8 +27,8 @@ module.exports = merge(sharedConfig, {
   mode: 'production',
 
   output: {
-    filename: '[name]-[chunkhash].js',
-    chunkFilename: '[name]-[chunkhash].js',
+    filename: '[name].js',
+    chunkFilename: '[name].js',
   },
 
   devtool: 'source-map', // separate sourcemap file, suitable for production
@@ -58,12 +56,6 @@ module.exports = merge(sharedConfig, {
   },
 
   plugins: [
-    new CompressionPlugin({
-      algorithm(input, compressionOptions, callback) {
-        return zopfli.gzip(input, compressionOptions, callback);
-      },
-      test: /\.(js|css|html|json|ico|svg|eot|otf|ttf)$/,
-    }),
     new OfflinePlugin({
       publicPath: publicPath, // sw.js must be served from the root to avoid scope issues
       caches: {
@@ -87,7 +79,6 @@ module.exports = merge(sharedConfig, {
         '/emoji/sheet_10.png', // used in emoji-mart
       ],
       excludes: [
-        '**/*.gz',
         '**/*.map',
         'stats.json',
         'report.html',
diff --git a/package.json b/package.json
index 6fe70a36ee..715e3c2112 100644
--- a/package.json
+++ b/package.json
@@ -53,7 +53,6 @@
     "babel-plugin-transform-react-remove-prop-types": "^0.4.21",
     "babel-runtime": "^6.26.0",
     "classnames": "^2.2.5",
-    "compression-webpack-plugin": "^2.0.0",
     "cross-env": "^5.1.4",
     "css-loader": "^2.1.0",
     "cssnano": "^4.1.8",
diff --git a/yarn.lock b/yarn.lock
index 297941b061..3ae3aee47b 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2162,18 +2162,6 @@ compressible@~2.0.14:
   dependencies:
     mime-db ">= 1.36.0 < 2"
 
-compression-webpack-plugin@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz#46476350c1eb27f783dccc79ac2f709baa2cffbc"
-  integrity sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q==
-  dependencies:
-    cacache "^11.2.0"
-    find-cache-dir "^2.0.0"
-    neo-async "^2.5.0"
-    schema-utils "^1.0.0"
-    serialize-javascript "^1.4.0"
-    webpack-sources "^1.0.1"
-
 compression@^1.5.2:
   version "1.7.3"
   resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
@@ -9491,7 +9479,7 @@ webpack-merge@^4.1.5:
   dependencies:
     lodash "^4.17.5"
 
-webpack-sources@^1.0.0, webpack-sources@^1.0.1, webpack-sources@^1.1.0, webpack-sources@^1.3.0:
+webpack-sources@^1.0.0, webpack-sources@^1.1.0, webpack-sources@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
   integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
-- 
GitLab


From 88b6545bf42a1b41209492955e431ca62d82c909 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 3 Jul 2018 13:45:58 +0200
Subject: [PATCH 155/192] README.md: document deployement with build.sh

---
 README.md | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/README.md b/README.md
index d512a01952..f22b062f40 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,15 @@ everything. This is my fork for the moment with the idea of making the mastofe
 just as polished as the pleromafe. If you want to get access, open an issue or
 hit me up at howl@social.zxq.co.
 
+# Deployement
+
+This is what you want to do to update the mastofe bundled with pleroma.
+
+- Run ``build.sh`` at the root of this repo, you can set the ``TARGET`` environment variable if pleroma isn’t at ``../pleroma`` (default value of ``TARGET``)
+- Go to pleroma repo:
+  - ``git add priv/static/sw.js priv/static/packs``
+  - ``git commit -m "update mastofe"``
+
 # Development
 
 I use a combination of the pleroma backend + yarn + nginx to do local
-- 
GitLab


From e93efea87e033c861d6f8bbfdd63d098304c0366 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 19:12:24 +0200
Subject: [PATCH 156/192] Default when there is no applicationServerKey meta on
 the page

---
 .../mastodon/actions/push_notifications/registerer.js        | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/app/javascript/mastodon/actions/push_notifications/registerer.js b/app/javascript/mastodon/actions/push_notifications/registerer.js
index b0f42b6a20..67bf7cb4e9 100644
--- a/app/javascript/mastodon/actions/push_notifications/registerer.js
+++ b/app/javascript/mastodon/actions/push_notifications/registerer.js
@@ -14,7 +14,10 @@ const urlBase64ToUint8Array = (base64String) => {
   return decodeBase64(base64);
 };
 
-const getApplicationServerKey = () => document.querySelector('[name="applicationServerKey"]').getAttribute('content');
+const getApplicationServerKey = () => {
+  const k = document.querySelector('[name="applicationServerKey"]');
+  return k === null ? '' : k.getAttribute('content');
+};
 
 const getRegistration = () => navigator.serviceWorker.ready;
 
-- 
GitLab


From ff48341b91e41bd4860e97fa41e3d8e6c11a3c17 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sun, 1 Apr 2018 11:11:45 +0200
Subject: [PATCH 157/192] fix the homepage being loaded issue

---
 app/javascript/mastodon/service_worker/entry.js | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js
index b354f3b332..eb66f8457e 100644
--- a/app/javascript/mastodon/service_worker/entry.js
+++ b/app/javascript/mastodon/service_worker/entry.js
@@ -10,7 +10,7 @@ function openWebCache() {
 }
 
 function fetchRoot() {
-  return fetch('/', { credentials: 'include', redirect: 'manual' });
+  return fetch('/web', { credentials: 'include', redirect: 'manual' });
 }
 
 // const firefox = navigator.userAgent.match(/Firefox\/(\d+)/);
@@ -19,7 +19,7 @@ function fetchRoot() {
 // Cause a new version of a registered Service Worker to replace an existing one
 // that is already installed, and replace the currently active worker on open pages.
 self.addEventListener('install', function(event) {
-  event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/', root)));
+  event.waitUntil(Promise.all([openWebCache(), fetchRoot()]).then(([cache, root]) => cache.put('/web', root)));
 });
 self.addEventListener('activate', function(event) {
   event.waitUntil(self.clients.claim());
@@ -27,17 +27,17 @@ self.addEventListener('activate', function(event) {
 self.addEventListener('fetch', function(event) {
   const url = new URL(event.request.url);
 
-  if (url.pathname.startsWith('/web/')) {
+  if (url.pathname.startsWith('/web')) {
     const asyncResponse = fetchRoot();
     const asyncCache = openWebCache();
 
     event.respondWith(asyncResponse.then(
       response => {
         const clonedResponse = response.clone();
-        asyncCache.then(cache => cache.put('/', clonedResponse)).catch();
+        asyncCache.then(cache => cache.put('/web', clonedResponse)).catch();
         return response;
       },
-      () => asyncCache.then(cache => cache.match('/'))));
+      () => asyncCache.then(cache => cache.match('/web'))));
   } else if (url.pathname === '/auth/sign_out') {
     const asyncResponse = fetch(event.request);
     const asyncCache = openWebCache();
@@ -45,7 +45,7 @@ self.addEventListener('fetch', function(event) {
     event.respondWith(asyncResponse.then(response => {
       if (response.ok || response.type === 'opaqueredirect') {
         return Promise.all([
-          asyncCache.then(cache => cache.delete('/')),
+          asyncCache.then(cache => cache.delete('/web')),
           indexedDB.deleteDatabase('mastodon'),
         ]).then(() => response);
       }
-- 
GitLab


From bfe8dc3db51e4e0b2cd63d7a4c0f3b5d4511494b Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Mon, 2 Apr 2018 13:22:25 +0200
Subject: [PATCH 158/192] package.json: Add description field

APPARENTLY NPM ADDS A npm_package_description WHICH IS THE description
FIELD IN package.json WHICH HOWEVER IF NOT SET BECOMES THE SECOND LINE
OF THE README LIKE WHAT THE FUCKKKKKKKKKKKKK
---
 package.json | 1 +
 1 file changed, 1 insertion(+)

diff --git a/package.json b/package.json
index 715e3c2112..062e2f2f12 100644
--- a/package.json
+++ b/package.json
@@ -1,5 +1,6 @@
 {
   "name": "mastodon",
+  "description": "mastodon",
   "license": "AGPL-3.0-or-later",
   "engines": {
     "node": ">=8 <11"
-- 
GitLab


From 2429af16ca674789412e173442981fd59250bad0 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Mon, 2 Apr 2018 18:25:08 +0200
Subject: [PATCH 159/192] always make /web/login go through

Original commit: 011eda089abad18c89324ca4bcb6930bb682a0b9
---
 app/javascript/mastodon/service_worker/entry.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/javascript/mastodon/service_worker/entry.js b/app/javascript/mastodon/service_worker/entry.js
index eb66f8457e..9ab0bd333a 100644
--- a/app/javascript/mastodon/service_worker/entry.js
+++ b/app/javascript/mastodon/service_worker/entry.js
@@ -28,6 +28,10 @@ self.addEventListener('fetch', function(event) {
   const url = new URL(event.request.url);
 
   if (url.pathname.startsWith('/web')) {
+    // we always make /web/login go through
+    if (url.pathname.startsWith('/web/login')) {
+      return;
+    }
     const asyncResponse = fetchRoot();
     const asyncCache = openWebCache();
 
-- 
GitLab


From ebabad436ffa7492b65b699a782b63dbdce066e1 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 14:54:56 +0200
Subject: [PATCH 160/192] handle empty message (ping) in ws

---
 app/javascript/flavours/glitch/util/stream.js | 5 ++++-
 app/javascript/mastodon/stream.js             | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/util/stream.js b/app/javascript/flavours/glitch/util/stream.js
index 9928d0dd76..d869d93db4 100644
--- a/app/javascript/flavours/glitch/util/stream.js
+++ b/app/javascript/flavours/glitch/util/stream.js
@@ -74,7 +74,10 @@ export default function getStream(streamingAPIBaseURL, accessToken, stream, { co
   const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`);
 
   ws.onopen      = connected;
-  ws.onmessage   = e => received(JSON.parse(e.data));
+  ws.onmessage   = e => {
+    if (e.data !== '')
+      received(JSON.parse(e.data));
+  };
   ws.onclose     = disconnected;
   ws.onreconnect = reconnected;
 
diff --git a/app/javascript/mastodon/stream.js b/app/javascript/mastodon/stream.js
index 9928d0dd76..d869d93db4 100644
--- a/app/javascript/mastodon/stream.js
+++ b/app/javascript/mastodon/stream.js
@@ -74,7 +74,10 @@ export default function getStream(streamingAPIBaseURL, accessToken, stream, { co
   const ws = new WebSocketClient(`${streamingAPIBaseURL}/api/v1/streaming/?${params.join('&')}`);
 
   ws.onopen      = connected;
-  ws.onmessage   = e => received(JSON.parse(e.data));
+  ws.onmessage   = e => {
+    if (e.data !== '')
+      received(JSON.parse(e.data));
+  };
   ws.onclose     = disconnected;
   ws.onreconnect = reconnected;
 
-- 
GitLab


From 784e01a6e57d90d63fc34043c6f12b1f01189fa7 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 17 Apr 2018 18:41:21 +0200
Subject: [PATCH 161/192] app/javascript/mastodon/components/media_gallery.js:
 Add support for audio attachements

---
 .../glitch/components/media_gallery.js        | 15 +++++++++++++
 .../glitch/styles/components/media.scss       | 22 +++++++++++++++++++
 .../mastodon/components/media_gallery.js      | 12 ++++++++++
 .../styles/mastodon/components.scss           |  8 +++++++
 4 files changed, 57 insertions(+)

diff --git a/app/javascript/flavours/glitch/components/media_gallery.js b/app/javascript/flavours/glitch/components/media_gallery.js
index 1fa25ee4ec..adf61b7d2a 100644
--- a/app/javascript/flavours/glitch/components/media_gallery.js
+++ b/app/javascript/flavours/glitch/components/media_gallery.js
@@ -176,6 +176,21 @@ class Item extends React.PureComponent {
           />
         </a>
       );
+    } else if (attachment.get('type') === 'audio') {
+      thumbnail = (
+        <div
+          className='media-gallery__audio'
+          aria-label={attachment.get('description')}
+          role='application'
+        >
+          <span><p>sound<br/>only</p></span>
+          <span><p>{attachment.get('description')}</p></span>
+          <audio
+            src={attachment.get('url')}
+            controls
+          />
+        </div>
+        );
     } else if (attachment.get('type') === 'gifv') {
       const autoPlay = !isIOS() && autoPlayGif;
 
diff --git a/app/javascript/flavours/glitch/styles/components/media.scss b/app/javascript/flavours/glitch/styles/components/media.scss
index e8011bde90..1772e84120 100644
--- a/app/javascript/flavours/glitch/styles/components/media.scss
+++ b/app/javascript/flavours/glitch/styles/components/media.scss
@@ -74,6 +74,28 @@
   }
 }
 
+.media-gallery__audio {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+
+  span {
+    text-align: center;
+    color: $darker-text-color;
+    display: flex;
+    height: 100%;
+    align-items: center;
+
+    p {
+      width: 100%;
+    }
+  }
+
+  audio {
+    width: 100%;
+  }
+}
+
 .media-gallery {
   box-sizing: border-box;
   margin-top: 8px;
diff --git a/app/javascript/mastodon/components/media_gallery.js b/app/javascript/mastodon/components/media_gallery.js
index a2bc952556..b95c35c352 100644
--- a/app/javascript/mastodon/components/media_gallery.js
+++ b/app/javascript/mastodon/components/media_gallery.js
@@ -150,6 +150,18 @@ class Item extends React.PureComponent {
           />
         </a>
       );
+    } else if (attachment.get('type') === 'audio') {
+      thumbnail = (
+        <div className='media-gallery__audio'>
+          <audio
+            className='media-gallery__item-audio-thumbnail'
+            aria-label={attachment.get('description')}
+            role='application'
+            src={attachment.get('url')}
+            controls
+          />
+        </div>
+      );
     } else if (attachment.get('type') === 'gifv') {
       const autoPlay = !isIOS() && autoPlayGif;
 
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 5eef07a6ee..d49ccd40b6 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -4317,6 +4317,14 @@ a.status-card.compact:hover {
   }
 }
 
+.media-gallery__audio {
+  margin-top: 32px;
+
+  audio {
+    width: 100%;
+  }
+}
+
 .attachment-list {
   display: flex;
   font-size: 14px;
-- 
GitLab


From 22a21fb12df93f1389c9444adeb3057a5bc28e9c Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 21 Apr 2018 17:58:19 +0200
Subject: [PATCH 162/192] Getting-Started column customisation (panel, notice)

---
 .../glitch/features/getting_started/index.js  |  88 ++++++++------
 .../flavours/glitch/reducers/index.js         |   2 +
 .../flavours/glitch/reducers/pleroma.js       |  18 +++
 .../glitch/styles/components/index.scss       |   8 +-
 app/javascript/mastodon/actions/pleroma.js    | 107 ++++++++++++++++++
 .../features/getting_started/index.js         |  60 +++++++---
 app/javascript/mastodon/locales/en.json       |   1 +
 app/javascript/mastodon/locales/fr.json       |   1 +
 app/javascript/mastodon/reducers/index.js     |   2 +
 app/javascript/mastodon/reducers/pleroma.js   |  18 +++
 .../styles/mastodon/components.scss           |  34 ++++--
 11 files changed, 281 insertions(+), 58 deletions(-)
 create mode 100644 app/javascript/flavours/glitch/reducers/pleroma.js
 create mode 100644 app/javascript/mastodon/actions/pleroma.js
 create mode 100644 app/javascript/mastodon/reducers/pleroma.js

diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js
index 7b645c9d09..ac90863919 100644
--- a/app/javascript/flavours/glitch/features/getting_started/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started/index.js
@@ -14,6 +14,7 @@ import { List as ImmutableList } from 'immutable';
 import { createSelector } from 'reselect';
 import { fetchLists } from 'flavours/glitch/actions/lists';
 import { preferencesLink, profileLink, signOutLink } from 'flavours/glitch/util/backend_links';
+import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma';
 
 const messages = defineMessages({
   heading: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
@@ -52,6 +53,8 @@ const makeMapStateToProps = () => {
     columns: state.getIn(['settings', 'columns']),
     unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size,
     unreadNotifications: state.getIn(['notifications', 'unread']),
+    customPanelEnabled: state.getIn(['custom_panel', 'enabled']),
+    customPanel: state.getIn(['custom_panel', 'panel']),
   });
 
   return mapStateToProps;
@@ -61,6 +64,8 @@ const mapDispatchToProps = dispatch => ({
   fetchFollowRequests: () => dispatch(fetchFollowRequests()),
   fetchLists: () => dispatch(fetchLists()),
   openSettings: () => dispatch(openModal('SETTINGS', {})),
+  fetchPanel: () => dispatch(fetchPanel()),
+  fetchPleromaConfig: () => dispatch(fetchPleromaConfig()),
 });
 
 const badgeDisplay = (number, limit) => {
@@ -88,6 +93,10 @@ export default class GettingStarted extends ImmutablePureComponent {
     lists: ImmutablePropTypes.list,
     fetchLists: PropTypes.func.isRequired,
     openSettings: PropTypes.func.isRequired,
+    fetchPanel: PropTypes.func.isRequired,
+    fetchPleromaConfig: PropTypes.func.isRequired,
+    customPanelEnabled: PropTypes.bool,
+    customPanel: PropTypes.string.isRequired,
   };
 
   componentWillMount () {
@@ -95,15 +104,18 @@ export default class GettingStarted extends ImmutablePureComponent {
   }
 
   componentDidMount () {
-    const { myAccount, fetchFollowRequests } = this.props;
+    const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props;
 
     if (myAccount.get('locked')) {
       fetchFollowRequests();
     }
+
+    fetchPleromaConfig();
+    fetchPanel();
   }
 
   render () {
-    const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings } = this.props;
+    const { intl, myAccount, columns, multiColumn, unreadFollowRequests, unreadNotifications, lists, openSettings, customPanelEnabled, customPanel } = this.props;
 
     const navItems = [];
     let listItems = [];
@@ -149,39 +161,49 @@ export default class GettingStarted extends ImmutablePureComponent {
       </div>,
     ]);
 
+    const dot = ' • ';
+    const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{__html: customPanel}} style={{marginLeft: -12, marginRight: -12}} /> :
+      <p>
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a>
+        {dot}
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a>
+        {dot}
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a>
+        {dot}
+        <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a>
+      </p>
+    );
+
     return (
       <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} label={intl.formatMessage(messages.menu)} hideHeadingOnMobile>
-        <div className='scrollable optionally-scrollable'>
-          <div className='getting-started__wrapper'>
-            <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} />
-            {navItems}
-            <ColumnSubheading text={intl.formatMessage(messages.lists_subheading)} />
-            {listItems}
-            <ColumnSubheading text={intl.formatMessage(messages.settings_subheading)} />
-            { preferencesLink !== undefined && <ColumnLink icon='cog' text={intl.formatMessage(messages.preferences)} href={preferencesLink} /> }
-            <ColumnLink icon='cogs' text={intl.formatMessage(messages.settings)} onClick={openSettings} />
-            <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' />
-          </div>
-
-          <div className='getting-started__footer'>
-            <ul>
-              {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
-              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>
-              <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>
-              <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>
-              <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a></li>
-            </ul>
-
-            <p>
-              <FormattedMessage
-                id='getting_started.open_source_notice'
-                defaultMessage='Glitchsoc is open source software, a friendly fork of {Mastodon}. You can contribute or report issues on GitHub at {github}.'
-                values={{
-                  github: <span><a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc/mastodon</a> (v{version})</span>,
-                  Mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a> }}
-              />
-            </p>
-          </div>
+        <div className='getting-started__wrapper scrollable'>
+          <ColumnSubheading text={intl.formatMessage(messages.navigation_subheading)} />
+          {navItems}
+          <ColumnSubheading text={intl.formatMessage(messages.lists_subheading)} />
+          {listItems}
+          <ColumnSubheading text={intl.formatMessage(messages.settings_subheading)} />
+          { preferencesLink !== undefined && <ColumnLink icon='cog' text={intl.formatMessage(messages.preferences)} href={preferencesLink} /> }
+          <ColumnLink icon='cogs' text={intl.formatMessage(messages.settings)} onClick={openSettings} />
+          <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' />
+        </div>
+
+        <div className='getting-started getting-started__panel scrollable'>
+          {staticContent}
+        </div>
+
+        <div className='getting-started__footer scrollable'>
+          <p>
+            <FormattedMessage
+              id='getting_started.mastofe_notice'
+              defaultMessage='Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.'
+              values={{
+                mastofe: <a href='https://git.pleroma.social/pleroma/mastofe' rel='noopener' target='_blank'>Mastofe</a>,
+                glitchsoc: <a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc</a>,
+                mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a>,
+                pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a>
+              }}
+            />
+          </p>
         </div>
       </Column>
     );
diff --git a/app/javascript/flavours/glitch/reducers/index.js b/app/javascript/flavours/glitch/reducers/index.js
index 5b1ec4abca..05523a016e 100644
--- a/app/javascript/flavours/glitch/reducers/index.js
+++ b/app/javascript/flavours/glitch/reducers/index.js
@@ -29,6 +29,7 @@ import listEditor from './list_editor';
 import listAdder from './list_adder';
 import filters from './filters';
 import pinnedAccountsEditor from './pinned_accounts_editor';
+import custom_panel from './pleroma';
 
 const reducers = {
   dropdown_menu,
@@ -61,6 +62,7 @@ const reducers = {
   listAdder,
   filters,
   pinnedAccountsEditor,
+  custom_panel,
 };
 
 export default combineReducers(reducers);
diff --git a/app/javascript/flavours/glitch/reducers/pleroma.js b/app/javascript/flavours/glitch/reducers/pleroma.js
new file mode 100644
index 0000000000..938eb94166
--- /dev/null
+++ b/app/javascript/flavours/glitch/reducers/pleroma.js
@@ -0,0 +1,18 @@
+import { Map as ImmutableMap } from 'immutable';
+import { PANEL_FETCH_SUCCESS, PLEROMA_CONFIG_FETCH_SUCCESS } from 'mastodon/actions/pleroma';
+
+const initialPanel = ImmutableMap({
+  enabled: false,
+  panel: ''
+});
+
+export default function custom_panel(state = initialPanel, action) {
+  switch (action.type) {
+  case PANEL_FETCH_SUCCESS:
+    return state.set('panel', action.panel); break;
+  case PLEROMA_CONFIG_FETCH_SUCCESS:
+    return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false);
+  }
+
+  return state;
+};
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 8e90aa545b..4fd79ee449 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -744,10 +744,15 @@
     color: $dark-text-color;
   }
 
+  &__panel {
+    height: min-content;
+  }
+
+  &__panel,
   &__footer {
-    flex: 0 0 auto;
     padding: 10px;
     padding-top: 20px;
+    flex: 0 1 auto;
 
     ul {
       margin-bottom: 10px;
@@ -760,7 +765,6 @@
     p {
       color: $dark-text-color;
       font-size: 13px;
-      margin-bottom: 20px;
 
       a {
         color: $dark-text-color;
diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js
new file mode 100644
index 0000000000..7b879acb4b
--- /dev/null
+++ b/app/javascript/mastodon/actions/pleroma.js
@@ -0,0 +1,107 @@
+import api from '../api';
+
+export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST';
+export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS';
+export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL';
+export const PANEL_FETCH_REQUEST = 'PANEL_FETCH_REQUEST';
+export const PANEL_FETCH_SUCCESS = 'PANEL_FETCH_SUCCESS';
+export const PANEL_FETCH_FAIL = 'PANEL_FETCH_FAIL';
+export const PLEROMA_CONFIG_FETCH_REQUEST = 'PLEROMA_CONFIG_FETCH_REQUEST';
+export const PLEROMA_CONFIG_FETCH_SUCCESS = 'PLEROMA_CONFIG_FETCH_SUCCESS';
+export const PLEROMA_CONFIG_FETCH_FAIL = 'PLEROMA_CONFIG_FETCH_FAIL';
+
+export function fetchTOS() {
+  return (dispatch, getState) => {
+    dispatch(fetchTOSRequest());
+
+    api(getState).get('/static/terms-of-service.html').then(response => {
+      dispatch(fetchTOSSuccess(response.data));
+    }).catch(error => {
+      dispatch(fetchTOSFail(error));
+    });
+  };
+};
+
+export function fetchPanel() {
+  return (dispatch, getState) => {
+    dispatch(fetchPanelRequest());
+
+    api(getState).get('/instance/panel.html').then(response => {
+      dispatch(fetchPanelSuccess(response.data));
+    }).catch(error => {
+      dispatch(fetchPanelFail(error));
+    });
+  };
+};
+
+export function fetchPleromaConfig() {
+  return (dispatch, getState) => {
+    dispatch(fetchPleromaConfigRequest());
+
+    api(getState).get('/static/config.json').then(response => {
+      dispatch(fetchPleromaConfigSuccess(response.data));
+    }).catch(error => {
+      dispatch(fetchPleromaConfigFail(error));
+    });
+  };
+};
+
+export function fetchTOSRequest() {
+  return {
+    type: TOS_FETCH_REQUEST,
+  };
+};
+
+export function fetchTOSSuccess(tos) {
+  return {
+    type: TOS_FETCH_SUCCESS,
+    tos,
+  };
+};
+
+export function fetchTOSFail(error) {
+  return {
+    type: TOS_FETCH_FAIL,
+    error,
+  };
+};
+
+export function fetchPanelRequest() {
+  return {
+    type: PANEL_FETCH_REQUEST,
+  };
+};
+
+export function fetchPanelSuccess(panel) {
+  return {
+    type: PANEL_FETCH_SUCCESS,
+    panel,
+  };
+};
+
+export function fetchPanelFail(error) {
+  return {
+    type: PANEL_FETCH_FAIL,
+    error,
+  };
+};
+
+export function fetchPleromaConfigRequest() {
+  return {
+    type: PLEROMA_CONFIG_FETCH_REQUEST,
+  };
+};
+
+export function fetchPleromaConfigSuccess(config) {
+  return {
+    type: PLEROMA_CONFIG_FETCH_SUCCESS,
+    config,
+  };
+};
+
+export function fetchPleromaConfigFail(error) {
+  return {
+    type: PLEROMA_CONFIG_FETCH_FAIL,
+    error,
+  };
+};
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index e1f84de276..c05e5cb110 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -7,8 +7,9 @@ import { connect } from 'react-redux';
 import PropTypes from 'prop-types';
 import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me, invitesEnabled, version, profile_directory } from '../../initial_state';
+import { me, invitesEnabled, profile_directory } from '../../initial_state';
 import { fetchFollowRequests } from '../../actions/accounts';
+import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma';
 import { List as ImmutableList } from 'immutable';
 import { Link } from 'react-router-dom';
 import NavigationBar from '../compose/components/navigation_bar';
@@ -39,10 +40,14 @@ const messages = defineMessages({
 const mapStateToProps = state => ({
   myAccount: state.getIn(['accounts', me]),
   unreadFollowRequests: state.getIn(['user_lists', 'follow_requests', 'items'], ImmutableList()).size,
+  customPanelEnabled: state.getIn(['custom_panel', 'enabled']),
+  customPanel: state.getIn(['custom_panel', 'panel']),
 });
 
 const mapDispatchToProps = dispatch => ({
   fetchFollowRequests: () => dispatch(fetchFollowRequests()),
+  fetchPanel: () => dispatch(fetchPanel()),
+  fetchPleromaConfig: () => dispatch(fetchPleromaConfig()),
 });
 
 const badgeDisplay = (number, limit) => {
@@ -65,20 +70,27 @@ class GettingStarted extends ImmutablePureComponent {
     columns: ImmutablePropTypes.list,
     multiColumn: PropTypes.bool,
     fetchFollowRequests: PropTypes.func.isRequired,
+    fetchPanel: PropTypes.func.isRequired,
+    fetchPleromaConfig: PropTypes.func.isRequired,
     unreadFollowRequests: PropTypes.number,
     unreadNotifications: PropTypes.number,
+    customPanelEnabled: PropTypes.bool,
+    customPanel: PropTypes.string.isRequired,
   };
 
   componentDidMount () {
-    const { myAccount, fetchFollowRequests } = this.props;
+    const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props;
 
     if (myAccount.get('locked')) {
       fetchFollowRequests();
     }
+
+    fetchPleromaConfig();
+    fetchPanel();
   }
 
   render () {
-    const { intl, myAccount, multiColumn, unreadFollowRequests } = this.props;
+    const { intl, myAccount, multiColumn, unreadFollowRequests, customPanelEnabled, customPanel } = this.props;
 
     const navItems = [];
     let i = 1;
@@ -130,12 +142,25 @@ class GettingStarted extends ImmutablePureComponent {
     if (!multiColumn) {
       navItems.push(
         <ColumnSubheading key={i++} text={intl.formatMessage(messages.settings_subheading)} />,
-        <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/settings/preferences' />,
+        <ColumnLink key={i++} icon='gears' text={intl.formatMessage(messages.preferences)} href='/user-settings' />,
       );
 
       height += 34 + 48;
     }
 
+    const dot = ' • ';
+    const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{ __html: customPanel }} style={{ marginLeft: -12, marginRight: -12 }} /> : (
+      <p>
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a>
+        {dot}
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a>
+        {dot}
+        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a>
+        {dot}
+        <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a>
+      </p> )
+    );
+
     return (
       <Column label={intl.formatMessage(messages.menu)}>
         {multiColumn && <div className='column-header__wrapper'>
@@ -148,31 +173,36 @@ class GettingStarted extends ImmutablePureComponent {
         </div>}
 
         <div className='getting-started'>
-          <div className='getting-started__wrapper' style={{ height }}>
+          <div className='getting-started__wrapper scrollable' style={{ height }}>
             {!multiColumn && <NavigationBar account={myAccount} />}
             {navItems}
           </div>
 
           {!multiColumn && <div className='flex-spacer' />}
 
-          <div className='getting-started__footer'>
+          <div className='getting-started getting-started__panel scrollable'>
+            {staticContent}
+          </div>
+
+          {!multiColumn && <div className='flex-spacer' />}
+
+          <div className='getting-started__footer scrollable'>
             <ul>
               {invitesEnabled && <li><a href='/invites' target='_blank'><FormattedMessage id='getting_started.invite' defaultMessage='Invite people' /></a> · </li>}
               {multiColumn && <li><Link to='/keyboard-shortcuts'><FormattedMessage id='navigation_bar.keyboard_shortcuts' defaultMessage='Hotkeys' /></Link> · </li>}
-              <li><a href='/auth/edit'><FormattedMessage id='getting_started.security' defaultMessage='Security' /></a> · </li>
-              <li><a href='/about/more' target='_blank'><FormattedMessage id='navigation_bar.info' defaultMessage='About this server' /></a> · </li>
-              <li><a href='https://joinmastodon.org/apps' target='_blank'><FormattedMessage id='navigation_bar.apps' defaultMessage='Mobile apps' /></a> · </li>
-              <li><a href='/terms' target='_blank'><FormattedMessage id='getting_started.terms' defaultMessage='Terms of service' /></a> · </li>
-              <li><a href='/settings/applications' target='_blank'><FormattedMessage id='getting_started.developers' defaultMessage='Developers' /></a> · </li>
-              <li><a href='https://docs.joinmastodon.org' target='_blank'><FormattedMessage id='getting_started.documentation' defaultMessage='Documentation' /></a> · </li>
               <li><a href='/auth/sign_out' data-method='delete'><FormattedMessage id='navigation_bar.logout' defaultMessage='Logout' /></a></li>
             </ul>
 
             <p>
               <FormattedMessage
-                id='getting_started.open_source_notice'
-                defaultMessage='Mastodon is open source software. You can contribute or report issues on GitHub at {github}.'
-                values={{ github: <span><a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>tootsuite/mastodon</a> (v{version})</span> }}
+                id='getting_started.mastofe_notice'
+                defaultMessage='Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.'
+                values={{
+                  mastofe: <a href='https://git.pleroma.social/pleroma/mastofe' rel='noopener' target='_blank'>Mastofe</a>,
+                  glitchsoc: <a href='https://github.com/glitch-soc/mastodon' rel='noopener' target='_blank'>glitch-soc</a>,
+                  mastodon: <a href='https://github.com/tootsuite/mastodon' rel='noopener' target='_blank'>Mastodon</a>,
+                  pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a>,
+                }}
               />
             </p>
           </div>
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index c050188390..522d0c6932 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -141,6 +141,7 @@
   "getting_started.heading": "Getting started",
   "getting_started.invite": "Invite people",
   "getting_started.open_source_notice": "Mastodon is open source software. You can contribute or report issues on GitHub at {github}.",
+  "getting_started.mastofe_notice": "Mastofe is a libre distribution of the frontend from {glitchsoc}, a friendly fork of {mastodon}. You can contribute or report issues at {mastofe}.",
   "getting_started.security": "Security",
   "getting_started.terms": "Terms of service",
   "hashtag.column_header.tag_mode.all": "and {additional}",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index f88f29b110..ab53227539 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -137,6 +137,7 @@
   "getting_started.heading": "Pour commencer",
   "getting_started.invite": "Inviter des gens",
   "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer et envoyer vos commentaires et rapports de bogues via {github} sur GitHub.",
+  "getting_started.mastofe_notice": "Mastofe est une distribution libre du frontend {glitchsoc}, un fork amical de {mastodon}. Vous pouvez contribuer ou rapporter des bogues via {mastofe}.",
   "getting_started.security": "Sécurité",
   "getting_started.terms": "Conditions d’utilisation",
   "hashtag.column_header.tag_mode.all": "et {additional}",
diff --git a/app/javascript/mastodon/reducers/index.js b/app/javascript/mastodon/reducers/index.js
index 0f0de849f7..20bd5d5607 100644
--- a/app/javascript/mastodon/reducers/index.js
+++ b/app/javascript/mastodon/reducers/index.js
@@ -29,6 +29,7 @@ import listAdder from './list_adder';
 import filters from './filters';
 import conversations from './conversations';
 import suggestions from './suggestions';
+import { custom_panel } from './pleroma';
 
 const reducers = {
   dropdown_menu,
@@ -61,6 +62,7 @@ const reducers = {
   filters,
   conversations,
   suggestions,
+  custom_panel,
 };
 
 export default combineReducers(reducers);
diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js
new file mode 100644
index 0000000000..4cbf59b0bc
--- /dev/null
+++ b/app/javascript/mastodon/reducers/pleroma.js
@@ -0,0 +1,18 @@
+import { Map as ImmutableMap } from 'immutable';
+import { PANEL_FETCH_SUCCESS, PLEROMA_CONFIG_FETCH_SUCCESS } from '../actions/pleroma';
+
+const initialPanel = ImmutableMap({
+  enabled: false,
+  panel: '',
+});
+
+export function custom_panel(state = initialPanel, action) {
+  switch (action.type) {
+  case PANEL_FETCH_SUCCESS:
+    return state.set('panel', action.panel); break;
+  case PLEROMA_CONFIG_FETCH_SUCCESS:
+    return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false);
+  }
+
+  return state;
+};
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index d49ccd40b6..f761d38c9d 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1904,11 +1904,19 @@ a.account__display-name {
     margin-bottom: 0;
   }
 
-  .getting-started__wrapper,
   .getting-started__trends,
   .search {
     margin-bottom: 10px;
   }
+
+  .getting-started__panel {
+    margin: 10px 0;
+  }
+
+  .column,
+  .drawer {
+    min-width: 330px;
+  }
 }
 
 @media screen and (max-width: 630px) {
@@ -2326,10 +2334,6 @@ a.account__display-name {
   background: $ui-base-color;
 }
 
-.getting-started__wrapper {
-  flex: 0 0 auto;
-}
-
 .flex-spacer {
   flex: 1 1 auto;
 }
@@ -2337,11 +2341,21 @@ a.account__display-name {
 .getting-started {
   color: $dark-text-color;
   overflow: auto;
+  border-bottom-left-radius: 2px;
+  border-bottom-right-radius: 2px;
 
+  &__wrapper,
+  &__panel,
   &__footer {
-    flex: 0 0 auto;
+    height: min-content;
+  }
+
+  &__panel,
+  &__footer
+  {
     padding: 10px;
     padding-top: 20px;
+    flex-grow: 0;
 
     ul {
       margin-bottom: 10px;
@@ -2352,9 +2366,7 @@ a.account__display-name {
     }
 
     p {
-      color: $dark-text-color;
       font-size: 13px;
-      margin-bottom: 20px;
 
       a {
         color: $dark-text-color;
@@ -2374,6 +2386,12 @@ a.account__display-name {
     }
   }
 
+  &__wrapper,
+  &__footer
+  {
+    color: $dark-text-color;
+  }
+
   &__trends {
     background: $ui-base-color;
     flex: 0 1 auto;
-- 
GitLab


From 386ec146ea4e7c889e267108739933316d046ad3 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sat, 23 Jun 2018 16:42:30 +0200
Subject: [PATCH 163/192] app/javascript/mastodon/components/hashtag.js: Do not
 crash when hashtag.history is undefined

---
 app/javascript/flavours/glitch/components/hashtag.js | 2 +-
 app/javascript/mastodon/components/hashtag.js        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/hashtag.js b/app/javascript/flavours/glitch/components/hashtag.js
index d75edd9947..79fada42d7 100644
--- a/app/javascript/flavours/glitch/components/hashtag.js
+++ b/app/javascript/flavours/glitch/components/hashtag.js
@@ -20,7 +20,7 @@ const Hashtag = ({ hashtag }) => (
     </div>
 
     <div className='trends__item__sparkline'>
-      <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
+      <Sparklines width={50} height={28} data={hashtag.get('history') && hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
         <SparklinesCurve style={{ fill: 'none' }} />
       </Sparklines>
     </div>
diff --git a/app/javascript/mastodon/components/hashtag.js b/app/javascript/mastodon/components/hashtag.js
index f091d7893e..9e0506f606 100644
--- a/app/javascript/mastodon/components/hashtag.js
+++ b/app/javascript/mastodon/components/hashtag.js
@@ -20,7 +20,7 @@ const Hashtag = ({ hashtag }) => (
     </div>
 
     <div className='trends__item__sparkline'>
-      <Sparklines width={50} height={28} data={hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
+      <Sparklines width={50} height={28} data={hashtag.get('history') && hashtag.get('history').reverse().map(day => day.get('uses')).toArray()}>
         <SparklinesCurve style={{ fill: 'none' }} />
       </Sparklines>
     </div>
-- 
GitLab


From a04ac7446fddfd3ffd1dbd6432f37cfcc5c99b66 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 26 Jun 2018 15:24:16 +0200
Subject: [PATCH 164/192] app/javascript/styles/mastodon/components.scss: Fix
 notifications text color
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This is because pleroma doesn’t put a “<p></p>” everywhere in the statuses.

It was done previously in 68fd7ee6a435c3fdef82b2b92d9e8f6f550a61aa

Co-authored-by: Morgan Bazalgette <the@howl.moe>
---
 app/javascript/flavours/glitch/styles/components/status.scss | 1 +
 app/javascript/styles/mastodon/components.scss               | 1 +
 2 files changed, 2 insertions(+)

diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 9d2757065e..65d3ee2251 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -590,6 +590,7 @@
 }
 
 .muted {
+  .status__content,
   .status__content p,
   .status__content a {
     color: $dark-text-color;
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index f761d38c9d..d975af397d 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -1460,6 +1460,7 @@ a.account__display-name {
 }
 
 .muted {
+  .status__content,
   .status__content p,
   .status__content a {
     color: $dark-text-color;
-- 
GitLab


From 1593fa866d7c3efac56e1efcd6ab9afdb1d48da1 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 26 Jun 2018 15:47:12 +0200
Subject: [PATCH 165/192] Remove extra /settings/profile; Change
 /settings/{profile,preferences} to /user-settings

---
 .../mastodon/features/account/components/action_bar.js         | 3 +--
 app/javascript/mastodon/features/account/components/header.js  | 2 +-
 .../mastodon/features/compose/components/action_bar.js         | 3 +--
 .../mastodon/features/compose/components/navigation_bar.js     | 2 --
 .../mastodon/features/compose/containers/warning_container.js  | 2 +-
 app/javascript/mastodon/features/compose/index.js              | 2 +-
 6 files changed, 5 insertions(+), 9 deletions(-)

diff --git a/app/javascript/mastodon/features/account/components/action_bar.js b/app/javascript/mastodon/features/account/components/action_bar.js
index 8ed4c917ab..812f66e930 100644
--- a/app/javascript/mastodon/features/account/components/action_bar.js
+++ b/app/javascript/mastodon/features/account/components/action_bar.js
@@ -88,8 +88,7 @@ class ActionBar extends React.PureComponent {
     }
 
     if (account.get('id') === me) {
-      menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
-      menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
+      menu.push({ text: intl.formatMessage(messages.preferences), href: '/user-settings' });
       menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
       menu.push(null);
       menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 7fe6d6a4f8..8a137a0c06 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -88,7 +88,7 @@ class Header extends ImmutablePureComponent {
   };
 
   openEditProfile = () => {
-    window.open('/settings/profile', '_blank');
+    window.open('/user-settings', '_blank');
   }
 
   render () {
diff --git a/app/javascript/mastodon/features/compose/components/action_bar.js b/app/javascript/mastodon/features/compose/components/action_bar.js
index 95d6eeb06d..e8d23c6948 100644
--- a/app/javascript/mastodon/features/compose/components/action_bar.js
+++ b/app/javascript/mastodon/features/compose/components/action_bar.js
@@ -30,8 +30,7 @@ class ActionBar extends React.PureComponent {
 
     let menu = [];
 
-    menu.push({ text: intl.formatMessage(messages.edit_profile), href: '/settings/profile' });
-    menu.push({ text: intl.formatMessage(messages.preferences), href: '/settings/preferences' });
+    menu.push({ text: intl.formatMessage(messages.preferences), href: '/user-settings' });
     menu.push({ text: intl.formatMessage(messages.pins), to: '/pinned' });
     menu.push(null);
     menu.push({ text: intl.formatMessage(messages.follow_requests), to: '/follow_requests' });
diff --git a/app/javascript/mastodon/features/compose/components/navigation_bar.js b/app/javascript/mastodon/features/compose/components/navigation_bar.js
index 9910eb4f9f..f4b2932242 100644
--- a/app/javascript/mastodon/features/compose/components/navigation_bar.js
+++ b/app/javascript/mastodon/features/compose/components/navigation_bar.js
@@ -27,8 +27,6 @@ export default class NavigationBar extends ImmutablePureComponent {
           <Permalink href={this.props.account.get('url')} to={`/accounts/${this.props.account.get('id')}`}>
             <strong className='navigation-bar__profile-account'>@{this.props.account.get('acct')}</strong>
           </Permalink>
-
-          <a href='/settings/profile' className='navigation-bar__profile-edit'><FormattedMessage id='navigation_bar.edit_profile' defaultMessage='Edit profile' /></a>
         </div>
 
         <div className='navigation-bar__actions'>
diff --git a/app/javascript/mastodon/features/compose/containers/warning_container.js b/app/javascript/mastodon/features/compose/containers/warning_container.js
index 8200a319f7..41fd25a70b 100644
--- a/app/javascript/mastodon/features/compose/containers/warning_container.js
+++ b/app/javascript/mastodon/features/compose/containers/warning_container.js
@@ -15,7 +15,7 @@ const mapStateToProps = state => ({
 
 const WarningWrapper = ({ needsLockWarning, hashtagWarning, directMessageWarning }) => {
   if (needsLockWarning) {
-    return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/settings/profile'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />;
+    return <Warning message={<FormattedMessage id='compose_form.lock_disclaimer' defaultMessage='Your account is not {locked}. Anyone can follow you to view your follower-only posts.' values={{ locked: <a href='/user-settings'><FormattedMessage id='compose_form.lock_disclaimer.lock' defaultMessage='locked' /></a> }} />} />;
   }
 
   if (hashtagWarning) {
diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js
index fff329106d..b65d056cf7 100644
--- a/app/javascript/mastodon/features/compose/index.js
+++ b/app/javascript/mastodon/features/compose/index.js
@@ -91,7 +91,7 @@ class Compose extends React.PureComponent {
           {!columns.some(column => column.get('id') === 'PUBLIC') && (
             <Link to='/timelines/public' className='drawer__tab' title={intl.formatMessage(messages.public)} aria-label={intl.formatMessage(messages.public)}><Icon id='globe' fixedWidth /></Link>
           )}
-          <a href='/settings/preferences' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a>
+          <a href='/user-settings' className='drawer__tab' title={intl.formatMessage(messages.preferences)} aria-label={intl.formatMessage(messages.preferences)}><Icon id='cog' fixedWidth /></a>
           <a href='/auth/sign_out' className='drawer__tab' data-method='delete' title={intl.formatMessage(messages.logout)} aria-label={intl.formatMessage(messages.logout)}><Icon id='sign-out' fixedWidth /></a>
         </nav>
       );
-- 
GitLab


From c8f3a3bc9adb8909ae9c1d8a39851714a6121b22 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 26 Jun 2018 20:46:28 +0200
Subject: [PATCH 166/192] [mastofe] Adds deleting others notice if you have the
 rights(~moderator)

Closes: https://git.pleroma.social/pleroma/mastofe/issues/20
---
 .../flavours/glitch/components/status_action_bar.js          | 5 ++++-
 app/javascript/flavours/glitch/util/initial_state.js         | 3 +++
 app/javascript/mastodon/components/status_action_bar.js      | 5 ++++-
 app/javascript/mastodon/initial_state.js                     | 3 +++
 4 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index 1d3130604c..dda174f66f 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -5,7 +5,7 @@ import IconButton from './icon_button';
 import DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me, isStaff } from 'flavours/glitch/util/initial_state';
+import { me, isStaff, deleteOthersNotice } from 'flavours/glitch/util/initial_state';
 import RelativeTimestamp from './relative_timestamp';
 import { accountAdminLink, statusAdminLink } from 'flavours/glitch/util/backend_links';
 
@@ -242,6 +242,9 @@ export default class StatusActionBar extends ImmutablePureComponent {
           });
         }
       }
+      if ( deleteOthersNotice ) {
+        menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
+      }
     }
 
     if (status.get('in_reply_to_id', null) === null) {
diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js
index a3c65563c2..c34a818ff2 100644
--- a/app/javascript/flavours/glitch/util/initial_state.js
+++ b/app/javascript/flavours/glitch/util/initial_state.js
@@ -10,6 +10,7 @@ const initialState = element && function () {
 }();
 
 const getMeta = (prop) => initialState && initialState.meta && initialState.meta[prop];
+const getRight = (prop) => initialState && initialState.rights && initialState.rights[prop];
 
 export const reduceMotion = getMeta('reduce_motion');
 export const autoPlayGif = getMeta('auto_play_gif');
@@ -27,4 +28,6 @@ export const version = getMeta('version');
 export const mascot = getMeta('mascot');
 export const isStaff = getMeta('is_staff');
 
+export const deleteOthersNotice = getRight('delete_others_notice');
+
 export default initialState;
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 53d17d4180..77e7699d54 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -5,7 +5,7 @@ import IconButton from './icon_button';
 import DropdownMenuContainer from '../containers/dropdown_menu_container';
 import { defineMessages, injectIntl } from 'react-intl';
 import ImmutablePureComponent from 'react-immutable-pure-component';
-import { me, isStaff } from '../initial_state';
+import { me, deleteOthersNotice, isStaff } from '../initial_state';
 
 const messages = defineMessages({
   delete: { id: 'status.delete', defaultMessage: 'Delete' },
@@ -227,6 +227,9 @@ class StatusActionBar extends ImmutablePureComponent {
         menu.push({ text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }), href: `/admin/accounts/${status.getIn(['account', 'id'])}` });
         menu.push({ text: intl.formatMessage(messages.admin_status), href: `/admin/accounts/${status.getIn(['account', 'id'])}/statuses/${status.get('id')}` });
       }
+      if ( deleteOthersNotice ) {
+        menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
+      }
     }
 
     if (status.get('visibility') === 'direct') {
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 418659b918..670d31d940 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -2,6 +2,7 @@ const element = document.getElementById('initial-state');
 const initialState = element && JSON.parse(element.textContent);
 
 const getMeta = (prop) => initialState && initialState.meta && initialState.meta[prop];
+const getRight = (prop) => initialState && initialState.rights && initialState.rights[prop];
 
 export const reduceMotion = getMeta('reduce_motion');
 export const autoPlayGif = getMeta('auto_play_gif');
@@ -19,4 +20,6 @@ export const mascot = getMeta('mascot');
 export const profile_directory = getMeta('profile_directory');
 export const isStaff = getMeta('is_staff');
 
+export const deleteOthersNotice = getRight('delete_others_notice');
+
 export default initialState;
-- 
GitLab


From dc2f44d706c64fb89118f0d99b030dc30d277235 Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 17:03:44 +0200
Subject: [PATCH 167/192] Add GitLab CI config

---
 .gitlab-ci.yml | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)
 create mode 100644 .gitlab-ci.yml

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000..f7048a79bc
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,23 @@
+image: alpine:latest
+
+before_script:
+  - apk add yarn
+  - yarn global add node-gyp
+  - yarn install
+
+cache:
+  paths:
+          - node_modules
+
+test:
+  script:
+    - yarn run test:jest
+
+build:
+  script:
+    - yarn run build
+  artifacts:
+    paths:
+      - public/packs
+      - public/assets
+    expire_in: 1 week
-- 
GitLab


From 5795433a293bdd83f37a22c2da289990c78d8626 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 3 Jul 2018 14:16:27 +0200
Subject: [PATCH 168/192] Remove countableText to count all text

---
 .../mastodon/features/compose/components/compose_form.js | 5 ++---
 app/javascript/mastodon/features/compose/util/counter.js | 9 ---------
 2 files changed, 2 insertions(+), 12 deletions(-)
 delete mode 100644 app/javascript/mastodon/features/compose/util/counter.js

diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index 8909b39fd3..9ab95d2993 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -16,7 +16,6 @@ import WarningContainer from '../containers/warning_container';
 import { isMobile } from '../../../is_mobile';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { length } from 'stringz';
-import { countableText } from '../util/counter';
 import Icon from 'mastodon/components/icon';
 import { maxChars } from '../../../initial_state';
 
@@ -85,7 +84,7 @@ class ComposeForm extends ImmutablePureComponent {
 
     // Submit disabled:
     const { is_submitting, is_changing_upload, is_uploading, anyMedia } = this.props;
-    const fulltext = [this.props.spoiler_text, countableText(this.props.text)].join('');
+    const fulltext = [this.props.spoiler_text, this.props.text].join('');
 
     if (is_submitting || is_uploading || is_changing_upload || length(fulltext) > maxChars || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {
       return;
@@ -162,7 +161,7 @@ class ComposeForm extends ImmutablePureComponent {
   render () {
     const { intl, onPaste, showSearch, anyMedia } = this.props;
     const disabled = this.props.is_submitting;
-    const text     = [this.props.spoiler_text, countableText(this.props.text)].join('');
+    const text     = [this.props.spoiler_text, this.props.text].join('');
     const disabledButton = disabled || this.props.is_uploading || this.props.is_changing_upload || length(text) > maxChars || (text.length !== 0 && text.trim().length === 0 && !anyMedia);
     let publishText = '';
 
diff --git a/app/javascript/mastodon/features/compose/util/counter.js b/app/javascript/mastodon/features/compose/util/counter.js
deleted file mode 100644
index 700ba21635..0000000000
--- a/app/javascript/mastodon/features/compose/util/counter.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { urlRegex } from './url_regex';
-
-const urlPlaceholder = 'xxxxxxxxxxxxxxxxxxxxxxx';
-
-export function countableText(inputText) {
-  return inputText
-    .replace(urlRegex, urlPlaceholder)
-    .replace(/(^|[^\/\w])@(([a-z0-9_]+)@[a-z0-9\.\-]+[a-z0-9]+)/ig, '$1@$3');
-};
-- 
GitLab


From 5ad5c3bbd4b7f00544bd0344b15dba09bf7fd062 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Tue, 3 Jul 2018 14:00:32 +0200
Subject: [PATCH 169/192] Remove branded images and their usage

---
 .../flavours/glitch/actions/compose.js        |   6 ------
 .../flavours/glitch/features/drawer/index.js  |  15 +++------------
 .../images/elephant_ui_disappointed.svg       |   1 -
 .../glitch/images/elephant_ui_working.svg     |   1 -
 .../flavours/glitch/images/mbstobon-ui-0.png  | Bin 39646 -> 0 bytes
 .../flavours/glitch/images/mbstobon-ui-1.png  | Bin 43609 -> 0 bytes
 .../flavours/glitch/images/mbstobon-ui-2.png  | Bin 40376 -> 0 bytes
 .../flavours/glitch/images/mbstobon-ui-3.png  | Bin 32449 -> 0 bytes
 .../glitch/styles/components/drawer.scss      |  18 ------------------
 .../glitch/styles/components/index.scss       |   4 ----
 .../glitch/styles/components/modal.scss       |   1 -
 .../components/regeneration_indicator.scss    |   5 -----
 .../flavours/glitch/styles/modal.scss         |   1 -
 app/javascript/images/elephant-fren.png       | Bin 34530 -> 0 bytes
 .../images/elephant_ui_disappointed.svg       |   1 -
 .../images/elephant_ui_greeting.svg           |   1 -
 app/javascript/images/elephant_ui_plane.svg   |   1 -
 app/javascript/images/elephant_ui_working.svg |   1 -
 app/javascript/images/logo.svg                |   1 -
 app/javascript/images/logo_alt.svg            |   1 -
 app/javascript/images/logo_full.svg           |   1 -
 app/javascript/images/logo_transparent.svg    |   1 -
 app/javascript/images/preview.jpg             | Bin 292252 -> 0 bytes
 .../mastodon/features/compose/index.js        |   6 ------
 .../mastodon/features/introduction/index.js   |   3 +--
 .../styles/mastodon/components.scss           |   5 -----
 app/javascript/styles/mastodon/modal.scss     |   1 -
 27 files changed, 4 insertions(+), 71 deletions(-)
 delete mode 100644 app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg
 delete mode 100644 app/javascript/flavours/glitch/images/elephant_ui_working.svg
 delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-0.png
 delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-1.png
 delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-2.png
 delete mode 100644 app/javascript/flavours/glitch/images/mbstobon-ui-3.png
 delete mode 100644 app/javascript/images/elephant-fren.png
 delete mode 100644 app/javascript/images/elephant_ui_disappointed.svg
 delete mode 100644 app/javascript/images/elephant_ui_greeting.svg
 delete mode 100644 app/javascript/images/elephant_ui_plane.svg
 delete mode 100644 app/javascript/images/elephant_ui_working.svg
 delete mode 100644 app/javascript/images/logo.svg
 delete mode 100644 app/javascript/images/logo_alt.svg
 delete mode 100644 app/javascript/images/logo_full.svg
 delete mode 100644 app/javascript/images/logo_transparent.svg
 delete mode 100644 app/javascript/images/preview.jpg

diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 0dd1766bc7..a24316da21 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -66,12 +66,6 @@ export function changeCompose(text) {
   };
 };
 
-export function cycleElefriendCompose() {
-  return {
-    type: COMPOSE_CYCLE_ELEFRIEND,
-  };
-};
-
 export function replyCompose(status, router) {
   return (dispatch, getState) => {
     dispatch({
diff --git a/app/javascript/flavours/glitch/features/drawer/index.js b/app/javascript/flavours/glitch/features/drawer/index.js
index c8121b8e55..c1a88187df 100644
--- a/app/javascript/flavours/glitch/features/drawer/index.js
+++ b/app/javascript/flavours/glitch/features/drawer/index.js
@@ -13,7 +13,6 @@ import {
   showSearch,
   submitSearch,
 } from 'flavours/glitch/actions/search';
-import { cycleElefriendCompose } from 'flavours/glitch/actions/compose';
 
 //  Components.
 import Composer from 'flavours/glitch/features/composer';
@@ -35,7 +34,6 @@ const messages = defineMessages({
 const mapStateToProps = state => ({
   account: state.getIn(['accounts', me]),
   columns: state.getIn(['settings', 'columns']),
-  elefriend: state.getIn(['compose', 'elefriend']),
   results: state.getIn(['search', 'results']),
   searchHidden: state.getIn(['search', 'hidden']),
   searchValue: state.getIn(['search', 'value']),
@@ -52,9 +50,6 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
   onClear () {
     dispatch(clearSearch());
   },
-  onClickElefriend () {
-    dispatch(cycleElefriendCompose());
-  },
   onShow () {
     dispatch(showSearch());
   },
@@ -81,12 +76,10 @@ class Drawer extends React.Component {
     const {
       account,
       columns,
-      elefriend,
       intl,
       multiColumn,
       onChange,
       onClear,
-      onClickElefriend,
       onOpenSettings,
       onShow,
       onSubmit,
@@ -98,7 +91,7 @@ class Drawer extends React.Component {
       unreadNotifications,
       showNotificationsBadge,
     } = this.props;
-    const computedClass = classNames('drawer', `mbstobon-${elefriend}`);
+    const computedClass = classNames('drawer', 'mbstobon');
 
     //  The result.
     return (
@@ -125,9 +118,9 @@ class Drawer extends React.Component {
           {!isSearchPage && <div className='drawer__inner'>
             <DrawerAccount account={account} />
             <Composer />
-            {multiColumn && (
+            {multiColumn && mascot && (
               <div className='drawer__inner__mastodon'>
-                {mascot ? <img alt='' draggable='false' src={mascot} /> : <button className='mastodon' onClick={onClickElefriend} />}
+                <img alt='' draggable='false' src={mascot} />
               </div>
             )}
           </div>}
@@ -154,7 +147,6 @@ Drawer.propTypes = {
   account: ImmutablePropTypes.map,
   columns: ImmutablePropTypes.list,
   results: ImmutablePropTypes.map,
-  elefriend: PropTypes.number,
   searchHidden: PropTypes.bool,
   searchValue: PropTypes.string,
   submitted: PropTypes.bool,
@@ -164,7 +156,6 @@ Drawer.propTypes = {
   //  Dispatch props.
   onChange: PropTypes.func,
   onClear: PropTypes.func,
-  onClickElefriend: PropTypes.func,
   onShow: PropTypes.func,
   onSubmit: PropTypes.func,
   onOpenSettings: PropTypes.func,
diff --git a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg b/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg
deleted file mode 100644
index 580c15a138..0000000000
--- a/app/javascript/flavours/glitch/images/elephant_ui_disappointed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg>
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/images/elephant_ui_working.svg b/app/javascript/flavours/glitch/images/elephant_ui_working.svg
deleted file mode 100644
index 8ba475db0a..0000000000
--- a/app/javascript/flavours/glitch/images/elephant_ui_working.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg>
\ No newline at end of file
diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-0.png b/app/javascript/flavours/glitch/images/mbstobon-ui-0.png
deleted file mode 100644
index 25e1707c9932ea9091d2d794f3ca78b7f6b45978..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 39646
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

diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-1.png b/app/javascript/flavours/glitch/images/mbstobon-ui-1.png
deleted file mode 100644
index 64cf3cbf322e9a636e9fcbefa1fbe0786e27172e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 43609
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
BhnD~V

diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-2.png b/app/javascript/flavours/glitch/images/mbstobon-ui-2.png
deleted file mode 100644
index b767a9122a05a7154fb0c6d1cd3bf9dc81627e23..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 40376
zcmb4pRaYEL)9noI?(XjH8r&hcySw|~5(rLkcY?bQ?(XgooZuEX&-ea=bJ1P<s=HS0
z-My;2Dn?aV1{r|>0RR9X%gKII2LOQb|KSTbnEz%}lHIre47`i1uKRx$_`jh-J+$&4
zpz`~!<00v0Y3kwZ1^~cix+{*W$ZNVNGRiTlyC^9rD6!DP0L1-ZX6*d1hXH_G0l9DD
z-+eYNbG>~GhL^uYIla5I^fV_Mw~j*l%kaZ&%e>*JZ)p;ben}+rMkI#gN+7~V6Ua(P
zU_j8PhGWRXal`lEhBdG+k7!<}GwU1bId*XNiCWcqE&p(=|C@KZZe6n7<L!Nu`#M9v
z>yC0nMaw@fr|g!TlJoxqFLMr#Sj3gx8o7sIv48>>{JC9B`~_40EoAl$a0)pKw1#W~
z$s^`Dg3gcs@vp00JN(}kH59L6?xJ<8fcp^3rv?HYR0lv7h-*(zY?)ulL$C?+|GaR(
z<_`d^R$msgzQXCib=!|(gXOE^{m8N)XLF=8Q*tin1V$Il_r?N25+>O7fHem-C&UsM
zA4DI>7qm4Sajs10Jbu75(DFauwiRs2m;Ryf5yR<V+1G<Q&@!y&o#5v>Jw@DG1G_Ez
zJ?Q70`Z>!3Pe2^B{Oi3`P#?gTD(LY`&*MT(0%fPLQC@SR6v7a{f|ZR`1*U~%-Nfz4
zMi`$(yNa8Qgl(jfu@_nQWXOq}Ba4d(Ij|_(JQ1?&eKQmZjPljz=k*r(YN&bFvc#$$
zS9L?{li*Xw(TWVa3S%HDrimU@^HK8xk?IK*t-fJ)0N{lPAVT%3!!rjb>x?(U@41rE
zSmwuEzg4sjp?G9nxh%iD0zKD)BXkOR19`y&qVd*?=Y&n=A0JO2XWCOMzzaz~C8z9r
zr5JBPP4pvtV8p{ckU;d#LVAxPr*~MFp(6uwnej>gU{3C_c03a>KX+#S=8x;M!qEDI
zS-E`u08bNz&OJFLS2_qa2U0dE;l-5m14Yz6bCBriggTD))||`;(oQ6LxZoGCTCA?E
z(@a0TCA*c;-G%JDN8zz3kOk^Quf+v<F6nWnhD-(Gt92*j^+CC6_J1riDX_=+L9Sdw
zposwIKX)&G2^;6@T5%6$s$?a^G(qXaNHUA_6xmY7yrY-kLe1S14@E)rVCa-G$1j-W
zpa9XyY-&D%Ewjy1^-5ar24>SwzFOQ4BqTl}Fx@8XK0DR~RPJK`>B1p12jTTuTo(=~
zBU(MwBr~5NcMgoXd}>QdXhge&RHO@_o>PN7N8aO}BQ@zxu7(<F+EZ2NgxTu)s8ecf
zgbE-SKq!Kbc8UybLDNM^Dph?T#|nZ=t2VKKjr-2#hW3jbJ^(VskZae>`GXTW=YL{v
zwRy#YApaJ#x31)Z<@@vs*n@o`tf(VMbz?*A3rw)KSLjSPbZG)D7s8BJ!x@R+lZX0o
zRfilo>~Z7%(?aOkia544H}F5AxO!-q>baR;L)P*C=w&(-h2bN};o@^l)J9CAR=q_Z
zvKlP%23rRf%Pn(*Zc44siQkk@|2w$&>52d+*r$SMxX1AR@BKd5c)R9-xquJvi@-OB
zckw#YJCAhzI7RQKKL0TS|66;lK*RlkGC$d6$ZT#qVpUe8L>}|GHl^$rHP}SeL`8`z
zbV<`J*crsVnMl3t7^)`lj=4z7#{HE~LFWHtu5$o+4R)F88lwl7f=FXdjNz0yS&0yZ
zdWZw=xibKZli==k)q4W2Uf8ozFoo)0hnnVlwryn2PIvJ|Eh$5IX3~L$j(R`zC9XjN
z%a0bFlx`GE@w(BWe7FB&FhJT8iAJyillu#jD5a;&f?nu5Z2s=g;E3|H8A{1H#kz<G
zLYT>it_-|4ia3eNH%%?!#|9M4Kf#07$T#|F910?U0q_x#>NTHy3)!K`EH>WQxXH;B
zHP~}q<r?M#eeCoeJQ$s!+2F;ci`b3Q9S=Y45P+L51U>FskZwkyEL?NCgA@O3Fc5lb
zrt^iv<WGpAt1^P04LNbO>cBAalEDxn6z8t5yI3&4v#J+I*%@Z=X|F6Kg^o}g_J-J>
zgoD)iyBPD|Z9YGECqJI_gJq;e05=8Up&=?o#Y{(nv?x<XEA*J5KzYy&7pG0EafGgJ
zTBTp9sb;!o&@o;xGu14v&@d#_h$W;AzU+64YE-3ZJ(lEe#~JbA8Rk-#q4!$}Xuz?T
z=v8dV6y(#jd@+~5OBPbiX#X5JH-5eeSY&q_^N-pvtW@y_)Y1I9(Cd`U$3<}qQ-;Rq
zmIY>QZ1LR0pAsPOkV_FF2uRg!tcy6+fc7p_#wUwH*Ct92{6xiDo^DwnX3}iyTf|`#
zZLa<GmJ`$Ku18tkFZu~@d<(=nk(89<6;sS8gjHtvk+L#*2oUE-%JCqp=-jt(=9(~B
z`BGl-|Im^dgDrYOZ&fH>V~LN&iZcLG{xTE#rNBJW0*R7<w$}%T19YaLzCJCk7?Snb
z4Jk7u>mjYs6)Qd;q*5`L@9KlvijaG7*fzR(Q-({0(1>~Suy?b@9Q(dPx-QqTUXa<G
zy(bYz7~oEt-_#ZOW#*MSW~2<03W)2%*2+PKg9^VZ<O0;TB_oiLH=?on3%0`1{VQOK
zSNG$R4_+bE&|RE|<eN=%GW?T^xT?<Xi9lid-rbz>XKg%JiT9UW=nU-9kJ2OFC3MaB
zBf)I=3jz7c;y4=Vq>_P<q>WM81b1Bq@fR>XEIaV7T*3$&D~<|(^0dPHA6>o~u%(&$
zSIRlxI-ar7FU0#EPgYRn)k-7Q3+F9v>mb!#?vf0>!v0Xt-q1gCF8D<rR+F+aJBXDK
zBO4BPT@)vKmD>lvJ+UH#_R~lQtBb*kP({=I-f<32r@3=u*WjzlK%ER^bOYL(Ak-58
zon22i4ryCx&hh=x#ofl^9!c5GuMFhh641F~youBuKZs$1oF$+LV@`>J%tr<Ir34!2
zcZKdWBA~Qw0(l1IOsjpD#OF$gc#4U$$&ba%kNrb8BKI0iLrg(0heRjwH;a=r-yik2
zu2iy&teg_jT281It_SR&_GSFVz|fP;3<}CkV%2L0VfQDf85mCrA#MT)aXu}JG7ntW
zv)^+R_F_FhD<N)wc5I`lnzk%bDCW4BllrTWk2Li$js)L-SDxG=r}m-wFexcF`)&m3
zO^V{L(`NdD`H#hOg{ro}-7c5dzDA#J{fGW|n87Se0+7008UNApc<EQX8K=3<C>4*o
z6y$5}cy!Im$4xyaFMM-iNrblUU{7j&B3FI#@!WwVt5UxmodL?cW};2&_eT^L-jE<d
z(~i?Rfccf)yU3=kTv4u6F%rNS$O1WH$#W~TH;Na<xgC(+xw$JJ;sp7K^5?xja0w5G
zUC>hmilh;f8zKOoj#5K?u6p)dscB;t&g4ATQZH@bnspGi3n&p6*;jWR;nb@+JUk@4
zGdz@~t%v4N-#b7h9C${8_r~mjtAA>aPjkmLaiESJiKr)bbN1t3%m7-{_0Z6O;AO`w
zpjQ@AifQ=!o{m%D7Gg-N{<hbSKa<@gWoq75=0;GtutitNuS+H|eqv0^>XPbw12Pd>
zv~ufp?v()^Ocn3k@Evyn`0G)yW1`;}psW@1jl7Fqd6>#}4w<frRIVCc=pQ~{boQ+o
zqg?z^bnlK0f`K)Zd(~O#>ediZgw(WRmyo&pj}uHsIr>{;+*AEB$|Muq&$jF@s`ube
zHgG+wZi3uq014(M?O{uiDO=R2Zsh$8c?qJ)yu}N1*{!RafA72CkFy@eGNjmgoah3)
ze!Kz;=A#a{QE|FMnR(`sJ*#4F)Z}$>5-6IycHCQgx_=zEjC*}9J_I}YKtxuM=3;>e
z{O}L)Pt2{a1^jL-uTWSv@zP4KyQ|Bk;wvq|NAb%^7hO29qr#a^FS@bCQ22A^7SuyQ
zF2MS?GGfP8=)-CBy68yQaBMA1BFisQ+vhL&cM@wtqsU#LwiU3bnQWW6pkv~*`Pipq
zGEGcm`ek+Z+dGHPJKCbap>DN_({p1JpmddENd{e>Bus-1C{Llvgk_rL8eNpwY%h*r
zqbO+(+stjJeo=GKhGvV=@Eym*NdSOZ`ObVx%6F$y@5g)Z$_N^;1y_<0fPJSa4%|<O
ze*Uww1f#Mc=NoPHw~W^W8ubVRPLTMH;9Q`@c07)ddk&ITZT<!-&g{Y<Cf7VDN{sWQ
z2#Y=FYP2KaIdTuOKe5kziV|t~DjZuW(x~g7RIY<%5LQ|(Z+Gs#Y1f1cz^1G0JwkV}
ziv$X*Wm4@Rv2Iz+JxOwy<`NI)t;vDh!dqfc8R#S~pOKd;)B}963h<%rIO-AENTlGn
z=xU-NnI$ypupZ%cTIEs<%1mkznF+XR$s^k{)FJ$UROR3tswue)_#g-Hn#e}OjRMFB
z;+h%!ufBQtB?*Cjs{I-1=XJdaeQQ6z=+)VIA4*;~-p^#X1y~W#O+0HroGJTMYt<se
z51j2qlRyizJrcYV)3G1aD{Z_RS!3o+pDa5g8~cFdst9ae@WQ64xPmtUbra-m65D>U
z0KAe~bOM)W1det{#&8)u?EYqT{17r5uPsA=pSfcTac$I)H5MJE1<@Kw@d`hF&SnvX
zn%^Ceo>-6uxjzH)5syNWy`mU|hX7lMZ4-|{vr1OVrG&6zH+&G!GCj#Xr7>3lT!p3<
zw|7~bTN`0Xz}kl?I9cM7f184E+Z5YG>&k|~8Hgri7uI%|2WiDYesvHd(GBxJ?W%Zo
z;z;h_-=_4K<f57HoP=m{2ZTt&tS(NX5+M^=oF2&{{-nJ6n0mM19-^Z0IN%;}Y?fBa
zJ%#rnN&b~&hRzre&*W(m0;xc~^j6SAlmm~JflxH@fs~1=)<=I&SQo)QY0H0Zp@$mL
zwy}qUbXA^4+&(^I4WJ8K5#_{}ydyE^Zo2${i3z+Lg<#n>tP0JHvO5;#I!24r&+Zq;
zgtpXik`J3Bh>+OC`>BqgZI_j5W~km&AU@wJHb__t58*4GUwIWL_~5EeAy?y1P&E!)
z&D}l!nkPMHdOuu7E!KlHZcp~N?3JZuMZ$UVl}_~EnIFg4dkCC_+AF1w`=V;Pb}v74
zTf?IpN;YVeJp_Byt{{btT|tPzQd_&CP%YU3go;tW)WUa$cW#mU!Rfgrl~O@{<{WB6
z*xQJb)3B!q#g84JQP_<~^I}p3sks0S?1lIWP<<A=V#rDt9Y~?I|BQx@aSp@j;wL>O
z3uzb#Js`m=_wr%ua)Z4UM81=xW_|3D*bxEJo{7$plA&GYtaMI>YRZDsIu~oGYSdCs
z!4>K{+?YGe0AXAkv;q@~dfXr^+qqba@Aa-6Q^d5U#i803g{IJzRu%CkYiIAkHi*@1
zj*qV&4O&Y)FjNiPC#q>Zy@YE;*TF@kb06Qu)FH}45Fn$;ay}0WiAZMd40~ZO`yz}_
zfrmAP=;!Btg=#-R8-VN!@BOPITc&;4l?tYuRI6ATs`hm0vs8lwx-L}RUL0xuXm-mN
z+AF1IJ50;hIyM~6{PGQ%hMs*CvJ`N2!F9wd;y#JVvYT1L%Zotem0;{Y{AIcb=ut>!
zJ}sx1uMt=S+WjcbftTkuyNSQ?lT6CU1*!9NSALoj#c2|y;tIHhT($OzoY>316+4)8
zs%-oahODO7WEtOcZn3JEK+2?%>Oghd2(iUIyOUD#mhsMZ^&5y`V%0xUp-@L(xC5t>
zE-h+^*B?+^t>h|@qGi9=)@^<ce8b-WkwPSpi!i(W(ej4>u1h)w1p?RJ{*|~t+GEuS
z$*tant|izg_bycXgwpCodZf3>_-5#jjhM`CmpZAZr&CU-Q+-~Mc2SAzNc9h60K4LV
zUeygfHC`$`3=i6k392ec#$hTq73+7QBEkf{85Sr0pa+ebBKGvrz42aV-tOcAU5a<I
zpC^msv)Ap`fLrYz5)SJZ#aU$0tdYR57fLF6R|2us>3M-WsZdcSD<To3MXYi<L|c?e
z-yy2Xn+%DhG`zYll6(#N+*$c|+xYY<L{;g9EUefTc~1YrqBC73vh9BIlwV1~I(SO_
z@~`u@QUvjC*b5O>HNKp{DiJ%tqD$Do(~oY19LT@ax7jr&q0W|H`Bq#s&hE+AetWs#
zV~KhzM6PxT`?}V|Gs0V2;4wc~2}BCStOJ#5BRyjIuDs>gq1WO5wMo4(Iq3gS6RiV8
z(D%bPI!B+GX>lb+L@Hr%^Vj!DsS8I5QP=`yYL@gzI=Jk;=wBt8;k3-<J`TjxuhgmI
zVRWbR(tokcU!gUbERm8SVw0xoarA6ijW4Y|LV6xODmLfu^J#rgg-&K8^1Y#aiVX^9
zY(T7LcS~cyV_Nc8u%e>h-dMj~0>&ZnF7Dc>9sf?zy*x@uO-%cI-owzDhTz1LDC0f4
zUM944Kq?GU8jNFLs@?)Lo#xUDHFj23>Oqaa7^`<BQfcO2e)AnVv93ffp!Plk<ba;!
zy_4pYZslG-RWl99hd>XDs}DNf7=%pNDpcR38M08$Eehpy>7`2WLgSK;Ht4nyHE#g>
zA*%RLgYN_EXKiq75EYMKzqb{&^|mEP*o*aRH{**`M66#!RmhJTj>3~aw)-K;thx$w
z!(d*}S7(wLsRW@%JeY>|so_$5Be5<Q9UGWrPSvYMHVMXu-<OZpl+Z;Q5s2(!hyNw_
zUy5#Z=Zib8?*BuN`8Ev*s{>-f18)TrkoDh~{7a*9cHS#K-GB2<9)*)EaGdkF&q;8*
zuuWVHDP|MT46?Qay1<oLE+Spb|J(>`)Uf3;Q~+2;F(4AC6SNWMuw^1JTi9kmG+%3p
z)7cA46LJQtKx>f#?CpqoN~xIbv0h&Z==-ssF8CTbfwBO9-X(Q4z-%D?1`eQZKkNhR
zh!l_(909)@`HR;{-`q-eqa=Q1(Q26*72y;3@nc__hr4uxj;d5w%(HBc2q7oNq%`6e
z^BP?wRK_A(3lPeNqG``sxo>p}t1j1ZJBgH1h|Iw@V)zV8VYnrLDc_8|UcR3Oo*Ci*
zq8YUW^*itn2U>AIKI#nKZ9F|04~yLT3-@=dDU&#&XeXBORI0o4^7v5~j|=vYe9Yg1
z_GG(3eErilEaZ<}JR+SKwYF@8(a8t{j)AMQ6ToAhznLmP<>uN$qvEiLjDk^HEpsBd
zRfGVepC(a;L-hWQk6zLsQ{d=dI~5u6QY>O;@pgm<8&2Kn_2vkLW%K?sWwPaFtF&GU
z=Jgt}247OyKH9Z<U4pwPb-1%VcP?A#g}*<wxTb^CRD;+@aj_cR<bm$vQL6(%aAo8!
zST5*9Z<r|@t<+-ep3TgT%8wYgo=9hPBLwmGZ9~%Y(tU5lw;CMSX%RdIS%KkJ*R&2_
zim<siO0&AB-s`R0r1m~?84D%cU|6;~WFwX0Q^W@fB|l22tib3e5PTlrjJ<4rs8CF7
zC=*c4No-yeC&0YWgex^ZVt$xy=kK2rV+$e`&OB6l6V#)`w<(`>&aQRphh)R2q)+B}
zy*(JLwppc}tpUMbVCPLFF`6dLnB0h84a6BcQebo~{<z07GZH)8<H84veZMk~P{r~m
z8i*HqYKaD6$#5k7v1++v2_q;30{u!^a0LXNu+Dzl4K~jYMS8+LIenLukpQig0A<Ev
z5<AC$jM~U!=Gfs`iAqpU0#G~j`-X*&y?La+MosG&$Tlx`#$KK6#&FM5?@}Y4?S|=P
z^<F=yrcJq7|M?IBOW#X*)Xw!3LS`fFAA4EV6s!bN+3188`Jgt?J46Hzje|6=11)e#
z4{6_$I$#TKwtU{1>^m~mZd4@HZ{<M@phEL{K^<<8e5j1%9@*_Lkn_>%7~_}Ve3Gg<
z%&{+<9!jKBP`IXMH5>LDW0Y%}AriZ3@#E|1WAjEHEKB4DwTq;Cb!RSV@K)%j{4UB0
zk!ldc#3k3B`wG(^w?QvpFEA%|d>g^4CbT(1Agl_Ak&13n)IujMPG({hw+>;4ewJ&v
zUo?+kP;*<#%{*>};i}Y&b%`EQfEuu1R#h*eV3~qb`i&7<FH28?;KCWIM(I0Iq3s2T
zpB0o69+;pyMs~t&8KNb=ao*QpI59oGO+|%Ka_FkX)y#HNXk}yX5b}oBego!|X?kQ3
z^H&NJz>^Mr<tfg-Ai?>T<Qd2fDIcxkppgMBgw%<JW*XD0(@!u6p->ZgVx^N3IZU=Q
zc$61p!qcL>sto8?_zXZ1db8mB!$Sw(FN;7|Zj0w}&vVga45O5?_jl3Mu_JTs@Jyok
z(zwxmyh-F$1)O^uz-%ywq_A1Q%)J{S+MbclpTC<Ka;L%3g9tig_sE}_pdnWzJ0VhJ
zkR%uGsyHS8t09h;?TLpcS3l<Lbv(b)e~c}-?4=$(Gl<+_FiC|F;f5t=j0iuNJej)x
zypq<~(LRx*c1Y$j2Q^+lo)f1c%g~JT0xE!%gIAXgZ~ZLi;+x1>v0imnGjybV^EVos
zC<+jHlMo>euAbuExEpQ#NfW#_fM^WNi8=A;Y9>Jch$VMRY#qL45NZ+$bC0*+WhdH-
z@{7PJChLxVb>Yj6$LsV$bHR*NS}q&OgpG9$!Hee1!ZQ6NiTwBDlsx#3B>ZXA>{A6~
zjQW@HxF1pl+#|EFRG&I(pKpa-et>qdgkGk-<}8H&LRy{j>=)B`ggespG0N={h022?
zIaoWVmLJ}c;6wcUvp%Td>x64Ud>qan*2|jFizoRhd>3{G(1xczVDZpWMqY^K6s->Z
z4$ApWPYf(3##7;h7DKb`SAAl4wrtD4-1D?`TQm*VZk#YeE^YKkR(4#t9^`=^)!Dgd
z;*!5N(hkW6`PPXIgakh8$BW(;#N;4K3MM<j{G<GFWu#`ZjA$P=8g~040~W1pyU}r~
zTXYGfCjas945a;ogeZoHsryNk*~+vTf%L<v7G4MQSayyTm_XSWGaHt74Ybe3F%KxO
zKAU2z1lM=Lrbp+a_d@ItAG6&#?@C<;FQ<Upu9$Od4X=H}-lb3bAz23viRai*w6xcB
z_kEAEO&o-wc=}l!75FqhLn%jfR=-MD@@CVsL4tdo%Pwt^%Tjxr+a5j@apD?+0Urpr
z4Dl<zkEDu~)kLZ&O45+l>sOPaTPawO#)IEyiE}N3yAl_|4}xfT2ZCH<N82wk=Hg1*
z%+!k(h546`D-8U*lj-ztmr6KJ);*+QsikObikd**Cy`VkY+%zOJrH(uA(a7MjKERY
z1(NbdLh!#_V_(a9L=lWe`4Cb}{J^I=v78b^Lu;T45~Sw`n9H%b(1cg;5(Rh~;79eh
z2Cg=X9c-V07Y(t49qL|#(~f*hqG<T1_5c>)u6<bUF84-R%HYw-+jHg~d*sS0s6bey
z0Jh@aAC+4(^5*H#J36fQI0g6u$xH%fW`r!Pp=`0*sH$bQ(w*Z|N)oHf-?aO7iZy?#
z_sfoNwUHTrh+o3Ib`6Aw#+^1ozSQHNe8R{k)e}B0{TCXWhQMJb75$o`@lP=K-c0C9
zK_T-{{3$Cb=_0s~G>$RM_GbYe+|wK<%-~jX;D<wTV422=u%54`;hi`%ve*WT5{WEA
zZl$Lajun!&E?P4XzLe~k;FmAhlm38+s#1AW)0(G5SjMF}u-{$?z3sY!XKwn|hti{4
zx*EDYidhE*TTK3{Ggl!Jm^hR;(g)*!kstCqxQ4#DcVJ%E+mAE!W^H$)9a>AJa(gnF
z&5<*JuL7$_h>vc3g0_4jyZENpqv<3OrTjwZLnyLp@wv0}jH>;W7>*d|uQdI#)pSOJ
zKcf#>bB@7NiA88=QyVprV6sBc&H}A6ydR6j#0cyuhaQuS)c?iox_50Y-t!GY!_w{7
ze{tDpdr?wEvswe`!Uv3QkhNyiE}*GkRG~KL6Yhr@(4-Awjr!c@2AwhIIS>Hw{9)(5
zcMJM#z|+RZ)WV0wQh4CSqo$^qez$W;yM#zJnQ}H|)auN2c7l0qVzE#LC5d#t&|!M<
zKHoM{BHud!vFI;&vw4sJe?R7B^k<i?6jSnfL%0r_)THGJPyc#{5H<!#>fuS=tB0@3
zddZ4>$l2632X#Uyie2eJ1+%qHC%|KqF6{E>rEPhPDU9}%q57V)8}II5in{b_%5u1U
z{4%-bWHWcJ5FiTYtlu0MLf9>r+a9_@snCZ!<0YF1RL-mV;3+ahxHbmUZhUB024Bz@
zW!zoBUj7#2A2az$ItVQiE<)gn?4>P&)V{TW2P|IVqO)kS3Sc-AHPGND@Ipn9pVL(p
zLX%yw3^5EAnaFb~uy{U2rt`-a_`?^<m4#ISk%|i*KPhOUcvmH|4bfOvuPeft?x9P1
zr7<F$k9-vlOf6&!4^_1gwfgKYFp}cjx@5cWS;)Z3*Ji?DylEkZrK0pgJaZSJV$-zR
zWKXkV1U+t$>DrC;X<))QEtW}VdHbNf#LjIc6kwy+oDoyy14)3_@{;eySeM?@_ThP2
z511#ljkUjPG5%pt<%hpPvzb!RObCOoa6Vwi`{<I;ki{Lbna0ANI@lxzdQIt;Ab0(D
zKa{nn9lXr`BF8y4u`%T`&+G{eUq09+kISr;kQc_-$&erwKZW!Zhq`fnl55WI%q3(p
zH$JrOSeI+*a>dLfcyd_9H$M8>%Ix!Ad<&D-Q_ufl%4R9$#4QUi?*;0tSoHAjoR()c
zoqsS2NOip(<>a-_r<>y5ox$f(wgPkH2HJWNC2mdY&GPCaUr+b)Kt)vAdWq6d4;SMi
z54LQ|6`$u-y{1M^OPn5)2ifO8y_s*@2PPOEvF~-SZe|qrD(mfRZ+2p4xH$-)o~<f}
zls|*AybJF%E22#fs(NA}t_KxV(Zp0GO2hxi>bQ_a`z_x4gZ)XP5_r(+M`rrm#N>hn
zw;J>jl7V5(=hCu2d9;jwjGQ9SP~M}2ZOg!y@nwzGZy<TxxaIVGSZXV2j3dDg!<c@f
z2rCvq)M;T}tP_|`;^I`Koi7@a$YRSQPWr21Wy69n?q@$>U)|xAJqu1<$P=0PmhC%-
z)GYQ5c~x@(QKzvOSVC+6yZnUUy`AtsQoV2b)D~k$1&Kcs;vuz7swm<c;d}^b{8E;h
zspH={<14M^X)!B_U+f7lUzbP!?rxq61vP2UPSAsw%J;%_Z-bD-jlzqHuXyIFsr<M6
zMMosod$0%;rpm4+KD~Dy2+j%PYnp%>qc-K(>>z<x%dtL^UhWAtjS{OL6YO19kEg4Y
zR@8WXZC0~z-^co2$Y7I==m;mI%~C<B-$un-5M@K%s3qVxHcI>DlIEF+9T1{ZBfr~L
zCJz9KUC@G%#eozEGjM1?DqBqSo5;v4ue~G`pRRtERu&9}$D3jY$Q(_!8&kIheoIn7
z@7&d^!td7glm4I0UAjX%{Q{9=l~WU91R*hHD$S?2$l8<%5X`5h0!)weuVS9K(51+H
z1vpwnD3t#_A2i6l_<E?CJZE~^O{IJP%ItkL?(=o&qy96wdK2w8Cv@X<N_^He;ehCM
z0hAVY@khoejv$JoqI0E)37clEMR8%)bkH}3ao0-4^Kclh8g{m_&g2P`lrW0bUN>TK
zMcx%tQ6)7mN~_}q6%#^Why09QcS-|9HL~bcWGX6`>s^w;uWhfR@?|5nBglg=s3!fC
zSL0be{DEby7S^e~keE_A9ML&KJWc<+=U<_QcdpFOdZuq`z-a}%NcOGImen2;vL?cC
zlFPjyMS$O4lPG)uaZt&=cNZiqB>Dl)T-vhGJtyo3TpbfI<KaSAi@IXK!us2rdav{2
zRC=Fz)l*U{&qPSZo76vff<=oecHUjTY=NDBwOhn9pNMh0`HE7|y3zE5!Z^1HLsYAZ
zmxwGq??y7(umN8i#rE9QD_lc|bMpWv!N{An7MFyYt`-D(CgoPMjzo)&duh+o>`BGq
zwE$%FtRy`ODrtWtIXJ|o$9MLmOco$%9iLi;75hYxdFEphJ)&a*WDVEh?|=x)<BVQD
z;{(WxhKX^LBkK&JFQ|GbgnahzpYT`0yKfA)lgb(ageAJyDBY?s)P%w{3n^Xf!}~BJ
z<Np<ein8(mpFKQ9lA1$jWRXK$VxL?6XfG=`0ZPMGpUZD5c}Nf{`)&xVy3bC^t*z2$
zk8ga<XeghYmdEAp2q=ehd@$JZY~RM_1FO=EHcTiZ;jW)h(rcHAc)f=;Ec2ZpHXQQ@
zNrv&Vnu5ZAH*9x62^ViE)BYCF<&mK!RS$hgBfq06gb=5KLYKj4K9VS(eB}uKQ9-i^
zPoDAEi=~Qsz~3GKU4q)Qsi3qdpFWA}b7Nr>_{upaf0UBEeWlJ?mh#U{4Z}$%&K5fW
zH+Ooyd;Pu-OuTursW?0;BLs?ZbHg30dx{!ltkK@HDhNx>mA#hkKX)CyO*mre1q~h<
z79NtN<fHL)J;Xm)@S>2_;JKwjVEXon{w1kcccB@S(;AcO%XR<+oc8Z5*9TW5;zhCP
z#Z95^=Qy>D0T1g|NacDo;rv$V3>BrtC1Hnn!>&uA8_|SY<T`7SvQwLw5L-&Q^P3>}
z+!Rk4b1zA%+1|K@ESi*Pa9^O{M%jBq=pv6VMk8ydqrM4raHG(alV={At%VN~eJV2B
z(nyYyJAMe%k2Kr5r2((~>}hL;UnVd+@YgkzTa?GeR-Ei_?wsg#>W8Y5pC5u=RM?g`
zTa6&W+j~RMG*x*~q{H_wZ)Ix9dhiD)*?T9eE`lWHoVFxwMiaxZ{c`^QU3>shLjG*|
z5lhlf_sE3+3e$K;%XG<P!4uv=(yBE-XiYEqGv@O^y0~^&WdcVY7n_HOVa(BY_*u{(
z#J~A=EPQ}Xp*1w__G1SXA2OOfL@)x6J!FuR_l3c;lf37fH9=wSFj>j5Xe^5uQ^`Lz
zOHgwcr@p<c`iK=(b_CnJ3lR}=Qae?0q>CQfSPCEdO%=aKK^&_4G?Y1h@(2{1XuXN<
zu=e)guX!8>TvW%G3*tznEhUDUr`k)`=?>k@q(Qa-LeV{p|EfBUf8am4K1QPUt%!e+
z&#gWP4cj0+x>f@%ZOA|J+2UBP@?(5H(fFt|l1BsPIN?ad-EsfAUNKdK%P5Bii@<QN
z?;auZogrs)(@AT1oM$NZhz%On5-j{eG;8GdiC^lZU9IuW$)-Iio7aMsR|Ae3AZal6
zvs+?4d6wMBM*X|T?jpaPC!D2r)a;b*RL5*YXPqo_0`iC#K@v2-@=8U9(RrZeT<V_}
z#!Edd=?2Kb{}h*PCP*>7r=ZkoS!(RS6o4)u9u2B3*^WrXso>GLqea8uW8rzE3Af_P
zmiCQL5^dCYgfkJM`e^TSlMkGGgZiim_O~sW*VHj-ne=e-%CZwC1pQS6fh7|^2t#>6
z9iy*tDLK(nsWIRP82?7<DV!yWKS}~@SM1M}3AaIggThdIkPutIt%w4WXZ*DfI3aJ`
zt%aT7+Sh3?zL@widdY-k`i@=DuBu_`Emy#UUb1#agX82n75}(;4+2}n;3QxlG7#Sd
z-dxJ%9A8|xn2Y9qY;s_^#Bi%-d+HqMWP<QOW8)YpusX$;8&NJv3(s6)={_>`)Sdtb
z3v1i>S<;Z+Qm%U**AdSoX&;lil7lngM}9?^8kSr};j7Az#TTpd{SYe(T^zbM0c>nt
zxB2PSoEDu*Z{Ra)-1KOjZZ<L2BW2w}lIAI_ZFauYo6b4dbrIqF@o$AX;P^9E;_rT>
z_p$$TJSQ|s-ZlGV>Uv}c5y@xud|j(jQ>YMJcQ<NqM$%CMDvqje7sZ#;++$=y1Gp23
zq`+S5TfW;JQeLG{&n?=EC*m01plsM8!imrm-~FjbmhcTuGO@_)xJ!te0FA=r<Qo>J
zxUnJ1uuLR+11rKb6@4c|N)_s2X96J{l|hAb$jS7cm&FdtH&V?e*i=;8Cvb!EflgT@
zd5oY9KMridn|UaY(O+14;C$Q&L}@zQS<+z%{T2=Ng8j@NI3kR1vK$gTXjp_v^H`sa
z^k`X7XR^4{QjjeKB=(SbEfZG%<tG5ULeD}?(%rI@(_f7z&k+75%1sXs1KOrqX?wWb
z!QD(Rx6gIx&LAIn#2?FexjoE>uIyjJPk1?jxLixlKW<tQTzQ~z`tdA@ilj2^_P&~H
zLE<u(We`yqA40Evg84VFT<lPiHp1uAU8_F%2}??m*6gz{a_prCy&2hZ`cSD@VK@0M
z6X<Np7NZUSAbtuIWVw!hrwm>8lJ*K-T5L+Jkzt+8nN(ufIOonLFcesrD1#|OACR)A
zy&&o#%?Da1=$s|7m`C1NYV_tZ?G{sVFcamV+_%Zxj*IxyevNa^M@Ud`Hf@m{@nxD*
zB1p@M`#@EgiT;i;c>#PXBlFgpK2dCGlJ0AU+y{wOYm$-<mqaZi1$6axaL&w|DGvFg
zc9q96f=G#B?lNuB_!2AwvUh>cwB){&wn0j<et9r6O?H0isZL7B8dge$%<J<Emyx;%
z9^nPIKg5pg`@-pgZ#T(nv?eshnvX4rpYH2?J5#!}`arrsuSEgOZ{xW0IiqwCIS6qu
z{j+QFjQoj=x9-$5#f<*HXCcOz5;Y(;O6A^S3A4%Kt(sice+wsap=xk%;ls#w*7p`*
zjuCXX@#8yaSmK*pwy<dFpP1i;FLP;XMc`!0`KIcE<nV_6&?R$BgcoE02)kwHX%q*$
zaOQwIEfWPMT5Ie|D!(cltBwRSC@SyI=DW@$yng0+2g(9>59mLCK_+qD{)lRq#%h4A
zz}#cEdExxnw{7onS2@q2Q(#-h`-O)v=(UAm53}kn5H%2ALyH#wb5NA)USC)8C=DxX
zGIKg|>D>xCZ)#={(Lvuf)u^(khk@+FqtN7;QZgEylP%svW@|o*=1e%N5j@?hq>55Q
z-(LnJ*FDd(w15yI?Qc0CxK84fa0rW-{%AuM+qBa=c<(Jxb|ul9a$I>P)ty|4ML=36
zWAuC{T9U#~s+%?wMltryF!}<Kk|tbHzBtvUK&`(U#wH)Rx24_`hNit|hd|7zX|+~b
zH%hZo3a2(WoE&mTC4nl&{Y?75k7R|shFWi77^4IKxIHZ{BC5@damkN#88%@UT}XrQ
zO5}OX&3CX-JMW+0kM)7$PGD0Pj-czqgMZ`!k)VY!RmGc*ykTKjpG(udT_dTmluMkv
z6!O^k87_#=CX<H*@^qVpsdsM#_Cl1hn$SiXBx8ZKRofh+n+(xf_*VMl+M#8Hc<CQ`
zYFE8-nd_OARobLB4a66WpcY-*Z(@34k{fIGX8@X&g;|PJ$4nl6bxR6J4o18ZO{fw{
zb=*eTqkV5|^K`**+DsmF0ObN(HS~_VX%i`mJ*ZJmwU5zZ4LO|@n%H$N9*^6HnWopC
zK~8Xcs>8g7<1J%eO}JzI=dPJ`j6-Y4J@jF)j^|3g&f}<c(oDDa_>cIL3!%YPejHFl
z@qT15xVUe04$XNmgL8yGC4Zg2t#5%0@xOkrna5I}n=eC+Wt=zhigxP=&?k5Pzf1FZ
zMV|(fZ^>QgE7n<%<NJ`MeSptXTfCM&!)!fVat&BX_aJWjiZT%h%z&OGCYC7(fkovI
z6j+`xJDi~wwHyNjg@3N-IBcBfspZ_UOiIa4DQnXNnm8b<w|K0&@zm>S7M+3`nm<&9
zHjbj&MQ8_F#h1VB&H$Zo$5`ZPVhW-X0x;3UgJ|-6D2z1y;hH!r=VU!l8;fAN+Z)7q
zbiAhZOYXzp$$4NOnk>Y^9aK_#S?2TR*%V!dmeqU%Q-&Pt$5#G?+_+Cyj!15_-rWSB
ze-pL`q78KB9r2e~XWMZn;|oGBSF-J_pz1hf-RusNP0N2&@ZCtF>%!CFk$t&%RebiT
zXN|lbx)Z6L7kc;CG%wDW25(9z*Z+0LJ>HKb@tqTgqoRZlxRwRjjD<?|nsfaoNoT`z
zQAD(X*apOum~kf4R1144E7UapIiXNcxHK9a@>hO72q+|M*VA<rQ`gs2x1cXUDUc?J
z-d;+mO8y0%Oa_htu}BD@tI|-^CfN{*<4$0$+{Q=2Kh_tbcp!7VnJkCw{R~yluUsH0
zx;cPA2d^SH;V&tMzi{jkC$HEtGL`j)!H0P_VLLY-w!OxcOGdJ74fkAmCc5E#{P{f`
zcZ{x>8BH&Y5({0(7k>9TCs*9I8%<tjzH$D0CojmnrG-S#<VZ$Q-hHnBHzU#Ydh&4P
zN+0y*m(s!1XIYRk407rj{<o9Cq#O988*APM++l%T>7c$C^U33i=7{E*Dr~XIx;f%y
zDo@yWG0s>jjD%eB=Bc7=>r(}LzujfwL=S)Q<I6)wvhp%~m&$u=e9@v`H8%0uxg6z}
z8YxU%H$Mbhi}b8zw@^7Eo7H^CsW;w)(qOQ;jVTQv&38l6F>KZmS1#>!Di*0yIc2k&
zLcK__TKg+-ba2BX7T!GKpZ<)d?tLXM(>V`8(Ka5n{_YFjT9){7kcBPNJlCcp8(SR1
zhb8O%hOp>??jOT4`B6viM##r2R)EiIn<2CqQU_U=aiFx0k`t-&&Px*#I6it@lpj7K
zyOv_Sc5}j3B4NlX`IdPwM7dQ(?uljaAy$hrmmUMShF7$lFw!7D@(vd(ihz7Wf=UZV
zJ3^#OBzwhIRZ6zo(BzKq%)(l>sS^Jlru=lz-t$Td%ea2hY8_g>UM~b)l0@<Iwxw{`
zs4Sr5_(wUzo2b2!e%Vn;YO8D{Wukf(j5!AY>k#c5Tue4hX1FX-D000BH1c7g3DITp
z=tcl(+Kg&k=ZYfp#D864Jw{;I={*)s%-&5)y{H%oDz=ckQMRD>pbGkYW_dNNqurVP
zkK(Vf{k#KN+*(sKzI?tY_b!oi<87c4u2+A5ycdOVRONe<?_S5-xE$Y@lW|vgwp0P<
zp-H%F^G`x9ouFnUqv<6`xeUnV6xG1A7>{EMKC#Lw5c+`-I^P`)T_6@YtHeD_*^v?V
zL6zOn@v>^JZ^gM?^K-BQ_rR~I@4ud&oyfC;YP^)nFMmv=!?=mSWO9)G@s78pN`C5S
z_BASH!c&liKXg$iV<e(_e|#A`00sqg|M334riCgcD*=Zstx&!Qc|mRG*S_qa36eKW
zMlB{sLr2<P+l|UD%5Hvc2pnRsBy#p19e2-k7A3doE)=rccKzqV);DX-G<o_`2X_8~
zGxeezL4~^yyJS1;eY)$GCX&SN%ww|Cf+wsfhu8RaIFi@4uK_*r7sDzTQy^gPlz{>M
z5`I2~oqsn_vBJqPYt=ONV_t%>k1AT7bRh8E=Zf5ogJ^NHuxCWYVwhgZ?}m;dZosso
zXUoxr{n8tHssq95iKkT}8>;Wu-2pHCLA2tPOmvvt;BqbeQOSntP`{(p8C0#}fvn}v
zdvlweq8SqBLPcm7Pw>N*vXt64dN0WeHDDQ1tBhXXh7(ry0DQP2&aBu44NT)uH!T($
zbR<I46MRPm?`fRVm$AW=2gfV5Cz$s){c8jCRJmWLr1LT7NMFFYk<Y!6Xz<4IB+<*Z
zyxt5ifn}wyFM4F8o@5*YOB0N5d0T1N9nB&BtFa>X_^t`U^%~haonKA**Z3F$^rCZ^
zbvsU=TxtuD_T)s(#Ux*b>v4-(2Dqy+=PEegh2(Ee@QueLG_-?3Vo*FLW{%)z0J9sY
z`^Vf-9|FXey`gCzED6OJtIvI{9ZE&*$<?{t(*;kfrZ(k<;iltUXwI%jzH2zdI^0s`
zSlcojwyP|)i<(UhdMCcji#VKy<d!ImIGPNUSY(KhL8#3!D7_5ROn#4IT{Fed$ufEm
zuRfuoWzTOR^$pO)%`osMS%MBF3@!tShQ94;x|2oUw;io+=mbOYe8ehl!i6xBwL)}~
zrX6*r9j|sHFc@KW1GhcXjLbsdE(m+Ew!7RXkcc_njhJT4ojLb7b<l$xC*TeP^12Ht
zG$~L8?@aJ`DIN<J<>q3VyT>LqujyR8;IGtPM|twC3Bn?aTM)`qB>Qf<tN2mYP<#>D
z8!L?xe~Op|ds+7`rbWucsp|9;OYx*)&<s(5B%S`dd?8UH)jX9eH{S$oBZkbY3%AXO
zEK%y=Ui-kefe2ePI+v@zWf~RyI|XUQ^`qV^)nHd8rFTOZ=r{~X@)*5ECN7&B8*f^C
z5oug3i8a5Gj~QC`rl71x@5eea6vP+uh}Qc(y$f&s1#GImL2D-CZnzgo0+cSCjK9F^
z`!wI;ueTSuP>q>E4*|Tj?R}L-9_AN-#+%c=ml*Cu*j}KE1W69ZUp<}HXPq(<Tob!s
zmXa!w50>Op{vZCBq*(nIW&9h)?k;WAgiSZn*Fp%I-#_ZNvbhRhG*)8Y3BLECEZc_m
zsH@aQDpUb25w;K<7j+Dp3=u^!EVmL^+A}0DYm+0lGNg*R9Px5~A7V$h3yaK>I3Mn>
zyXM{%+9b3Fs97%=B3lqS119K8IR$<~vX9n3^uP^(tk<R0kzMFDSlP2jITTqQS~7To
zf(MU)rU)Q^x0&)9W=CY(`iTW3FX~1z`PT~l&809(5|7@oFucg=UAD8uKn3|ktTL40
zVeqWjCfz8WNGT{PG#n&DJd-Q<^Dpem_ekYGf}_Q#N{t#?B+$Y9v2d(#?bZoIOOE8K
zZ(OwLTyDNDOFf@b2S|G|153%G$(h|?qB72u^_4|;M_lH6?kaID!i_ldz_^M2q=M!~
z9h*PLdL8ZRcqVFis^1C7q1DHOemYBGN--`Pak>XM*BrcK_G!Z2<JAjw&Gs^nWTBfz
zuaC7GKS4>o((iOv2b*e+k^-w1c{>DYBKIFv1L0Dh4+of^m~rcg=S*9_k-(DdTH^aA
zy}!Pat~9N-quVr<3S+Y6OxP(h)@JrN=cj4G@~&R6dd<G`{{GBfR}yhWUYs073Fr!#
zW*sflK85vlqt9XMF>dNYUDts_g$)@>0=y3hJ3};$pO0mvkOPkSew9o2%xa{Os*)e&
z)v^6G#)Q`di1e>ATz<O<8}$?(vr{F;!;&O#ruW{rsMKR|vX({!-GzB5opGFPAPD~>
zapq6f?JQiv>#fI9t$d%O5C)~<yuz#oQ<0Ig$~#WYjwPDEUj|GRtYv>}{rvSQGAZQ(
z&)K;3NNfJ`i`)d7rtzM&z2T~9ugxH@=xT<u-GZ3SiN<(OBB=jsFDhNAotM-I8BEzj
zqTf)aam+K)y>6x4Nb=KfPCMj<D+`KNA$Z2uc7(5=@h-mr4mU=+F}QALN`z}t73t_W
z@@uN@R)Wu8ujwGLo+~K_X+;L!I4(FP;QA$4oWH?zB5DdTX(h*_tfV9d^Bc9w4qBv(
z3bO+a&5ej}&pKFhAv7jCH?u~J-oa<|wxfyRqk<_;qjU3bt#>zl3Jkt+X*OEGWvH^f
z*E`-HG~H6U(nraYP1L(s6jX?FrhMTIq)(m|0cx_aO>%jwan{Dq-t#vnYO@*3v~6;|
z%VD_r*K|QIn|ej_0Uoh_5%;y{uU>G`7cL+u{3J0eDd$eXUOM60)xpc4tDYRu9*U4X
zXosIh`f0rFq<!ZodOKi0O@jwpqPRP;nP{=81GGw2RE7&?0{fJwp<Z`>Unm5LCYPn_
zDW+ZLAdSnwe}oF|33jucv)a$jc15|JS_7Z@oGPP@vL(JNR7Cbvoi+K){XVxlX<shM
zReXxOM(W~&v%Qcm!zdtv5^1h^wwbtt)1g)pC_!w85LQ35gSUk>u0p;lQ=5QZ1zt%a
z_8oHzbl<>j1yV0|c^FQitRYb}iQ^q>;AAfiov=0Ym33O!ypN2txcRnyv7)erQQerS
z7d#I%2lwEo;8b>bF>IMaica5v^^GHDgY60SZ+ewqe_s$B;qq@djneAjUO)DbY^`|`
zEUno?a~UT2zNT;uYhsb)d@>r{b6(Z&p+2a^%#Q`WWrb<tQ2C>tgL#+s|InhI7H(*#
zWOp=)!1@nDOx%OAbA<J81or}a4cuej7qZ&4KU3CD${#*j?f9EkqrGR@w{73)?Qy$!
z?hc9;S(@q9Ulc=jP+*f1$J)c>5oKiw937qG2gEhj4no!G@)fGx$l)g76MrID42g%c
z?_2GYeFFswKF`x-&TNM*kP(6?GEsXu=v>K&*!KPez&N?=@g{Z?Rh$Z6MBR4wKB^}h
zT~>%TfeHA2lri=D-kaLh>Pv)I>P&UPr1bE?RhkfAxUyq!>T$Nd($Zi~;eH-KxR`Ze
z5glS!LKxNDnZ7V`-)g<IELmO0nZIc8;|r+nJb3p${mDG9U4+<rAPe}%q4xe9yy&XN
z{dcpv%i{3i)ukG}apRzb%K>|p{h}5h<Ep?QM!DlpiS#h{St>=Lm|T=alf*0a0xVzh
zx6Gn#=PEf_AcG3VZPyFYuL2Lag9Er2%6{tbxZy@3p0GKxCYw|aq;F)RFr~`Uxc`2S
zE!Q7)R!8&XDqy@|(qxyT`rplZZJ8DwTI=T*Y1g@an+|%pHUg58hHVSsn$by?o27<|
zoJrb;EK?G;SFNOaOeIG;_9O+sV=~vYi0MKn^v{>8yO;?liMcwrXV}iJc|Qok4`ohA
z@7*^g!*JY874Fo7?)(FUU&{AZML#z4ut$U3SB4Y%Ue8yRUnA;nAG^?GGzW9+GS)Z$
z3{2&328C2@;J7T6*+?%$G)vI`N>xc=0IbrYEyzHK%E7At48x%DtjCT~WDKwgV8IeV
zFa{4>Bfb-Cs{+ueBE*o;5f9f4`d!1=t1YGXQ&$*Jb#5%9d;gr|1NjriMU@7JBUw`t
z$j4Vqi}r)b8OuzMB)rHF=5xWh-|)uaxB5}n%-_(*mf7x_XL9cx6tQ;=VY4XH#4L-)
zTN5+h;<YoBEVFT^+fmyS0IM#SpT+z^L-)6@<5A!>bHCm8>c;*CZO1#MJ@^#0zvQ#6
z-NS*digwa6|0O5D)c23dP;WTbyTQqoFPY_!^LJL}=-EJ_&*j6uVuq7|xSUFppBxQ0
z{1(!I+})avzwP(wnp>runRnT)MqOysUXq|n2hfv+GHnTxOsyF%c0KxmGPVJ7#km+5
zD{(Vzvba!0Biy<=Kag$ovZ-XD8?dn8ZtdX$^`OR7bXa=mF9eLi*F0DLn76`;1iR*V
zA{or(_l)l+#I$3WPUTO3f?W@uzlOb4_>vV~7zs1Ph8%v(3P^_pReaeV@RKv(n^Ovx
zL&^}uw|t7`hwD=$Vri3n-u!Wr>1ld4x*T=;2~@;i%q#Qy9qi~f54=49dNqio-)_h)
zoq*jk#9mQO0f#y-KJz>0aYxjMteKon*J;%&ibB5svL031dza?-L}Fqv45X|9*1^?=
zv37^ht^$Kw2-M^SV&o3T2CH+RaIm-~!J-fRvO1<Ji__`f&}M`JILv4na-tId(wMY#
zE|FTfC&Y9dL|%JQ>KHm3h2kwamqvweAE&$<Kk<G6m3|LH1&``|4*;alIl6j|#zc>@
z`&y`gF{8S{B5jw`?c1!B(;-lN9!d>zqk+FZ1zP?1bQ@L*VuptwSG0nO5eV8mp@hau
z&}Zk;eS){wp3CbrLI(3w>Rg&}b<S(mt$<dnCj7%9IMd&|=?-q`=oLM&(!zR7U+EY_
zs?5{xmUk2K4fxNfi~LriSIS@^>rw+6n&r0o{F7Pv+4QsVQ))E*DDenNWVVy=@~JY+
zdTc~%T@+)B>|GXyy<}6%Bx?AL_RiUo15)inIbvAKqAvGo_2{t<I|-+^ZBv1_5d~xd
zbe*r(TD7f*Evp;U!7QA=X*yWT3J$q5$_^~RZc%pJ4f~opK_-Z_Mn0l$C-$jC!EnGK
zrGeDgc4si=@7WbLXnW?J03@Yn2mKm#z&_<3II|`C<T0)BsFd!_MZ>s8<%}_cosf-u
z{D)P-W&O$j17<*(zgaQ|eM1IHB7BKwxv%wm72{hkT0v`Bo*UA>V-8(h7%L8rE)1AD
z=)Iy#rY?(P`zmH`x;7}KiqN_ZAvz2)+IO4s89p4sKok?A=?R3r?|)utAAiPV$~sI+
z>v+rupC3YD@cSStci_10Ruu29U3@d9)s~S`Oke7s151Iw!?)h;r^x8`C@yeAE8OtV
z3MRdA?f9#XTK0!R|D?}phLUk$XRpY|)<72LVFE78FzIO<w%%8sXxGE}fbSlV4<h(!
zg<zk&$<$&He&o>4tL#SiMt9TcSq#DC1ae&&hXRym-@N;McOLyAzppG@cc%-R(th9G
z;l0=0O4!|xkbDIn)%g1Cz?jVZDYNd8-<r`lXeJ_*i<4?GiQg$p-|+{)b#0!v=;e4&
zgv>tZHEpy3ZDD<(8lb^~W1+=N2SPz82thzV(CIz>aA%hrJh1fSJPJrtfN^HL4Yz+_
zUidECW5>e&=Jl#Z&cEWM6^AY4f7tW5u_KuJfREoyAJR#p%^p8UuR%}-;wd`2$8RlJ
z>4795_W}MYGzH=j>L$)+PYz}rhYjE->eXK<t?Q%)F=M@H)HII-50k_&@N*zJBz^w}
zcf8FX&lddkP7eOg+3NL2?o=n-bGC2AwLj&!>NA*EeGD_JUt&)6@0eNrJLXhZGqbw7
z+nDS$!O5!fL&`xB0XKlsK3pMjob0-jrXq%rg&A|W%kf@%<4Y)Q7)Oo($+1X(MmZG$
zaAHtZXtYR2Kz;xUtp*v~iOuby$ff7mls8yzmtQmRZ{S}*>kinP=LmM;yrce(v+DsD
z_-`h!2(BFZepv{@fY3$|YcLJ%*KWP9c>pFl58(eMa0;i<IKm;e{}G6TVDx}rx~VS{
zJY@`p`7JDd2wtGmS9xsC1RuiAJL8Y+JMSJi;s3!?e}k`G35)&#Cst2pPW3L#td23K
zx`~<9A2X*q(K}VBTG?_o;7Vyy6t#o$2Ow2~>pYLvhKDY-K`ogwTBFe5s1xjtDRHH+
z$4iu7Knh&{u?QD@I;)tjEmGtQL!c1G6+mGOVm96r$Z3#67I_mWc#ofOFdf7(trDK4
zlXxAoYizskCthJ4l2sEI6Zz@k6d!rg9Lc%2!x2M2S*($@KpMfFQ1HjC8`LQTPN{(Q
zyC62sx*W%y_+O^@PJ)9Q7!=>Vub_^(S4oylC;5V)m48x_o9V*<%6Xj4DS<nAe9GCJ
zGW|~8ns7EJ$~&3E+05il=1{{-zQY`T!%TK%4sS7&%b3Hpne3eEYUZdm&=Ln_viOyY
zbW<pu#^Dq+^=N7Ob~%u#J1M}GEjTIyTH_#ag+wc5BIR1(cU@fZJUR#zfG7mQ$Kv>m
zX<breu(Oy<Ts#MoLzim-E@!VRI-tWONq-#^?fVVzv55nWu{!#Z7)s`L8R%J$={Pig
z+5aPc!Ub$RZtqt|ewV{Ji84$CeDKm#L?w-^6>u^%J!s7Dt>x`*25L`&@MwrNu`i=3
zqy4#)ObSgC12f=g>My7hgE<#5@v*DXka{jR&4=luEWMLJ=xoNVypwV3&!%qOoyf%5
zpzgHhz?~Rg@@*LQ$le$x$^T+%fmSm|RpU~Pq^&ccqX48vs}7Jclp28}Wha1n9lRAb
zS}sAlO{P+ic1#s>snEi~4S<LqO|TH6ekky3q9TRFkHn-h<Yeo}byr!E-MNg$R2=#o
zCiCSAkjqTFjC{K-{SFf!*)DyUPXk~0;*0ptYoYwW2S^iK=QD-i&j-GYm%B5d&es4<
z1{cR;bkYYiS)f}gsscVb4J!OFdGlU*GE}-d(~lj(8EOW2ePN=CmpKQxC6Sxq!vxCM
zSI(a28+|A1i_fMZc_*#!olRonowyBWgFX|}{&Y9s6-+aN1sFR!hRNapSO3&5m~pmy
zp#y9*$vO^5w;mz8^#)f#8-WqH+Hb3!n;zQQ5fG5butG#MPM#v>^HX5?nGWCx$Mo^e
z$yOCpMg0mczIit|cM33W4aADT`8Hg8Kky-3;F?Ux?ONUgo_cldZzr|hxaZ=3%s(<1
zJHQL~4NV#WkuRWyb(rcJPvAA;7?O;)kJF54WLCq$)>k-(2@q*#<J8e4wv6ceAB<bs
zXd<a(r?YZ>ZiWvND32e(jPkJ%Jq6MuU`Yh_jYG$LAU+G+7$$wIk*>a9F9a=Y|LYQ5
z0tg(_!&|?GvIWbPv~_yz{{|ip#|3=a<c4b;Tmd31ASQ955OE}hjv|bS32J4d-DC*k
zDhHO^K(6#6;>-9UqtGn1JLUVv*1plcZ@cAKUXE$J7Ff^RlIwndUT9tg9Qn|&&$l?*
zJffpjY`lgHb$EzUgyF0m3Pg9q<lT?83u_bb`SD?h&xBFJu9@L!sAShe(vVDc@DT&`
z$jC|mKv@Ly$`l;Z4h0DawnKXemQRO+B2m)LG)#WS7>r;4|6vk3{sNa(15LQJf?Nqy
zfR2IkAvql-C6w19o51O?xau`b^ryj>CLIw_;D@k-5I!Q>A&Nsjj_tr`9vX%4xkwW(
zH&T-0MQ%&E;fHXErcoQ-;DwkvY<~w{FwV8xv);X371Fp0c$%?X%x~`v{OR<2RXO{O
zJQ7EmBHu$40WEAmz|VlkLEJX<lQdv_yxOyt9{^5bJWV(R_yO}mKA1j~BGJ7DZzS*)
zP+x*aFNApw39Fmjis@aPlVSNN&$)AkyyaFBzk~EGx03i6{D<Glgx^8%xLff(4piR?
z)e5TDLiL$YT?f@MW>^0U+^<<JvIHnbI}SpC)}}LIkr+w)B#0{z%|@eiERE6^FwU>2
z17TsU^6tpz&z=C%o3{W=9F(W~la>oG-E;yNGV%WQOO~*sg_th+gI(7D#|-O&YzB_A
zzRO22j%({8^V&>oH))S=jb6nMe(_}<ICC^({CC$yIq+n!n)A?bGLzIW!}_8A$7&3l
z27i_jm>yp-Kz7(`IC9)7_7Fd0#kYOTaE7Qw_8sX4Efc(cS`#1E0QJOyeXLr0Ru1-t
zF0$$tSanX2BW{7fIYBPG8(w%j$mGZ2AGZbB>mZo(y&yBsm&~c2!p!O_=2UBDRxiS-
z4x$|g?G}PtXo!w(#u`%^oK_gW5q4=ZDF&qyN;Om_V0;Udv_iyoTa=2fG(8D^7yPrk
zK73X&t%3d<EPdkgV+)1}`^8$VrS=-8OK7ciZS5Fb#OpDnbl-0=rG5o@Ry8WbM8toI
zp)zO59b~GWeY&y+>b{lW<6V})^Y_=M-AfON42Nf}y(w+xbr6$QxX<9vFwS}cyaXY}
zVMwVZs}*aGd!5maGVM`@B31OQC<r!iuvEnU56J6Gm0OX6ykTmTHQYlL-z0lHSALVX
z#^1y7Ro~?H*gbr?^_#r3_8tyToyZ)1%}hozhYy*_`OKk+w6gZJqd;f8Rx$vsWgy-%
zilNtsKw;`=w^{8ldN^Gjj}|0_Ht$>5&AYNk7Ls-?%=c-@g_tPt;h1c*XDmpzVSMOO
z3}e8xnq`zsfnk4^j=X(poY#69W(-FsSx0+kxOgvPin7T1+@3O8=gr%T|1zC~@2tRo
z?n86my5K*z`ZoTCycB&@<QWWLihMD~q&4y<3|I5AzK_@o!xA_alOftEwHQ+Wo~nT0
zTPLz%Y#XkMG0Df!!Ln!6`vu@01aM{x+#M$rH@o+bF+r~Ta?m$q(>pkiTYz(dc%yR*
zRGbqeb_?Xc7o_bRX#7=>)FGAdjD*WlaBVwO7eKW@RlCMLrL9(I3*h=vFv5k8jsT}0
z&2P_Uv(XAKi!lwtXM^Gz_HgOxLO(DISUz<VT#)I_Q(!H#`!GSqO1s1Y81k>pfj6ZB
z?f+gsAGKWrW`Q4)m56wV`#F@!+yrQvfsIyWIs;P~{4uzFJ^WB_ADMFc=J{`Ic<ZL)
z4!e{xLcGILeB=-3LPwj6Xr;m1+ja;3fN6P~#ljETIdCX_6p_}ztH6Y43+m_%Y>tP>
z&yNk$KI&qEE4xt}>4-t%`@kOo6OH{ohGV)e2Y*9Y;Wu1+hpsv2F{*AkmEOj2x17pz
z=R8KmA5P`bFFwXs4?mUn{{D9kym1qA{;-^x)jwfQ^+=M{0@-1eLYpt>^Fw(t<d;JG
z0KL7!fM~V5wk4wrpYd600SiReX|{)lFSajEe`d%h<k7R^-qs&gW`FP<R)3z5rBfGT
zXd)x*k0>Tn8Ogsr&5s3`-q!&9@){_a0^xk-9k4GIe+i>>9`A4-zapJob*MM_L^aGY
zm;$_|R>gNf`bY3jN&~0!)^{L!CZ>7B;AN@xseBd2%onWbCz7};@I`yCN1P7w68k-t
zSW}|PP7nm})x#iM4ijb#e~;|yhS~&NoCIADjH!q8gA0IrbAUH|)BBvYRNWGw<{Z^?
zJS#xW|0#~$H$crJigT_EaQn-Old4O2F*1rHE?LeT<}>r>M>8ktCpjM5+XmQdmPG={
zZ!*x(WnP8Ia4Lnti+1~*<Iy8j#zC}uR<gDNRIKZq`t(ik>#b$80aG{OFl%;y6BBT(
zwV30#mS32zl|G<rIpa@JtNaD93ox0fjIm0x1J2Kk;~@WM%qaXfTn>vOu<vDXW7?!U
z{*yi{>)ej1G`{JR_yrsBiqu|Df<1|G0&L_m8i{iOU*QaE5D&p<2-_R953HWA5xwAK
zp>@BM0VBf@It|l*Vg#^`v4j{)8K0xft7D`s0*|m;=b-O;Q$Hs7>x<#P+C$8AF{V_|
zlR3N_K2TP1Ej8>$6^+zzCRMyh4aYH#7kOl#<CqkEkv}vX$7$^^GTS|lZ}1{>I1!(I
zj@S4(h^u+Sw~G9tFH#i<<98%J361Y$KBS$V*};MRt>&meSjJBXqdiJn%tA|0%J?d?
zC#BN`6q9T}q3_>eqTUYhU+Ybckzr-r4ot!XUK7@bIT{n-30u&FPrHQ2O_!Q@eU(+s
zJR9`_&u4j!HST`M6sshTvfJH-_J_R%+=by@W@Ur?GV4>eDV->R>1i&mdWSzw`!Sz8
z9TkB^3HZY(bG^SkG}Eh;N{jKg0Y3-*Z}6YnwQJ>(7AV7jh-1pChk)->NO@(DWup&9
z9T%}7oh^_)vvCwGXxg7wcp?BB#@lQ0Jf;<8PKNEH<V*~uD}w2%bS3aQk|Wq9`Z}R$
zN6>V^>$sIike>58tT+PdUq}D`XsCW2(fV70tyfdD;ywbSj>IXhK*#_~j<Kt&kD^pl
zQ%2!ZJ{#?`aSf?W+Xk<cnv}Muw-*ujb=y&60QJ^<-5$gvWB>SdNFNNrWiWH1SsG{C
zi}DXlSHLlL9i=Tu`q>_sq2~?ox);6Zqz?i7g#9e;Eytw!O||Cl9rT(Ja?2+In)4rI
z?YR%4nSsX95#D+`YhxWeSeDe8<i}2zG)#h&4?=09L4M9|dfp}{i;bDiw}4ozku^a-
zV`nPU&u)vQk5&*`LfeTB9DhFCc(J4rjS05pWQ&0EmIvUB5ZuxRXIuccya#6-1h>3R
z<cx!;y5()Ya>hZF{_Sm6+<Xv|zxg)pmmkF8KYg1y=Nv%CZU3g#8AYOW3?qvRDRcyW
zQtW5vQ$tzrADqfEFs<d?X@uHN-(4Qs0;aTvMopH<v0YWOxeN$h1i`?;jGGGkhg*pj
zL$UYe@3V$hfK0=yY--<*!?n!rl6}RmJ9ES*03X;N`M;Qe$E{Y&>?7Cs7EA@<t$rW%
zBT)AU=)LODzLP}WTu#DtWc=2UPPD0u6^=GO$I>!5e7%{m(>?#P1MF#iE=Sq_mo}AA
z==&ayic+;TZgEu~nxz2t<2Ck8-N8Lg$Tp*1Je`BOE%i~NX-bz<!%CXc?bP6>DNT=2
zOFxrG!hc5l*{u#{FZUx8l8{q@Q=};>Y@*a@#pz}?Zmo{UqKmGT-afD9C2(y3g2`VJ
zOq@?;`=Zxo%ni=U3ztzmI)JQjApc7%2|h3mxjTkidB6?_kiE&3cD(pz;3w>XNt=sW
zZ|A`n4&SQ2&)`)MKA-Fqye*WofJ=ek<_1cSJ4gsNhoNMPbh_o%w)rkN>&=FD0@kGY
zAFD-<vAW($z|R<VEjgXauPeyU+tznF2|R#qB-yTM1txFJ3%c`al%G2o@z`PTx%Uu{
zjfT&yLOiD6bN())_?(~ezbH0;&QIbN#pav*R6eC}CgxG#tDu-gII6|&s=jUfwUb*H
zg|}2LH>S{42Z65)5-&lbJxEb})2#PX2NKNNz^L}|l)Jo{U(5l4Jdn{jrsA;w9S{=@
zmdL2pG<RIkyus5h&t;nRQI55m<ssI;_n*EsOE4APJozD8NH1yu1U_WrD~SDlu%;xy
z=)re{=xxW&vtO#*(!xTp<TMy}Huxvo{d^73%<h~(DO4N@rxY7CbgNSFdnFUCg?Via
zEe{jbrgcRQB)0}oHmA;{fTc92j<e%5JMP+JbVn{FT(K+5)lw#I*p-rkr4-2|0ks4u
zupPKvz}<#lIaAJmLN;iAigF!LAYq>{l;*?ilcD{QIEmU)8Y@;2Vixg0>P5HRe?*an
zh))p-6yo>_@Dr}V2~;6lkgDA%CNhxagxE2)%ZqOYF5=KEYq|{+?Yb6t5mUSGefmvP
z`ooq2=6`^=PjTBb8+^6Sp=XU8&9^a(gkj=jA>}l(0Y=>fr4`V6zbO}8Fv)rjYYEW8
zsZ{NDFpEnhyUdc?W>4=K(0LrxqtrZ4(bFbkH67D1?q@lu+d`m}Pb)au&tS&VWBsgp
zPT}6`M}7Bwiq2exe_cI#<V4$v3ATM<1h1&U4C6Q|-43qeRUof~$m@_d?GlbIP4e`q
z2eUy&sJMSTtc1XLj)-sk2L$u+tr_`2V4U8A(jeNuXO$BZNF71R0`NJeMaB+Z?&Aia
z`j=U?$bQJ~XkId!7{{6$$P2)O7`|qrf580CFkLQ@Hl_Ap!-;or=-pE{@?}PB$?u9a
z<k3_aD`(v~Yal!eiVws%oBh_c&>R@YnBym~>;Cm1OShqY5CfW;th>U5)wF~+zXSXV
zpS`B{=U{Ftxc<KPlOO5$=^F^YQcnEPfyOrpzw$8~4-PQr*B4VZxs`G6jG*YijYu&9
zLth)}xE51uVL67ATf$IC*Sn0|(o1mAR=JSB1oR~^c^s5TC_KPWpC0#v`!^U{0M0HD
z2tdJjUaE|6cxfK^9VjScgA|ktndP*Qo+ed>iI^X5pY(d!{~eR{Bkkz3@2jxaFpsX?
zf<9ey{t`f6L00IPXE0%6KPG?tWlRypcl!s;VaW_3x&O9FM8A14QNEdNdtYk5RBs?G
z$uJR$Fu~(|Du7zEkG0!LyaAX?jEx+^mnM|3>q&b+Fw|Eml<~l7dv9j|Ct)Z>!_X>w
zF~8&Q!`~mE9up;8j0rBOffbOy<`A(jp#1Xxeqa0NwvcyKK5ZYjkas{nZEtoTYsfob
zE^Ti%k$1pZw7of*W&0P>{8S^3TgYCIG$KwagkYoX)6j?^-}W~yw!7e3yU0t2<=fm9
zixWeZBe#WON#)NBt!a7@up9XD;h~s;tx5j?{{$F279#mP84hxSZxob7StNo?k=QjU
zFG9+s@mmtH3(J$gVPYitc5!)~$^|B`(=*${^vod_S+9Tcz<IqzM8Gu0%@`jq*j+MU
zcg?pk9K_eQmWd)@p9z8o&YMB>+;1?F9}MQGA6pmehrON8%Mb7>pnO<xGNlI`%%b8j
z)20fh276rMa*P>NWwpTI7T<^73d5{$;i=yO4YXUN{|%Ycu`KDZ-=iakgagf=si%E+
zZenbly&niueomZr8749-PW#+2k$t<5t+dZwLS*0hw9k!@-1lJKd-GtL{0@iwDS&Uk
zB%(Y3fh3te>jRDR>{l6nM#?l8W|;%95zDP6*V;u?cri>WfxI9TOgDJ<XaL4bsC*Qn
zd-7VSl3C>wSP_Nsfv}m<UcS4OWcla3bjV}u;__#K<~aLzp7C!IwAXfm1<L~adLV0w
zfBM0qE3%iT0nNE~xAfbIvCdA8Ihcs~maOJ!z_kLxdr3;ZdIX&Rc^Dj6dVo0-=-P3{
z0aS=rDB)0!hvP=U{xJvzGHJMd+sv(2o1BV?bIGj+mM-wmMpBKxq60(TUD5v;J|e^a
z%}K95%4nsU!9ziwIax8TImiLWDU$C7iA?Wpj1ZYVmgKu_M5Zso_s(-1ShbK3uHJ`N
zC+yB{g<;BM64G8Op0Ag&&{`_qIE?xK)vo`(_qwUmvOUOU76qyU;O+vx5KJqCh=fxB
z`6xVH3cLH6Q8Afk0<dQ~%4Dx}oanJ$@~j3v9TUXN{-p{-w)f1o3j23ChN)U$N55S@
zUc+?tse|Q}*`WDr=(va(Ht_QjhSHM4@DP)jDDtZosTK^wG%p7B)Pl%+$5S3V8Tg*j
zr3NpP@v<U20jUIn2Q#DCVfm4JGGU}|u#OJbzN6e)0b7;>U)8Nut@Az`PJMu)zr&jY
zgJcpDSIbGiK-t`yn76hx%t&9Hsi`nJ87CyeB-}W`UdISQxhDxXh~Kx24SB2CShk+Z
zmggvlk3)+IAP=ImpKK2;a)X^9-WVG4m;T!PuK&Nkon6%HuLS>3p=ucff)Fdk^dWcP
z>C>R}ad4*6G~s<pn8^!yunuYbX0lg<^*l^Hg=4HH;<?zum~cs%)lx>1sbJ&*sm{_S
zecOe<vNzD|4E+3*e444XFTG}eSkUeiyJNVCZ(8%bz8lKuUQoxwu8)Kucubh$6M_S0
zA7$hsJ5IN{TLvf#CF~yr=P2Hp1`UIE9NC`D1np1UmrTh$-;nQ5m*{s2Ry{`izvd)2
z41DyvVC%-^q#vM6PFFLECrEUqB2_PuTH!bn$L(({#Bq1S?@Xk?`G}IzWwftuqrK%r
zgj@x|{jEX}u?stUEbIoB!6AR?`P~xYob9a2`6a;BL0HiMff-P=34Ei?5;)GPMN{U&
zM*$w3{vO|@3giJmgf|Fq5R&C|X)fv2(R#-&rdf7jeF+oP@vx!M0%w!Ol-?*t+b2h}
z+KyLW*V#lIGFs-tR$UHRGx|`A4~sETz_pk($p%bRMq0$lx4w(7+KW^c^g&=qG|Hsi
zkYZUIlwCZ6hXR8CIjn{mjOp?60OHs+5VT%~p#6zkc7OCH63=z8(c1K_10RtqDKsdc
zoE%KetK7>^<N6duQ~ZcEDa05*tQ=@eBgVJ{@7YXrg`hPG9ib=z_Ch2=)}*%G#JY^#
zHOgf}`^K}nrFXP%4~2VsO0WZ(ieQg*&@dA!QdzD=1@mJ(7Rcw+k0Q()>*tMqTR14v
zPS9V-JQ-j)4h<QMyAoq4uECUXTSewqYrB}!_L@4F2zk<KmwLPLOAbbUo(-O!mU$85
zXy+L+5kIev{&-B}JYg?DnvAo1ESV_SN_-&BU{&C3$UAOG&|@|BI<iYfTY^T1XlGtc
zK8%SDH53^n)Bf4x9j~=tdkCfWjBm0T2=N;KZF-VxhQ=&z&7t66fO1!<X2cbYk&1*1
zK|6*98ed&SV*LtgTI$(Y86ccDnxOa!ZZd5*{*+yu-NzQIReIylG|GcsuzwuT)vnsE
z?8pQp_JzVQ)Q&YqTN>~^Vzdrb4h1kH8iL4F@JnX2MIau9m;(XH3@N(*w%=IgXa%Ni
zOQ#9`S7`fR11XblhrPZ9P5*+TGcx{3`8KfMjy5@~vjOu*%otV&jgV2U<)7j6`<O;I
zr*(bD-!LhMF<_zHVG?EwrWw?3Fzr-W8R_(P#9+j?p*X~hjw0je7+N(TugLQ_Pg_3S
ztb^#_H#8f(sflAEh#EeI17Cux2md|J@9wGSu)q6gOnz-nJfL(IC+GP$OPtL~oPov<
zCC-aUoGF`Fc;q}bjc{peaww0TPN=B_6&ppeX(_}cG^GYNJ{U4d7pttkP}u*5`jQ=w
zdU-2dfy1`$1^wj}W|i$>*Jw6#>B-%VEjS`;4NtN9UWiO{h)%lsMHnJp1mp8}^1#2*
zT&RD#n;BVEg2O&k$ay%&L!PrY74g4NG=2t=yqgFKjgW@|uOg8cuHs=kB4A$ndxnjZ
zy8<`QhJ$DKy0PuiX|QJ%DK=h;i@@iA2rZ;=SNH(JadQv9YCXTh%D5TpgSGiJl+LSS
z@1w_Y4D$##l4+DOunJIP-A(Bj-1djzUfCvSq5;Tb0UvTN-^oE@A3(X#NzX{T;B(US
zIW~ds<un`fVfm41ie|0gm{ypqEAY#GNa+Ld%O#{V_+@%<<G<6S(y(A-khp}}@lfhB
z`>ae2{KcQz(qDeG8IIq|7xbcjUfW}^C%MAtHPr_|VF<!w4Ut50J^lwTfV_qLXGDyV
z!FLf6m-3F0IAST0X{S*hU`C;ah%06U;+^`*3~8+I8Aicmhf62_#TFj_x_$Jvu{F^L
z-Tcx7zR_i{U;{DE;BB%pjfNv-z-AaV9%^sMn^77Z&F+#X4u_LNoprPZXCr01n{F5u
zMt%oUnwsm49=Q&tKW?1f-^SEk%t<y-x=spQL4RXQP*8JB3fCt%;NuP^-c*lNpbp*z
zHF+!|<wrRwL`n{Nocs9{+9zqaCx8G(c9_lE)ux%_ww9CsWB)j5`@1REUuo>W=|J!z
zs4TH-=rDNVj2nqKS5QVPz6Tv5W6DVAdSu>#?DkP3zCal|0B#i|JT(<le*++33nR<i
z+#hgbyXqH;O3GN2A2vJHi)>M5X=$Aa(~pfwsxQtbFue%53%hb)_Qs{z_UWtVQxi)g
zfWQ45I##fWzY+sJ#^lH6q&rX|)7E|1_n4o8y=0n{f>o6+b5sc5D#7lrq?xoJL10&4
zO3E(Al)23!g>ZWr*Q5{)uuoA6-2ihsjE~X<T-&Lg)VBZO58Ltd?eL~#r%+T!ps)#?
z-C^cRIAJRIEDP}o7sfOgi!B5!90~p)1V_M_6ojG>wK23nR`GQC>C-580J(t6aez%k
z`9JoWRKtrarxO@I{4;trE%VcgE9FM^D2+WeVZZS4Gj$k=Yv1A6-ECXmq^3@d^cybJ
z-An$z%&NPETy&=op!6pY2_QJ|=ubdtVUiT3)aAiDi)&a}A7;W!`!n|aB*B<~NlBP2
zkdY*$1=`njOg1EGDiXx(m<n}uNV>Uu(nZ46&~hp4x&qc73X|LDj2yUOXy|}YnOR$b
zatMZ@w7|^zd=0JwCv55F!qUxi8s#9wHiWzU3J{-X(q6En2BwYQ(({hORe&s^I9PoA
z^f$w8>`fky0KdqhQEsa{^lh>OIC?S7|7j<T$<xfWvF!^ewUb7;FxWBRxKsp25}qii
z4L8w{dW|`69m9w9Ns1OjWirX+F+ePdNPrG^9h-`h#2PZAKj`G{LO*gba8*96YKHwk
zfOZEW`y0h0d>SMlgi-~00!B1KC=U6}z%=8+kRn6rckKGhf#hIxdI5Za>r<;BXtJwT
z<k@uDEs_p24nA2*psZ-)JAOt?TMJIekFUbTFVoxb{(PJ6A+h!UBHUpj-Ph%`$^JA-
zCuu2;gCB!#5oIz&q$5mgyn$7zyGg`gW$aLzrzDx^fDlQ90^Myinq+45`vbYVFo5L!
z6xx0Yi`IcN4W_RJIo6QZpU|Kzjk0MYboiiU7EDPRO;UEFQRYB$aA0Qm3hPPfYYCM?
z(ME`VWow+<1zCU$6jHjFQl<&kxDY}ys<s4Ksle}UgFE#ddf^Q$c_z+S;Mpv1R8D#k
ziIc`rlA(<OR7(ZCKZA~q0>vtPdoRX+);}44&<Y$!qn!?<E74A}%h+^Kl2~bG^asVK
z`q(kNWgxDD+63gUf%Qqc)Ui#pgS!qkIj~_GjA?;%%CHA?mKK=<$-&5FR`)iHa;;(%
zPlLKuu)jxX-@;BLLKYIti?U=i8wA?8n}V7RrAbn<fUV#E{Kvh2>7ODy43qxq+<hNN
zqx2<kH4JI2gSLdrin>Y2Nw45c8PBMrK4#C2?-TL05Kw<0;VeU{N#Mjy@W4qT6%;#3
zf(jfv`U5%Bdoc2IOkii-Ca5Zcb{8V!Z0~ddwMRph15-MnWgNu9kP_g_nc72?Rt(d1
zGhF^7l+((tfhenXgH{D`i(z3GLSDJbp=u|-QH1mSjC`L04l&OK8+;UoTx3uI0dTff
zFz09Vk;}d8>K2+XeU;zO-S>fj(w{=6z#YQaz82O+Q#8jMN{=q#fR6nc8(u=#tsvoV
z!F4y_`Zcawi|cR3b;0!~dL08fALXDWTn!CBgTked&WFkc#*(8P4qFcLB<K(@RzOJX
zNQsNvi(F*2$?pSGxIR^aQv!hvu<L0?OLwiOC<(MHDE4Z-3`&Xt2Zz<<<yG?W$Vhl5
zen8VG69h$qfRhHwaJE`^oprrExtt&2v}v9u({Cdu{cUc_N#UkpC}TrCh(L<Mu`qpn
zib>=loI-GCp&cK%`=K2PZYkPHfD79CIJ=KNM}Df09Z4<*oNJ&aAC|Sjiz!fLP}Tr7
zQ(;mQO!h(0vE|xwC^<w)V9Kej1WqLBLQx59jKHZ0NOl9n6i_!L?~M!OA%sID8e1`{
zz%M;JTOe=<;AkI$4z>>e<D0!d{Zo9GDwb%t9aEt_Cj*<_XQEsf?C3gY((ZucKa=7%
zs1Rpb)A~%b0-W!ll>lc~v<iarUHkkudmVkbSk90=Xutib2~!G8)@KujoZez}mYfV#
zUIm`8s^NEmZ^31t94M}b$d93EB~<j%cEnK(g7VmcDO6(Hf$MJ)-58SjF(8Z}1h{BX
zhtLj)erc4-`Wx%)dAkE@5>ssB*}lHaf~#AoS0>qMS?=Bs5-7DFRLay#9L$IhoI=wm
zP_4qGH>M30#qBam+;kqU<LmZ(*U|6G-Grga|K%>hR+KtSdCLT*iutzyxK@EP9vUx(
zAN-H0>r>Io(J7!+4pd=n4yKra10yE^AvP4F@(a<45F!Y;0<pnXw~x{n*HvMBsGBj#
zl)4v?{18(Sq1S-We13>()!dHBGs?+efl^tZ8tkY85Xpy*7_4o9i3^}2Z2(jQ_yihl
z#|ZeOeV$%Nk#kYz<WrTGF_p^;F<p;<YNMx(`#k)34SZ1>-*2zJD`zleD4)lxYdIn@
z8SOw(5y66}0ZFihouM;0EqefD(%KG<^d5Fk0q+5C^aYY{@*@f_(cBIEGk4#Is!=*v
zLiylE9FrQCngDGMELjiHSHPKSTIHl22)Kf@<0IgP?EmyR`f@<ok3Y+6-{37B(QVAh
zmWx+S?8|r^Ie(b|Q30o{hjmv&T=boN?F?AbsKqL8#_UeGBXRPfun-l3&J+6-_)9GW
zb}_qM3>R#()p~pLUA6%q*x%ACcj+<CW6C9pH?;}gwB_#m5P=fE&9NTB7*OCJ3Bf6#
zqVU=pm^2rvW`o`fNJ_K}f$Kxtn!SCEPR{i1ra8D)d+5)Z?-lU2{Uvg;1=5PC>vWy@
z_i9K;C@+WFGPu03pAr=UT$yQd(z`6c6k`{_BosmN3L!twRN(Ux0<@+%KS_Zo1*MeD
z{Z3<wwl|Y$>(O1}z+7u`_u5M62`*vcrD^7C!<WqUefT6yZ{;($JQjp;6(FZV&1fj_
z!McSoezqp?5U9Ke>SGB<Tb;=1eUu`16EddLKmgg@6w_>tmZv+foR2B^S>1UJf87qU
z6v`W*<a-cl!4#nEO`Fsvi6-FC51PJ+3B3g|#nB{1<-CyRa3qjW5R_(J6(n7k0+mDu
z+Ca5~Z0`pk!4%PW7SjczkM~@|l&e~)Rq%UE+l-tH%k=h}dpw*m&w=(bD4zmyS6EXn
z2s-d#osW{%Fy-r^P@AIAuJyrmADx|kje8p8a7rfG=vodahap}*_y1s;wgFc_yMWSf
zL;Ym<_6Vb+^;Lu46^2(CAkzo4t8`#GBq^X2iYmc@lC}86C^SKWI0|$cf1(37(SlC5
z<CLXP5#7&SO=5yW&kbZnzyIr6TH4@d;H}&}-vXfYf+@opeL#T&p%CbDi0!6vraIJ5
zi&8Q%z?zRBC`^rgWsmDVik)_ido+(E!>iq$li|zd7Q~JQe%1Nx^$8GD;Oi@)>b!xg
zmrD(0{ZfM#15522s))H!WIoh7>d=aai;pytHWV#%h$J0;mvj)yJ2c@w4TV;WKl06i
z=1r1wnNSBekqh2zv4}&ybir0iEEOctD1x+$3WDSj3BialFd|^QECuu&KW+JR8k22_
z7TIN~T3u!f{FJesaoV4U@k@RVnl6EP#zMYI!=#_V^a~7p4(J4lL*6Ec_K8>51J}Xk
zAbjo1<geO;=y;dd=i}@bY_?!+0(QphtclsXSxEQnNEcWQ>QzYBL7g^>$n9lnts}wf
zq%YPyNN**Bax!#{a%+JkXaYDuK4HQjA(RI(`w1Q>b{{`&srghua%*K?_}J2F*i}2-
zl>afN(;>j2)YQYGcj4^>un!#fP56lgss7TqQySJc!D`jlo!kuk8&EWVSWNYreA28X
zZ(M>|!Bn5;j%VqO8Ox&u_z=|l=(ae?I?d)dH0y4k?LvA5skXOCeW1AqxG)Ej+Z9lH
zU>O1t11(J*#5@S(+-Kd)?X3lpevEf4cY%kdNtR*S7COK|G`|gtHbS}pc0C`yTr{}U
z?e-Q^&8hD@`5LeYv}XD2a%$ZU2zM}Y4ETF&Zn}@T;sVP-y$Pv$bd#dJ9yX?Xp_?m6
zFT<^Whr}Yyy_kgcoNPZpDeNsXJ?R7?v;g6UXmHzi|Jbo4J$R7xXp|yrEeTA+8{spl
zQ8|ztB1o2F`d-F?lL7d6ks;vZodW-Rn(13RkR+2(+hVr7-lYw=4Tz)b^ZDSdDqIDj
z5-1xX`T<7|AT=gq=sj?kqub-8>okoCsCRo|N_K#|40ppq+G-3)UX;7v+oeY7V0x;W
z90ei4AA(?xBiY?x>;Gk)1(0?@=q}rlgCu|yeiH=qk)u%#8YD|GnKuElJ0-1X0d|3-
zeh#OKfiI`h(9i(&{nn&>8k4pNElVcx{+eR6grad!<m*d&^mfP1pcaC=6w<A@jf%EL
z*sLI-d)a1_q>_ta<1$)SrMX7KZ*%v1y8}v3oAhDa&kks#=j6=pp<CrL1!*^fl^Mwp
z%v~IW2I+!dk)u%#+T1R;{~wrn=`v_9g0UCEd7}rDiU=(Yu(qSWEpI(=BhU)EkhSwB
zv7yaD_@Q)k_cf6Xkd5Fjf@BT4y_s}df>fKPSwW-jgH72;NBSMahK)3=*8IXXT*;hl
zUqI=Bq=N~ahE0ZnJ!?3eGrN0=>}h&iR8+R<rQ1VOcj%sh<0+m>n=C1j1Ik|H3Ijfj
z#uU1k0DM04@|AF{fP$0YJ7=2WY6D3}99Fju)L7;pAU^=*pqr<#=(S=x6!?l@<Opv~
zc(A8HH9~qZBv#@!wUTb{pe>c6O&bHgSAcYZ^(5Qop_jMwVG~@S;g#Gy-!6etXPMkF
zKqBl@zI+J#a~HR#1n6|qdo)Vdm{ht8m^xW@we0r}Xr0@TddlS(?#x(w9S;IVWnR7x
ze%S#W4u@O|XE_5GDpv|NHW=-$Z&?Z4iKARxM$oc)7v5eeQ4;dUKvCG+6&1LfA-xpc
zzKUd18;N9+CKozLk<$G%gNTz(uRyoGPsc*VBPmmPZ*A_LZ<j#nElocr1uWp@tK#?|
zzrf~Y<)oW9KnUCvI_ctS(=SDL7P)Y;9)r6LZm!isH@Og_n@`2~B2Th^XXLjnkeCXG
z><gEc4$kCm+6?Pb195F01Xke^fb<laUyZW1MIrqz<>Or<v_o<=I=-HC^J-G@1Z}RO
zRi#Yws?KbH^rl7Dkxsrtx}llcC7SCs{5f~Ow|k8;fN_u;8(U~o=)xC+SSY9E^eL``
zn|4TR&|NA64P(3VnIL#hvOzLzHOZ;Kne>3cOQ3bMiG5F>1(ODG)_4o7YBwnYeakA4
z_Ze-GO49YCnEOne_EZPHidsg5YH`<YB;C<OJk>!nX%e=vn4%wmR6qhZy#&>=jP?}?
zo^I3pROgEBZm&Qox`AW~rdohB-b!KGqsC%6ZL)9s%@iwEuD2-U7Tr1NfM4Vo#fA-|
zF@DG|V*-oc==ruw;i^&?b%nWp2OT`{nUe`v*I+6^_G%*tPZN9?M=io72{h3D&OBaU
z0ZPXyh;`t!wz7^S9VAGJbWa~jZvY9nYe}a*BE6xJ<?A(9q~Rf*TS?n1P-X{i{8p1R
zAnCm%0uU&I{2X_(Ptg`6w}@^o%w6+2rl80t1Cl>8E`!c5AhTQvbaNF5J4cG`hB^Y1
zhc(pV9Rd59-g$bf!+9x2&-30h3lp#z-7835JpxK6!^H^*90vOiw6AHX-wf+@-yo?q
zz)Fz!;;MG@Lj497KDdFkaX&f_f)##Ry<`Kgwx#X^CvEh`ZNz06>H1YPuSs)To8}sA
z$`Ivb`vb~sa;y&%xGA!u%s{9EP979TGs`I_y;$9P3qjH`#Ym*jK-0h*l9&G0feE+`
zm!y8pHoh`f(z7^-wBI*se`x?i!iG%TIcCAJ%4(3i(yM>>Qn<PVM*JMAe2_c?4j#mA
z-m(c+_vM$gAgOSHzv8I5=H6;(n+;FTha@RNqoF82Lnacs4{!u<!EHwC8j|sKG;e6<
zv5lJR6s*+)S^hcsq=8a&vk83m5wn^>pvzlbZTj966hVHD{M^4rxrJIJexs`m9_n07
z8-m$Z>pBvcMpwVxBX;x4j<N^su>rDDg8KN3pnabQYC#5y)^`QSHjJX=V*HC<do*t|
zUPdMZ+HXIj0N4}5k@PglKIBrkx)e%Am>h23esHoFc$0}Y!ix6HCwCXAJ$#!D{JC=j
z)NA3xJ77t|{Dh)WrYmNj+9ReQHf?BDk#1W@^QJh@)g|~<O7oHKF99egpCnL<-c^@Q
z9Q7t<H)gX9;7A92g(iTL!^uGa-cZGFc#?7u6qeql1QP{b0X&4MVK~-mVO7R#q}~FK
zzZ=kn?P?C#=fYVgu&4F4+eZnRJoYfXx2-tIn&JSJK%V`7jXfrb=|kPg6wLx^KZZCy
z+0Mrw0W;{c{LwFfCb+s1O1}mr6M&OpZ{NVTp`#5}HTUh8%wSv-h?_ufGEb&p(|_RM
zg|?36I4F+wqK$awwNdyrYe;u&q-8@JuQ#Q*K9OQ>8j?9*<aPy={$7+!Pdf<HSBU^G
z%I)MqehebH0M5WT>Ci_@lWt(@WJX73h(p7&)!84DEi%vkpTM*;T|$Ph8P5VEuh5s1
zrFjPI`x3wjn4rlX^iHf9pLL8^@-}4uz86zVQ2-+`*)kCe*6XsgMh~n*_A|x;hhlu=
z$M^1o%$Dm61*l~-jPk=-2g3L=IL<e)Q$Cf3+ImyPY(S9@Bh}*>%Xu}t@lU96!7YMO
z<GQU2t9H5yWCJNyk#5^WTSJ1E>QnqKk>VW}I#ez`w><*o<YBCM8`=p#UMUm?asiw{
z17$D^EW7j#Q{cD=$7o>^*{z70z_cNK88`!zd2%1{I;J@6w|iU37HrP4kG@d(w5$zs
zFpwOxtG<9tZEs<Jn3MH?p7k5f!lVvH*ye@ZehxRLp=~!9bu#!*g#D*LNuMD35%3-0
z4O|8Fn_%rAk;=&~v6hDVXW;2|rs{d#7$^<f=419vx&!Ujl2rAyw$xEmpX7n2B=;pX
zo70fY0pt$lqa36K8Gt}36o>jQm7kMd92$<P?(PD@qM+8`Ljn>XDQg}FfazJjIsqJJ
z{fvLMuU!xPz1yeUnT5jsEYsPGB8TlcLu8s5xYj%m5Av5ZZJ!tTa=0!GZYfOJ6;3!E
zPAG)2zWz$5O#}V|oKN$nJ6V|+T)@qt>-*B{;PuC0lR`TqSWrBINx>x2?Lg6h->oB=
zYNWQgo#$HO+}*5Ll7@yfbmUCz&k|5}qfrLRpe#RUat{YAJ(88wN#GF_D>2-^N!AZn
zY5je#V!G??0{l1YEMM#A6VCo5e~xB*FeWYsH0{@oClWpjN@Fnj%ka5CXWm$r?Rz68
z>#wU1q`3}O#s?QU=?;=4Ve@nF@^Z9FlPYP3qQxvrYa+=unp#r4-<IUz)(++;l59>I
z^E#bd4WBijw1FF(j3zlEAEGj6at~gz3L)TN@^ad&X159BC-k~7dK%y)OaNx@Pxq@|
zlZ7_fu^h+#<@93B7m=Ys<}*+r+~l8_hq9ZoB1#7_8VRx(K@kFt<N&J@o2qF^xW15f
z6(lnLU^x9mh>eHS{oS?5e*)jdRG;iB@j9q!H`(EXk?tC2dJW8d6lJRl)wb93=!SY`
zyOMQD$;PCQhBPG8Nz$p@LfA3gW`}&~4n2?-DKu!G3ETvVpe&LD$xjz>YwUs_kMRS#
zn67*eVUqK{YF<|XXx|GGdqFhRE4Qd>5Iu8l%-T`A;$+w7JoVBelZ7#%m}vhv+0HMR
zOPc?pco`GbNe3jve7FTs#s>uZ3qJ>m&CHO3v9uWs{AB^8rlX6-BLZKA!>ZuyJmYmA
zth3K;g{7^7btXJ!!FEIDsWzy+6?Nmyu*iJ(FJX#NCS{g3qS^8eNjce`G|DXW6P8A)
z{e}V*&WF-KhWwF}PeU{&iv6-R;3rsZw9cCB-v>@L?^F<f3sUbuq!4@ufT*Htu=+n1
z)x4m$lQk<W`d!c;jWSGzN*Q5jG|FG#66e3aZRdiNqK*)fLM8(T5n(UCWKv`WMIuhf
z2a%=#F(S0Y^NH!*@fG|K_ID6t4}mX9^XsDwEh4gf&>;B|riH|YE~;hxBY62Au*l%x
zO_&}Kom-l<%yY8C1EuH%C#|ZW{UGuUK;{RbNN&|8J2@Gi5rBy#FTzA@H(4!ms?~Om
z>;kC^qOdRx1#4mVr=X$$A{7{h%_w+g6%^!w8-#GcRDV(u{C@MC_mR@0S$d|mZPOZV
zg-9#-M?fSA0RfKR@IE`gt_PZ*!?1#aKn46Z!lHONrzO_Wra}}4l8i3cNU3y*1~mbx
z5NkBLL!j`3zl2bDA}U&dZ?_-7_osm<Hw36*a(Gq4pdkGtYv;e+RU6#|tM5epyB=*{
zyeBt5Kche?dZSSW!HI%D4EX_L+~u^$?M0+@{GEzPPpk*d#ZZR)J>DAH2h=9mumGBU
z5KTboawuJG!bWR@usIH42>~C70)skX2mE;;1*H5CPMUmvd7RZs_W)UH@@m?^Ee9tF
z9lo(N1Nq8_BZDTCFGENIaPs{yYLQW3N0dXPjHzXLuwgY{57ru$tlkH11Y8Gn$a)sW
zfd3FEE`kZiL3AX1H(*Tckqnbl6Tq;ry81L4F;#va&C)qBx$ZA^J-!24UV?u=x7~68
za<VmnQtp!Z$KyFi?8CFFww`!26wfxx<??h{rY^nLe(*H2IaY5uPQt~d@UN*bXEv;u
z4c|ViSKV_8(DY@q+<o@yueHXzBOnrh_^Ad&9Y5qpGZgd)nJ9g`oeM_-RRyqz3uE)~
z7)6eyQHDl2Cf(oXKp<+qK=42a><9lUfMu3OIRX=rj##H;UDh1*@_)Rvhf3gJ>mfK6
zDDr12RCR*n%AsBEP6p^gi-Yr!80x`;!0o^V@Nqj_Kv%{=#+;r{uB`Y@1C+a(l#NeF
zlE7PbijKC+AfH_6S<n*F5@Z_WY)ej`iisQxQwZbz{b1n%aM(ZLoMYgLOY(XD5m-wj
z-||lM$1KFLXt|3QL=TgpQie^Z%y1Y^j)Tt!fiRRM2L7)3bq3R;WQw3jdv|@-H1`Y0
zmoQ1gfx^V?i|A5kd_cXqFHJFzo;g8JjO!gR9ZYfKZYR_Bv3SjHTzJc^tpD&g!2Q{8
zSpZzpD@f*KCv<py@7g;)A-<~uHe!k}6l1u7`Bq;D@0?dZiQ$&lS`}wBs1kTjgD(ja
zHbP(#h>0K{23c$t{<A<68~9G*elDN|xD>^=Nt2<Q2dskX!+@6G!$$`~+WhVF8PM@t
z&90a&kIZ@{HL`Pjwpmw@)!hJ4z!Sa9=1$&Y8;ZMuUsFe#Zvan$;SW5}1rlEduErD;
z$w^K=(b!BHlV6-BQz0g4A3Fh1X4iMHI!!tOb3#yG51}}WOhWz=!z@SzVBt7eeG60^
z19yhJ<i9qq<s(SEK?k*TFq7=2SzqrBys|zwq9I`mLlo`E*K?%-Hn;ol?9JiRVRo1J
z&ydeG!EI2k;mO|L{VMQN;En$7q`46$41PlnMsh&86;YxYQxG9&fzs1A+@0b=Ys))T
z7PAD9$cMm@(0F7<1N1Z?2dE^)MIW?t><4j5sY9_5sTRZ9jdV0cVe}~w{25SUoQ_YC
zX*Sqs?cxcbb^{qRrgp*)#a=NeFcj}W+aJBCkAo|Wxz(l9)b0hrdQ;rrnF2ST+Y70D
zrDx~6z%!T}`nP+Y#LFzb3_(3{;4kEQ*5rV4>uZy5VG6F!plf;Goudvwc40D4@-S7l
z_wDDpEnzlGSc2tYqji9~x?)=1`YENp(+Q0YK>{|_!&?<l`4u?oaA@;Ez=2W1)ZWPx
z5J*8d4doqB7=b`+XdJ)p8k?gas4@lGI;(hm0>F9l5Z`}>RsVVbF5sw*xZDcdjG<fg
z1W9)uyz>{-AL~ig!`(nN19h&=Ne(CnFD@qLx`0gSw(e?4PWpz|QJ9!;6OcrSAe$$R
z<m2Vzk;`00G(mbIH17(fXTixcV45HNPFH15+7j7m4XqjqT46*x#76W1ioI-MJ+?HR
zsYWS)P|8Ho!`{r=A#Ux*xcm&0b<=zLwYwOW{T}tN`K0SjF62*hAejTot!#2PV3HLy
zCU-gd=_s{3q=Yb)ymz<PuMR2SU`%uwwZ~q<nnzEhrSbnU_A8^QItES%!DPpPmD2~v
zDT}|&8d{a9LDbis>kBaZ0?szT(a<I!l(re`o`$*I-sW#(O4aqf$FKiA>b^J73t%pW
zOjMtnn>#g7dJzXto7obTKv`YmISg}eS8z)pEwB~EOjX)`3Si}=yVhNXU_bI?KKm6c
zrDMWfw7mBgCw_1y`+oie0>lR8GL*J=k1Gdv7l&#;NNsqS9o}u$5KWr0a?+bt+l96n
zqrXxZ?h@E|1Ny!fQS;zEOz(-6x%s%$1Eq^8%b#R$9gq8yB&MIpG7P=A3fusx_ap>C
zmVlElAm5*}z6ULi1<M3ciW!~1k;N=!N&O!<RL=$RB~0b<z@Wg-Q3IRX!`&h~t#b>?
z^%gLN0KYP^B)|8eVk_*+Ly|Fep7$YXU@5HsHR_%hQE!+K_zy5O?{czp1EsQ)=LL+H
zX&l4PoJnEwW9L{?dpA&F5>1k2O9j4sO&BPQJ46El5zgI+!Ak%rhRq2=?^l3RM)Q6f
z(Bd@&t1-oWPhr4z34Ahq1J&(ssSOT!%_pR5Na|jP9>*&~B)fs=Ruez{mV!(}dM<4E
zBkG=4ao;e0qjND%_MGH^ayjt0ox(?N!S=4K7WtB$@l$|ebXwBB3RY_fMh%BAkqqJ_
zA(8{i!AnBIq6kgz23ful#6Avt98-xPiV6DMiD4KV1ssFvGvgohog1!WKn-DbbO&qK
zdVAtl>r{Z_8qHH+Jhh!$w&<pT4jM#549JDjke&z2evSU;TvBsP&iDUe$X7Ypxq-3+
z<9>O~`fFxlT>QiJzAwkjuO?tWpd6IIZHM(sKnEdIXl8tpFiBV1Dy%u_6;)cS0#pxd
zg48Nlu_?gPXfch))w1h%Br`{Ng)*XcTn+rjZhW(>hB=0<og?D`q}mEUv-{sJCPELH
zs5(|7b+9J9+pRaK%mUNSzl$)W(gCCm^y{c4x4=K%CHbC7A-f<4k~y(J`6#Ajm%wlw
z4`=w?j-{9ahmDv-<w<}*rzLIg!`c?`?XHRVK_Y=Xbgp4Y-vE+;jt?QR0-9@~S-}P$
z)E7$f&xvvH5gnWnYowq7-y9(0(^d_U>3!XTDdu~Zb*GHQH2B&ds322%qAlz1p=pZS
zngOf&a2KR3U?#|LbUZU2Ji>k{g3X-_0Ixv5$ogHKzj!UgA4GqA_y2G2Ok*TTuKWIr
zh|H|3>*{lQj-J`sUGDD8P+C)5$rJ@kprub11q%?&4+3PFA7n}(WZ8mEjX^Hp2Bb9&
z+l2hVYT1yX53(r2CS)2iNf|O%2SqL@a?Rx~XU98x?;PDT)7{fYb$4ZEWcouybyZha
zb=TR~<O2%XFQc+LGBV<y@BQP&3;4nkm22={Ftgi92v8z5pnMsVH02rl$@TbC-@}CO
zu2^^bNz*ko=-cqt4cN#FE{fQ8P_wT@oaAn6D}jX9CSd+9Eao8c&HC*8D12-}@dM!~
zh0q68u{)L3;2>u~vuMZqf_2CL3X@!I8nda^j|123vzoA<V$VP*2Mna$geKKM6w(9@
zF802!`|Ggu+eH88t3+Rld1n<qhuN_$0m(!ff$|Yd@~W9$hchPO)c?lBOg@U4dCi&L
zT!DKp!n=`480%+h>vBw59N{Jpp)F9Pp!7a?@EBxb2p2(q2h#6B>EDC?NssWO<EZff
zk@6eBvi2gXCCV#eD3*0#(RvUsV?wun-h$<Id(B1brjPIW((EW8eFzq1>;FB4Nx0HN
z_V!rr-uyJ<pZ_+&*WoW?_>}F;i6qhtl>e~KU3DEsxsI8%dBGBCKgf1?N(Au+RQ?KH
zy#w(D7|F#Z4Hp6^fRv~tjIyn`m|bzs+jZji$KaJKa6b)ya0mYOf0KOpJ1L5PFOU19
zONeq@&qBTfR%&_HMl1jZ80K%Og-v$DernH2+2^V-GwBYHJJf}z=6_Gna=Bq=U^@>e
zCWwD$jn$XUn(co>5=fp%d!VeFba4dHycsX@?0yr9?_wqk-mzB82Qk*ELB3eS=1cI>
zO;|3&<dh)o#Ryr0fGkp&tlEj}Ew$%RR`B>Fq_<$H1Yf-m*WOe7_#YIx{Bnhnk8YtJ
z6^Kk+Uw2JA(9BrMWiR;+%;Zqny6Z(uPVrIu_hf^sU$W12jQZZ;gK`(nVP^EJgZQy|
zE+V+i;$!e9>+m9G;$|!9X^HFsl=W9{JP-F?Fngt(It{928088kko?>B1zf`9pFUOp
zN(kX=aN{Mon}v}X81Z71ti{O{02g5sye86_C}7Nm%`r$-VRH&@jY<A^#pA|{qx_wF
zcbR-9B=Zr09FGmHq4si~_i`D2*#gtTKDC;nJ{eS^o{6%yfrz5M<5**6d)07PHTi<|
zQmVsfzT1F9maV5FUYLhJ#3Y_vO?p-$9Rp?j9xOf&uU5@&eUowX7^`3wCcJ=&n5b<u
zaEW?;NdvgiJMiAO;6@DD^H9zUl#K1HqeE;b3{*N<l+&%GB$RScO@XRH&Vh}R;w5i{
z`wup_@<%KD(2Fs}4}<y<P@@*7T3VRx<kMY%)xuG4GE>1KQ04ol;SVF@3f)b5QzD%M
zWfiy%3opWV*1^95m!AT$4WWVg0$;c8c4*zJE7l!L@A$#^J-Gd6aBUsp%TOMLl!z_p
z3fp7TAi&F#AY~73c+rIiV^F<g)@$b^IC;fVYLqYMw|MnVm8X9%=E~O~_Y9<d0_3E9
zrl}@>K5hk|w@*S-&0B*vW`&zG@IQQ$`R5HDmfU`c3=SxRufbby!fO$1J_Q$l6fQcT
zWCcU&f5QUg7G^Tw3Wkd;?*6s6;Pzj@->kvLMVOg}tPqIpM20RpE|~=t5;ECjXUCo%
znuM_;+}Q%PY``uhB~Cg;${puUYMwVnL%wwvuKaiSz&A`fHRl;{F98#nWuq>{%k{sF
zH~#VC-aIz}!88%eEW8iCylR4lU!nh<E)scI4V3qf|4KYx7$bUrmh(TT`CF-F9NtE7
z!@iWaEbla9L2{z?FTDoy&%@uWz{*89a{)%v0zrc{DJCE`*DDWZ9))bO5o1rHf%z(|
z+<|!AT7@x$L_{nS=tU}8Q{9A94`BQOTn^zv3G$~P^%STN!V?RZ$vg?pIH<9YhboVQ
z<QV0X1j_~afTTcx&$~~+*H+BxhifDgHHq{Kl*Ol~;@po(9-9_CZfrg~47CNwGr&{U
z-EJ|98JMp4_BY|%%TSqtGmpVot~rNI79q|O$1V`z6(twX*i37Q^dwsmENsB~Z4f>t
zct17|CFCBO2gFg#MhKO_?9o$Lg;T3=LBo>;h=1WSPXJ^5GG(_)_5wJkL5+dR0uCY4
za@hxzy}S$8+JNIZV(yu}MrPoD`DT*lR^nnOGB7W0>Stqq!0{R1KBX|>AZIaQ8710=
zd2B-PO?cyba4m$&6EJ=ON*;JL20uFnXk+_3LXs^+NSUByKa!F#ngYK7{vwFD*5WP>
z<2Y2&a)W{gBOX*U;1}Vo0A8=c3l$SZ`~Lu_;stR2229;B({m|@1xFI7D|jd>@-$_k
zSf{{*wbD{3JnAa~<&c1M9z%}D+jj05A{N;I-nk54Uo@LjzJi%`OeB%P0_9IQKZC@#
zrlF#~R(PLC@LN#*b9nhCyq<#alHnvrU2t}QqyR=ijBKy#7B1wnGT|rtbq9d7f<h4%
zD-dtiU2yaKCQ#g>mR3wj6R?w45P4>EGb4tV^w|+^{)+c3)1t)sr80NaG|^On`(l!)
zILfW4fRf{&6h*QGlo-W9iV{m?7$pm&*+6cmwD&E@xqwD&?;@*gM~H1F4D9)OqP2@e
zED}+rf|;#;<0<&R%O(c$Ivr)bNF<RyfKs-al-WyG%zOL(OYp5#xLW}CGF%ulk#jpi
z63pJ+qlj2;pLL6nbD=3UK_b09K=K|`#$a<EMA+zpk64dj5gNH-VzdO80QjX=KRd^-
z^TFS$@<QP*zf*$rG@Q=E)P%w1Oc6%PP*#%!nKYS_<gQaf6kJF-+{<K$Q&~`w3MnMY
zLZd*SkWwNM2<+Cm#0b7f#2O(1o0uToCE)hc@b(hC<{MDFW3Ac5txn|N##zVTv|&UW
z--Fi{;7tLm7a(^Y&gUCf1vi3Z8Z*VJ>REyu$d_u)d;*e#uqsmu$~g!|AY5s5!7<i6
zRZKRa+Vc@8Vhf-xlGy$x&wQrJeIGu1&xAeHcG+$I*G$|cmx4zWJW_xO7jg>Rw4pd1
z2~G;60-?-K5K@|;hfqSG*mh?sUxK^q@NQt1do594RGZ|OO5}(GWdOVZ!He+L9e6#2
zr2>e@;MBMo8R?c68rKif^?@tEDM2ZfH2fe%0V4|5$6&1r@m3?WxR|Ae8neE;29}$^
z7hC<@H$Qg=>BH|~(haqG18&Pbv$EwS`$^<P$y|$bpGbgmmj(G21mA(%cj5XL-1i`Q
z5;9Y8dc^QuUfZENZd^aX4sNnkZUwA~3qA-Jd@KdQIBea4c!!~wwqSXO`ih&^TebP~
ze3Hp|laKL#CawA~1JB$Z=Ra{w+IevGbhri-FsK(}ILKQNyal(H;MGl7cECRi&LeQP
zWWJu>)4mx8$|iKO!J2f-P;6;U$^<M2;DTo)OyuFV58-{9HpR(dR#M%?%zf+%FZ{23
zk`H{!EW!Fu3~9l20+PcY)WfUmQ3uPpp|!2^##hV|xQu0>)->GLa5IKA2R6@vnt_P|
zjJwSl3Y#ZxYN17CQ`*3li42rW7GPUqVgi<f0Lu{xV<osBfL?BPm}_8p6SGXQq41w^
z`BNsm<~fdZ(%N=|_$XUBb0@I39W}5VZX3%N;&q<)HD9U1SE`!7h}U_gpjmtjf*;XL
zTv_L-G0j;Qa%ek-v>ldVgRZP;YQyRT#017fbpkRIP;`wR%fQZA)>f1)V+@%U3zju~
zxv9LBzGBbydOUexS#%*kPMh5=)4-qFc2>YY0OtPsGd@1>`-X5ij({_F4C~zdy}4rs
zICICOjr*^sjDO6b`eE4mkom+Pc1V2)&OQN8mf*bWkfSk^kke#IIu;x!sZHM0Ty8UR
zJ)AMKQpe16+fejfhT}+sW!b2+kDluDc=E&r#y!YP(uRee$AoPO;3I#+Cz<e>`wC`r
zons6*bH}jGN9i7pTYbBI5%mF-PmQ=-D#7JZ&6A_>zP!u(6r4g^fUK>`sacV(1<9IT
z#N;Hj(aXZIF1N83MZuvo3V9hc04oTZt;(8H->t5w2g~<zJeiUL#z(*zWoKZI07FPm
zK=7~N*LeI>#t;8}m^-3tqEDigbJXtPIMM@i2X>D#jUoqR3CIIEl!daO0f>av;|AL@
z!UQwVSnJMAvx?ZYwq^(!C{DVJD-hf9dNtq;tySq;y|!s>x4LUVyVv8%l{_$729a;T
z$ruo6;4O4etXvI=fIkA>K6(RY?jae#hYehF$EdFT{?Fd7YjA*@1CK*?CM^sbOp>g1
zvrkbE5c0RbX*_J7%%llfQ9A&R?eB|@fUvqxdE<9_J)T@Cxsac#H&@J6M6AFcA@x<2
zjtoG4@#q26akI#V@xKrG8O*l$Jfy(xwEPoc^~NdF+FmPT)>dhbKW>PqRG=n3rgDv8
zL|&WkZ$Oj<=~)omu%o)BZ&Ke)uvK}@(d_4Va>WHEQcyhw)muQdO3WDg=0A;Jh=_r&
z(sq}w!<yM_*O3LCFVZ=Ty3g$oJk9s<>|x)>T-&-{ZE^a!*}dv~5N+N8$kp2U*}=7|
zQ|B5z>fB?aiyYaqJcf^K2A7@OBPu{m!c@tzMod%rE`5VoW)YDGvK0{4bhiyq_QOv;
z9LX@#z;qVwoPp|m1Z%fgdb=1#8Xx%b(E^-7faF2fy|cl4br)G28{p{(Fb@kP8@)<%
zes8cm>=%*PuKRPd@xa<v8eohYyzoXKtL+JW4wIKM)!>4=whbF}1!^p0tOR9T+r+!M
z$(?$|&Vsvka;LJZe5VE4T;2~q`S5Hio&%<{ze4tmj}E=B&EJ!6N3r-K@ZSDc|Ly?|
zf(}4(_9(lAoq}ZjzOK^RavT0VwExZBAi4AJtL)Y0b3^PO`?vAcru(?sbDwLrC^voZ
zGG=>3Ex?!H70j+w+5^7|p2v1lEZ;YK%sMtxO-=XAC1V+%(b%bD;+79-^Zk~(vkq$@
zZb1Avh}_c#3vU3Amm&Xslh5G>@HmiPhqbt_iz<wyVZFy=k%tH@x0t3x@QtfuE0Gw*
z;Y<9KsPdtBpSNzza95D**IDB|-ND0i3FrC%$)=aUzLw=6?_sV(dZ1NZ&GXpXvK(}K
z&-K{G4Q<<}RVjY>=l*4^q=%zM2(^cf1V(oWb%2gSlyr9L%E6T`K}}CPq^4ZP3IW+5
zB;z_r$0Z5_wt|rK9=deCPi5^q@7^jib7q-rzRboNyn72~&Ok2z-5uq*{5w`JGIM4H
z;bq9C(ri?>dOAMx&;aE>!Mt%?{@t(s_Jg|_RghKGN1laeh<UCn7v&%ZL6fUJyT9eN
z|2=%-h=Jtpm%;GwVQ!!Lwgbr)FRp#-doaL$wS)Th+pbc`8Q>J?Jdi?2>*8t~2PvJp
zE{rZ>h-><YLuwkP3ISt)<JPQ6bG_O}Cp7Vp*_{1<)-%u6!X%r@>$;%~T%{lkdOkip
zvS#U&k8?kzikUK>mA?wlG`N6!yRgG>ulfN=LG#`e``^Q$!gdA?l67!8n0x34BwM)Q
zL#ylD06?<S{=IiyrBogu2qS|~QW@TEhc1jRVxz}EC_=<I<j=dD9)V(DzVABb`lv%a
z(q_uXOZir}jHI12+FjnL3zXv$Y2EYj;gS?^fs}_R-{j?gobR?X4SEpl?`pRP$zBF-
zcf3^3_dF}Q1j&N}%eeu7WQ%8TsKDNNefw$Gn!QLA`j)h8(1l&F7#lqX92-U{CVa*w
z;hbl}%>!+&-<}fcQ1^WUeCbS0Uj~**XUx&xYA)ZYOF#!zB#}MR)$!qwPut^Zc(#nI
z;Pwcg&$XEJzuEv$`^)bR4{&DNk@2F>f!oUfp6e1M`<KCk<$jYl!vywWSdzWexp%PK
z4mgh;Z^!+|j<>yDI|gFU0}sR`q-S8N<S|V>SV*g#agv?tdea;|Z=<zd^&o0r4iLC0
zKoYoKgWmb^<jW#vhJT6AhG=Jm|D5}!R>4t%9W$}}cK)~ru<RTpTf5qW9Jq7+4cMW8
z<S?j&{U&cj-}N2bO!!=feWUj}_tLI%n|oAsE>gsXi;RtrY-Y449a86DvK(+xL8(hF
zvYqZ%4Y(<_(N@<IlxSVPlXrBw=P4fwsoHnqFE06!Sk5l+{4eJB>-?e%u<SHpML!@p
zEGuWOO+C8-$iZ2Xy-^9hgXGl#*0+DYa`+(GSzUM6MTQveQOP<t83WRBAq9FgBy}Dp
zrd=LM!)Oqiy&AjZBHQU(6`NDYskGG<;CQXe+w+fMM?B@jBM$uf^hO-;;I7-+?e5K0
z>7<i)xSFDGkn9I6d*?2j<M##)mc6^Rb3+E57WJJSQXd&;eZ`JG*GZiuzTqB~^=u;P
z!zj2jkbVTlOFkDoIBlJ`Ub)D2y1xNXM)EXJz<)A;d<MxAkXQH{%Rq?3B(R3R@j65c
zNF?wkI!GhY=paOL8y&o9kJ_I1+LVV#9;V5h(U(6{9g%^{pShptW=)dlg14NbeU|BN
z`AEU=UBW)aT9U()ZYFo;4iO~#=Kv25BzM-eQ_E87vIk=zra@c;_i>NXwAoqlqJon0
zcC6Cwm5XerZ)DA+jrpu{o^^6;0$b$JY-Fu9WOk%xBRhtcQxKg4E)uxcfCT~<V2Z%K
zWRKYM*Ma%A<tJbMxjFpCxr~pH-WI?1kMezVszF<51G6Igr4V`<yu+|0`vLs9Lj=ig
zIKb{Gnc>y96D!zSl;s(R(Mgyr1U#08$2^B~KrReWeQ=MR>e<|@z?%@hXMt-G6Z5wT
zgf^a1L6`<IWOE}Z3dB(vqB5?!1mP5}0>TAcb<G~J=PyBc%IfpG%1^$m04}rZkGM!S
zwtkN4h#2;O?bcEllodG$3ZYYqKpfyR>;)_j8g#m;Ylkn=ZHs-l_3gw8mghW|X=%8}
zG~f-0d+b#AQcnRFiS#*40^nM9q72~JcuGyAw}4H&)H<+Ate4Sp8Rc9f(hDdDB0Yt2
zF4-gYd}H}3TRyQ}e)1&*<aaB~2$`b#GpGCMb^`><mLSQ&42ao&>MRZzBnQ~`vj@@6
zgX<>;W3hJzmeR3&;h?$4PW5!gY)0n$WuO3SBe0f%wKS|L(it<@eSZ^JBb`|U7V!P|
zP`ruc5;~YdMxcWQB-iW_bG}wiWBEO+Pdps-<Zq@@FzKZx`47{@qcLC)79@M65DwFd
z9B|torWM?i)h-UaZTD(dIV|q6Q{D3nKdCnjM_KXKsjx|9bBhWZ&jWDKn}(zGyfI)3
zy=gc~xJKYE5K9Qu6mW^aH7<4FE^L<@y}A6}LxGc@TPjPOOf<gA=kwwy4A^12+5@Wl
z>|tAx1L6S>4dgrL0C!vMN2^`su(-!gb)^hP=~oR$sg&U;{i@+8O{k;7uNsb0sS%)n
zU$xufhL>>F6e0xWE<kt<S1mvYuA15|H+qZm6D|J&fTijgR|+;){yr<>FaT$lRdyHv
z+2Nq5Su=JS;!y+0?!Z#?v7GV{Kz;UTwD<1%3gkg?k?nNPF&yPq#c-6KV>rsKisdLB
z0L@m#a+HqYD7Pxc5{>jVl(Rsj!F8sH^d*!tMHFDq*UMF7xi;k|TTHefpED>&1RotZ
z)6n6p@+=*OVjQHU(^U7_#(KtF?K(;DLD!xAUEA5C(B>V!P>)PqTh%v4cF!$l0N3hn
z58ULs`Ny>iP=<UN|H(3B3&?N;(i!~oX;2Ee2Ivrfd=u8!kT(}$aRFbx2k*X#PF+Ik
zDRcz#{sQ{eHRSyT0x;*@*5x`f<tJMLKz<LVaf<xuSndG$o!R|d?V|@gH4wjgte&l4
z&%o(fal~FsdxPcCvfOvq*U`$`k>`7VeWlCqH|rC)_`p4&2y4saFd4Wt^^GS^VHU?#
z0IeMI%3(8QY^2zJ7J!RyUPBj3M7aV><taADPm|G_oWF@)Ucgy>fF3Ck<y)6Cdin$d
zWdxtWgHk3x&A-ixVFQlMsW?jui$@%B(1}~~YsUaEceMMn;)qyht=sr2Hiu;+)p0~$
zppEr)y5|<{w5iP-sobE;>n%Wr6M#?UjaR`<f$N$~>W%}-1J?n^1?8ZWLJ8NTE)oia
z#FCfX%9po+ueiLx=;{M>p+uM~uwsERt2J4Flj7n6qw71%PrCfpnj>%udg>f^#esA#
zTDYy^SO88PEX6T<%5@9qx!I#^88>Eg?_*Z{pk)>u*Kr{X40q@{?60ptXmVxXg6kB!
zynX^gpD4HoZjqahK80&t^Az>{AEiAiKxvIYBSWJ%?k=9YcV`zcwgb-9u_-ntPm>8W
zxzLoKY>N^qp(`CPRXuZR*M7l6AGpU)#Ib+gSC2s(Up<Cx>PYME2HMAU9VFi+;v#`A
z;JT|w+@|s(5dneTz;(0izP=M(5NHqA6`akN8~kz&aRjl3Fork)t<gF(7HJTI_8|<-
z-aSFUgUdg(uSHoaFDx%mUVT7dUG<gX$+sv&9O-$kKQ%@oi6qjaY;Wehn@glmF0wN{
zx3*kAXW!{HuClgyu2v4Aa)?sK<Bu_k!y@V&WhWM8b9sJc0me_XMfnP-tXpJpES+@r
zL=x#8D0gv*SiNSF3^$JQAUMi)<!dLMqkI+*WF|k!fAo^Ro=76S1LbZm5z9SdxyVkr
z$KLdV<S1K}pJa~mUssSgBAS@u)e}I!C6dVD0cD^wxGt7ER0R6{xNd}GiwKWEYg~5&
zNkoJu$Y@+lF2~5x1Y6&2xE=z{-g*^W&*}os=6{wQzIQG5r{-hpisdLH^J7|Dj#5LQ
zd2rb!qpRfnC5p?6(NzasP=q<fN;${oc#(`&<a{VDM~tq5E(pTh2rK206a8>20g<Cz
zJvm7!!O27t=>sTtbCG-NsrCBb640vH)%Dd9C=K!fM0v=qePIVq?&c_e8m%BywBaa0
z7tAiUD`nUmhm6JoBNiCjmos{DA8rr{90xs~=g*U_o=75n0A-zvG>854jV2>Zg~hI}
zFFb%S5341}YN)*N5rd>ICepm-Z@aa>D=1|%ushTjBv{}3R=zu6Y%V{^5|a@^i7-Es
zbo4|L=?f_9TqI50WNSUUzVip7kz!ZZ*8s8xm^UB&!af}3PouOs-<qRLEXut^xo(_I
zB^^DHM7lLI>LMEBC@q(G9ikZsvfyr*gq4lu8za^_+yc^&CEpo0Y4rjoL~_-EYz$}f
zA7h8_-IAlUdSJg30>057Tuv;?_To#WgifiX+b5DpUl!#yMp-WL9Za6_bR7$KlxHpQ
zZK+yWdPjNl@3qn;;3#uUILhI^7L{^!f|H3P(l1apbBWEeFZY<*r+ja{^2Wy!j&gV+
zln`;!%@awaPoQk(5}Rdz?$PUrn{1~i9OZB=N+DyJbn`?K=@Te}4BJ2zN#Jn>v4X$_
z1p#m4Zh?#;(w1w~AT>l<5L}n_>oGK9H~QJ1{8%F_TNsS20}fO*I-p@a<Ic|m37IX(
z1yEEls@QhbSJJSVH`|ouBot#9)u0808Cc1j{O2pB_LFX&NFsd>q{azR0i0zXVF676
zn)7T?pJUO$2K70WcZ*S975L#V?``mG{oOiz*8YFg@c$)dUMI5kmG&qw>}j^a`mFJv
zHS6`{PX>!IC4)-R%@awaPoUg=>Qq-hkR7S^Re^6jvv;<J4^)$f)U%`|;3uwkB8hZw
eWKa(giuwOOHG%!ZyJh_V0000<MNUMnLSTXcEgTpC

diff --git a/app/javascript/flavours/glitch/images/mbstobon-ui-3.png b/app/javascript/flavours/glitch/images/mbstobon-ui-3.png
deleted file mode 100644
index a1fb642a003b2e2b652b1e6022a84f08dc76105f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 32449
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%0Arc|r&DC@j0pAQE7yV9T$8x=q-T1FG
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
Cr$1f*

diff --git a/app/javascript/flavours/glitch/styles/components/drawer.scss b/app/javascript/flavours/glitch/styles/components/drawer.scss
index f4931c36cc..df6d848c60 100644
--- a/app/javascript/flavours/glitch/styles/components/drawer.scss
+++ b/app/javascript/flavours/glitch/styles/components/drawer.scss
@@ -325,21 +325,3 @@
   height: 100%;
   background: rgba($base-overlay-background, 0.5);
 }
-
-@for $i from 0 through 3 {
-  .mbstobon-#{$i} .drawer__inner__mastodon {
-    @if $i == 3 {
-      background: url('~flavours/glitch/images/wave-drawer.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
-    } @else {
-      background: url('~flavours/glitch/images/wave-drawer-glitched.png') no-repeat bottom / 100% auto, lighten($ui-base-color, 13%);
-    }
-
-    & > .mastodon {
-      background: url("~flavours/glitch/images/mbstobon-ui-#{$i}.png") no-repeat left bottom / contain;
-
-      @if $i != 3 {
-        filter: contrast(50%) brightness(50%);
-      }
-    }
-  }
-}
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 4fd79ee449..fb85869418 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -908,10 +908,6 @@
 
 .missing-indicator {
   padding-top: 20px + 48px;
-
-  .regeneration-indicator__figure {
-    background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg');
-  }
 }
 
 .scrollable > div > :first-child .notification__dismiss-overlay > .wrappy {
diff --git a/app/javascript/flavours/glitch/styles/components/modal.scss b/app/javascript/flavours/glitch/styles/components/modal.scss
index 3598959e73..d15111827e 100644
--- a/app/javascript/flavours/glitch/styles/components/modal.scss
+++ b/app/javascript/flavours/glitch/styles/components/modal.scss
@@ -255,7 +255,6 @@
 }
 
 .onboarding-modal__page__wrapper-0 {
-  background: url('~images/elephant_ui_greeting.svg') no-repeat left bottom / auto 250px;
   height: 100%;
   padding: 0;
 }
diff --git a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss
index 178df66525..e550552d7d 100644
--- a/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss
+++ b/app/javascript/flavours/glitch/styles/components/regeneration_indicator.scss
@@ -18,7 +18,6 @@
   }
 
   &__figure {
-    background: url('~flavours/glitch/images/elephant_ui_working.svg') no-repeat center 0;
     width: 100%;
     height: 160px;
     background-size: contain;
@@ -30,10 +29,6 @@
 
   &.missing-indicator {
     padding-top: 20px + 48px;
-
-    .regeneration-indicator__figure {
-      background-image: url('~flavours/glitch/images/elephant_ui_disappointed.svg');
-    }
   }
 
   &__label {
diff --git a/app/javascript/flavours/glitch/styles/modal.scss b/app/javascript/flavours/glitch/styles/modal.scss
index 10de454c69..2a0d477ac9 100644
--- a/app/javascript/flavours/glitch/styles/modal.scss
+++ b/app/javascript/flavours/glitch/styles/modal.scss
@@ -15,7 +15,6 @@
   > * {
     flex: 1;
     max-height: 235px;
-    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
   }
 }
 
diff --git a/app/javascript/images/elephant-fren.png b/app/javascript/images/elephant-fren.png
deleted file mode 100644
index 38b1e3cba5a677da3cc109e3a149112b8d940b5f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 34530
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
N002ovPDHLkV1lb~=Bxk!

diff --git a/app/javascript/images/elephant_ui_disappointed.svg b/app/javascript/images/elephant_ui_disappointed.svg
deleted file mode 100644
index 580c15a138..0000000000
--- a/app/javascript/images/elephant_ui_disappointed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" height="134.11569" width="134.61565" viewBox="0 0 134.61565 134.11569"><path d="M82.69963 103.86569c6.8 1.5 11 2.4 11.3-6.200005.3-8.6-1.8-17.3-1.8-17.3l-13.6 1.1 4.1 22.400005z" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.39963 112.96569c-.2 10.3-.6 17.5 6.5 17.4 7.1-.1 12.6 1.1 13.6-5.3 1.1-6.3 1.9-20.6.7-28.000005" class="st32" fill="#3a434e" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M86.39963 97.66569c-1.4-7.5-4.1-23.2-4.1-23.2s13.2-1.5 10.4-13c-2.7-11.4-7.5-22.6-11-31.1s-14.5-16.9-28.6-15.7c-19.2 1.6-25.6 7-31.6 23.1-5.4 14.4-10.4 47.2-8.9 63.3.8 8.7 5 13.7 14.4 13.5 9.4-.2 39.8-.8 49.8-2.8.3-.1.6-.1.9-.2" class="st33" fill="#56606b"/><path d="M85.89963 97.76569l-4.1-23.2c0-.3.1-.5.4-.6 2.6-.4 5.3-1.4 7.3-3.1 1-.8 1.9-1.9 2.4-3.1.5-1.2.7-2.5.6-3.9 0-1.3-.4-2.6-.7-4-.3-1.3-.7-2.7-1.1-4-.8-2.7-1.7-5.3-2.6-7.9-1.9-5.2-4-10.4-6.1-15.5-.5-1.3-1-2.6-1.7-3.8-.6-1.2-1.4-2.3-2.3-3.4-1.7-2.1-3.8-4-6-5.5-4.6-3-10-4.7-15.4-4.9-2.7-.1-5.5.3-8.2.6-2.7.4-5.5.9-8.1 1.7-2.6.8-5.1 1.9-7.3 3.5s-4.1 3.6-5.6 5.8c-1.5 2.3-2.8 4.7-3.9 7.3-.6 1.3-1.1 2.5-1.6 3.8-.4 1.3-.9 2.6-1.3 3.9-1.6 5.3-2.8 10.7-3.9 16.1-1 5.4-1.9 10.9-2.6 16.4-.7 5.5-1.2 11-1.3 16.6-.1 2.8-.1 5.5.1 8.3.1 2.8.5 5.5 1.6 8 1 2.5 2.9 4.6 5.4 5.7 2.4 1.1 5.2 1.3 8 1.3 5.6-.1 11.1-.2 16.7-.4 11.1-.4 22.2-.8 33.2-2.3.1 0 .2.1.2.2s0 .2-.1.2c-2.7.9-5.5 1.2-8.3 1.4-2.8.2-5.6.5-8.3.6-5.6.3-11.1.6-16.7.7-5.6.2-11.1.3-16.7.4-2.8.1-5.7-.1-8.4-1.3s-4.7-3.5-5.8-6.2c-1.1-2.6-1.5-5.5-1.6-8.3-.2-2.8-.2-5.6-.1-8.4.2-5.6.7-11.1 1.3-16.7.7-5.5 1.5-11 2.6-16.5s2.3-10.9 3.9-16.3c.4-1.3.9-2.7 1.3-4 .5-1.3 1-2.6 1.6-3.9 1.1-2.6 2.4-5.1 4-7.4 1.6-2.3 3.6-4.4 5.9-6.1 2.3-1.7 4.9-2.8 7.6-3.7 2.7-.8 5.5-1.4 8.2-1.7 2.8-.3 5.5-.7 8.4-.6 5.6.2 11.2 1.9 15.9 5 2.4 1.6 4.5 3.5 6.3 5.7.9 1.1 1.7 2.3 2.4 3.5.7 1.3 1.2 2.6 1.7 3.9 2.1 5.1 4.2 10.3 6.1 15.5.9 2.6 1.8 5.3 2.6 7.9.4 1.3.8 2.7 1.1 4 .3 1.3.7 2.7.8 4.2.1 1.4-.1 2.9-.7 4.3s-1.5 2.5-2.6 3.5c-2.3 1.9-5 2.8-7.9 3.3l.4-.6 4.1 23.2c0 .3-.1.5-.4.6-.3.1-.7.5-.7.2z"/><path d="M26.49963 114.06569c-4.7 0-7.4-2.1-10-4.4-2.3-2-3.2-4.6-3.4-8.6-.1-2.700005-.6-10.000005.4-18.800005 3.8.9 9.7 3.8 13.4 7.6 5.6 5.7 17.7 6.3 22.7 6.3h1.8l.1-.4s.5-2.6 1.8-5.2l.3-.6-.7-.1c-.4-.1-10.9-1.9-9.7-10.8.7-4.9 13.3-7.9 33.9-7.9 2.2 0 3.8 0 4.2.1l3.5 2.2c-1.5.5-2.6.6-2.6.6l-.5.1.1.5c0 .2 2.8 16.4 4.1 24 0 0-7.9 13.100005-8 13.000005-.1-.1-.3-.1-.3-.1-.3 0-.7.1-.9.1-9.9 1.7-39.6 2.4-49.3 2.6l-.9-.2z" class="st34" fill="#3a434e"/><path d="M45.89963 51.36569c-.7 0-1.4-.6-1.4-1.4v-5.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v5.1c-.1.8-.7 1.4-1.4 1.4z"/><path d="M72.89963 30.365685c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" class="st35" fill="#4f5862"/><path d="M44.29963 53.965685c-.4.7-1.5.2-2.7-.6-1.2-.8-2.1-1.5-1.6-2.2.4-.7 1.6-.4 2.8.4 1.2.8 2 1.7 1.5 2.4z" class="st34" fill="#4f5862"/><path d="M27.29963 36.165685c0-5.6-3.7-9.4-7.9-9.8-4.2-.4-9-.3-14.0000002 11.3-5.00000001 11.6-6.7 15.7-2.6 17.9 4.1 2.2 9.5000002 1.5 11.3000002-1.4 0 0 5.3 3.8 9.7-3.8" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z" class="st34" fill="#3a434e" fill-opacity="0"/><path d="M9.7996298 43.365685l4.4000002-9s1.8 6.3 7.8 4.9" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M27.89963 67.365685c-4.9.8-9.7 4.5-9.3 15.7.4 11.2.5 18.700005 6.1 20.000005 5.5 1.3 13.8.3 14.1-7.100005.3-7.4.3-16.1.3-16.1" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M28.69963 102.96569c-1.4 0-2.8-.2-4.1-.5-1.2-.3-2.2-.9-3-2 .5.2 1.1.3 1.7.3 1.2 0 5.2-.5 5.8-7.200005.7-7.4 2.8-10.9 6.6-10.9.8 0 1.6.1 2.6.4 0 3.4-.1 8.3-.2 12.7-.2 6.700005-7.2 7.200005-9.4 7.200005z" class="st34" fill="#3a434e"/><path d="M50.69963 18.965685c-5.2 2.9-14.6 4.7-18.1-1.5-3-5.4 2.1-9.6999996 7.8-9.9999996 5.7-.3 7.6 1.2 7.6 1.2s1.9-5.9 9.3-7.69999998c3.9-1 6-.1 6.2 1.19999998 0 0 3.6-.9 4 3.5 0 0 3.9-.4 3.1 5.1999996-.8 5.6-10.6 10.1-17.7 6.4 0 0-1.1 1.2-2.2 1.7z" class="st33" fill="#56606b"/><path d="M40.79963 21.665685c-2.7 0-4.8-.9-6.3-2.3-.7-1.1-.8-2.9-.3-4.3.8-1.9 2.6-3.3 4.6-3.7 1.2-.2 2.6-.4 3.9-.4 3.3 0 6.2.8 7.3 1.9l.6.6.3-.7s.7-2 2.2-2c.2 0 .5.1.8.2 2.2.9 3.5 1.2 4.6 1.2.5 0 .9-.1 1.3-.2.1-.1.4-.1.6-.1.6 0 1.5.3 1.8.8.2.3.2.6.1 1l-.2.6h.7c.4 0 1.4.2 1.8.9.2.4.2 1-.2 1.7-1.8.8-3.8 1.2-5.7 1.2-2 0-4 0-5.6-.8 0 0-1.2 1.3-2.2 1.8-3.1 1.6-7 2.6-10.1 2.6z" class="st34" fill="#3a434e" fill-opacity=".94117647"/><path d="M61.79963 18.66569c-3.1.5-6.3.1-8.9-1.5.7.2 1.5.4 2.2.5.7.2 1.4.2 2.2.3.7.1 1.4 0 2.2 0 .7-.1 1.4-.1 2.2-.2h.1c.3 0 .5.1.6.4-.1.2-.3.5-.6.5z"/><path d="M37.59963 21.26569c-2.4-.4-4.8-2.1-5.7-4.5-.5-1.2-.7-2.6-.3-3.9.3-1.3 1.1-2.4 2.1-3.3 2-1.7 4.6-2.5 7.1-2.6 1.3-.1 2.5 0 3.8.1.6.1 1.3.2 1.9.4.6.2 1.2.4 1.9.8l-.8.2c.6-1.6 1.6-3 2.8-4.2 1.2-1.2 2.6-2.2 4.1-2.9 1.5-.7 3.2-1.1 4.8-1.3.8-.1 1.7-.1 2.6.1.4.1.9.3 1.3.6s.7.8.8 1.3l-.6-.4c.6-.1 1.2-.1 1.7 0 .6.1 1.1.4 1.6.8.4.4.7.9.9 1.5.1.3.2.5.2.8l.1.8-.5-.4c1 0 1.9.3 2.6.9.7.7 1 1.6 1.1 2.5.1.9 0 1.7-.1 2.5-.2.9-.5 1.7-1 2.4-.9 1.4-2.2 2.5-3.7 3.4-1.4.9-3 1.4-4.6 1.8-.3.1-.5-.1-.6-.4-.1-.3.1-.5.4-.6 1.5-.3 3-.9 4.3-1.7 1.3-.8 2.5-1.8 3.3-3.1.4-.6.7-1.3.8-2 .1-.7.2-1.5.1-2.2-.1-.7-.3-1.4-.8-1.9-.5-.4-1.2-.7-1.8-.7-.3 0-.5-.2-.5-.4l-.1-.7c-.1-.2-.1-.4-.2-.7-.2-.4-.4-.8-.7-1.1-.3-.3-.7-.5-1.1-.6-.4-.1-.9-.1-1.3 0-.3.1-.5-.1-.6-.4-.1-.5-.7-.9-1.4-1.1-.7-.2-1.5-.2-2.2-.1-1.5.2-3.1.6-4.5 1.2-1.4.7-2.7 1.6-3.8 2.7-1.1 1.1-2 2.5-2.5 3.8-.1.3-.4.4-.6.3h-.1c-.4-.2-1-.5-1.5-.6-.6-.1-1.2-.2-1.7-.3-1.2-.1-2.4-.2-3.6-.1-2.4.1-4.7.8-6.5 2.3-.9.7-1.6 1.7-1.9 2.8-.3 1.1-.2 2.3.2 3.4s1.1 2.1 1.9 2.9c.6.9 1.7 1.5 2.9 1.9z"/><path d="M63.49963 2.1656854c0 3.5-2.6 5.5-4.3 6.1m8.3-2.6c.2 3.4-3.3 5.1999996-3.3 5.1999996" class="st7" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 14.4-2.4 13.4-9s-5.4-8.7-5.4-8.7l-8.4 6.8z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.29963 84.765685c2.6 2.3 3 4.3-2.4 4.8-5.3.5-25.7 2.4-28.2 2.6-2.4.3-3.4 1.7-3.4 2.8 0 1.1.5 3.2 4 3.1 3.4-.1 23.8-1.5 30.4-2.4 6.6-.8 13.8-2.3 13.4-9-.3-5.5-3.1-7-4.4-8.1-.5-.1-1-.1-1.6-.2l-7.8 6.4z" fill="#625d28" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M102.69963 64.665685c5.4-.1 10.3-1.9 12.2-6.5 1.9-4.6 8.7-10.1 14.2-2.1 5.4 8.1 6.6 17.3 2.8 23.7-3.8 6.5-12.1 3.5-14.9-.5-2.7-4-8.6-2.9-14.5-2.7-5.9.2.2-11.9.2-11.9z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M65.89963 54.865685s10.2 21.3 13.5 26.8c3.2 5.5 12.9 6.2 17.4 3.5 4.5-2.7 7.3-7.3 8-15.1.7-7.9-2.4-14.9-10-15.2-7.6-.3-11.9 7.6-12.1 13.7" class="st36" fill="#56606b" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M90.19963 86.165685c-3.7 0-8.3-1.3-10.4-4.8-.9-1.5-2.4-4.3-4.4-8.4l5.9-.1c4 7.4 5.9 9.8 8 9.8 3.9 0 6-3.4 6.9-9.5.2-1.2.3-2.3.4-3.4.5-4.6.9-7.2 3.4-7.5.3 0 .6-.1.9-.1 2.1 0 2.5 1.2 3.1 2.8.1.2.2.5.2.7.1 1.3.1 2.7 0 4.2-.7 7.3-3.1 11.9-7.7 14.7-1.6 1-3.9 1.6-6.3 1.6z" class="st34" fill="#3a434e"/><path d="M89.19963 63.86569l-.3 6.6c-.1 1.1-.2 2.2-.4 3.3-.1.6-.3 1.1-.5 1.7-.3.5-.6 1.1-1.2 1.5-.2.1-.5.1-.7-.2-.1-.2-.1-.5.2-.7.7-.4 1.1-1.5 1.3-2.5.2-1 .4-2.1.5-3.2.2-2.2.3-4.4.5-6.6 0-.2.2-.3.3-.3.2.1.3.3.3.4z"/><path d="M52.29963 68.665685c-6.3.6-11.1 3.9-10 10.7 1.1 6.8 7.6 8.1 16 7.7 8.4-.4 26.4-1.3 26.4-1.3s-3.3-1.7-4.8-3.3c-.5-.6-1-1.4-1.6-2.5-1.6.1-15.5.8-22.7 1-3.4.1-3.8-1.2-3.9-1.8-.3-1.2.5-2.7 2.8-2.8 3.1-.2 10.8-.7 21.4-.7h11.5s.9-.3 1-9.1c0-.1-29.8 1.5-36.1 2.1z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M56.19963 86.665685c-8.8 0-12.6-2.3-13.5-7.4 0-.1 0-.2-.1-.4 1.2 1.5 3.5 2.7 5.6 2.7 1.4 0 2.6-.5 3.6-1.5.5.7 1.4 1.4 3.7 1.4h.4c6.9-.2 19.5-.8 22.1-.9.6 1.1 1.2 1.9 1.6 2.4.9 1 2.4 1.9 3.6 2.5-5 .3-18.1.9-24.7 1.2h-2.3z" class="st39" fill="#625d28"/><path d="M44.09963 57.865685c-2.2-.6-5.8-8.3-8.7-8.7-2.9-.3-6.6 1.6-3.2 8.5 3.4 6.9 8 10 14.3 8.2 6.3-1.8 12.7-5.1 14.5-8.3 1.8-3.2-.6-6.2-4.8-4.3-4.1 1.7-9.9 5.2-12.1 4.6z" fill="#b3bfcd" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M43.09963 65.865685c-4.3 0-7.7-2.7-10.4-8.4-1.4-2.8-1.7-5.1-.8-6.4.8-1.3 2.3-1.4 2.9-1.4h.6c.4 0 .8.2 1.2.6-.7.1-1.3.5-1.6 1.2-.6 1.2-.3 2.9.9 4.7l.4.6c2.1 3.1 4.1 6 7.8 6 .9 0 1.9-.2 2.9-.6 5.6-2 9.4-3.6 11.1-5.4 1.2-1.3 1.9-2.6 1.7-3.6.5.2.9.5 1.1.9.5.8.4 1.9-.2 3-1.6 2.8-7.4 6.2-14.2 8.1-1.2.5-2.3.7-3.4.7z" class="st35" fill="#93a1b5"/><path d="M13.89963 107.66569c-.1 5.1 1.3 10.2 2.3 14.8 1.3 5.5 1.3 10.1 5.2 10.7 3.9.6 10.1.9 14.4 0 4.3-.9 4.1-5.2 4.5-8.2.4-3.1 0-10.7 0-10.7s-1.1-1.4-3-1.9" class="st34" fill="#3a434e"/><path d="M14.39963 107.66569c-.1 5.2 1.3 10.3 2.5 15.4l.8 3.9c.3 1.3.6 2.5 1.1 3.6.3.5.6 1 1.1 1.4.5.3 1 .5 1.6.6 1.3.2 2.6.3 3.9.4 2.6.2 5.2.2 7.8 0 1.3-.1 2.6-.3 3.7-.7 1.1-.4 1.9-1.4 2.3-2.6.4-1.2.5-2.4.7-3.7.1-.7.2-1.3.2-1.9.1-.6.1-1.3.1-1.9 0-2.6 0-5.2-.2-7.8l.1.3c-.1-.2-.3-.4-.5-.6l-.6-.6c-.4-.4-.9-.7-1.5-.9-.1 0-.1-.1-.1-.2s.1-.1.2-.1c.6.1 1.2.3 1.7.6.3.1.5.3.8.5.3.2.5.4.8.6.1.1.1.2.1.2.1 2.6.2 5.3.2 7.9 0 .7 0 1.3-.1 2s-.2 1.3-.2 2c-.1 1.3-.3 2.7-.7 4-.5 1.3-1.5 2.6-2.8 3.1-1.4.6-2.7.7-4 .8-2.7.2-5.3.2-8 0-1.3-.1-2.6-.2-4-.4-.7-.1-1.4-.4-2-.8-.6-.5-1-1.1-1.4-1.7-.6-1.3-.9-2.6-1.2-3.9l-.8-3.9c-1.1-5.1-2.6-10.3-2.5-15.6 0-.3.2-.5.5-.5.2 0 .4.2.4.5z"/><path d="M68.19963 86.665685l.4 4.6s.3 1.5 2.4 1.5c2.1-.1 2.2-2 2.2-2l-.1-4.5-4.9.4z" class="st37" fill="#737039" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M110.49963 71.465685c-.5 1.8.5 2.9 3.8 4.6 3.3 1.8 4 5.1 8.2 6 4.3.9 8.2-4.5 3.8-10.1-4.5-5.6-14.1-6.5-15.8-.5z" class="st39" fill="#625d28"/><circle r="1.7" cy="57.765686" cx="126.09963" fill="#99988c"/><path d="M17.39963 115.26569s.8 3.9 1.1 6.3c.3 2.4.9 3.8 5.9 3.2 5-.6 4.9-1.5 5.1-6.4.2-4.9-.1-7.4-3.7-7.6-3.6-.2-9.1.7-8.4 4.5z" class="st33" fill="#56606b"/><path fill="#3a434e" class="st34" d="M11.19963 40.565685c-2.7000002 5.1-2.7000002 7.7-.5 8.5 2.2.8 4.1.7 6.4-3 0 0 2 .7 4.9-4.1.9-1.5-.7-2.6-.7-2.6s-4.8 1.3-7.1-5l-3 6.2z"/></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_greeting.svg b/app/javascript/images/elephant_ui_greeting.svg
deleted file mode 100644
index f3eb4b142a..0000000000
--- a/app/javascript/images/elephant_ui_greeting.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="266.89999" width="463.97818" viewBox="0 0 463.97818 266.89999"><g transform="translate(-184 -205.1)"><defs><path id="a" d="M184 151h494.79999v321H184z"/></defs><clipPath id="b"><use height="100%" width="100%" xlink:href="#a" overflow="visible"/></clipPath><path clip-path="url(#b)" d="M525.7 478c-.5 0-.9-.2-1.2-.6-.3-.4-.4-.9-.2-1.3.2-.6 20-65 22-72 .2-.7.5-1.4.9-2.1.1-.4.3-.8.6-1.1l.3-.3c8.2-11.9 29.8-12.9 36.2-12.9 2.4 0 5 .1 7.6.3 13.6.9 25.2 3.7 33.6 8 6.4 3.3 10.7 7.4 12.2 11.8.1.2.2.4.2.6.2.6.3 1.3.4 1.9.6 5.4-1 13.6-2 18.5-1 5-11.9 47.7-12 48.1-.2.7-.8 1.1-1.5 1.1h-97.1z"/></g><g transform="translate(-184 -205.1)"><defs><path id="c" d="M184 151h494.79999v321H184z"/></defs><clipPath id="d"><use height="100%" width="100%" xlink:href="#c" overflow="visible"/></clipPath><path clip-path="url(#d)" d="M414.9 482.9c-.6 0-1.2-.4-1.4-.9H295.2l-81.3.8c-.6 0-1.1-.3-1.3-.8h-33.9c-.8 0-1.5-.7-1.5-1.5v-168c0-.3.1-.7.3-.9l2.9-3.8c-1.4-3-5.5-12.9-2.1-21.9-.2-.4-.3-.8-.5-1.2-1.9-5-2.6-10.8-2.3-17.1 0-1.1.1-2.2.3-3.3l.4-3.1.4-2.1c.5-3.2 1.3-6 2.2-8.4 2-5.4 5.5-10.4 10-14.3 4.1-3.6 9.1-6.5 15-8.6 7.6-2.7 16.2-4.1 25.5-4.1 2.4 0 5 .1 7.5.3 2.1-3.2 4.6-5.8 7.3-7.8 1.6-1.3 3.3-2.3 4.9-3.1 1.6-.8 3.5-1.7 5.4-2.2 2.9-.9 6.2-1.4 9.6-1.4.6 0 1.3 0 1.9.1 3.6.2 7.1 1 10.5 2.4 4.4-3.1 9.4-5.2 14.6-6.2 2.3-.4 4.7-.7 7.1-.7 3.3 0 6.5.4 9.6 1.3 2.8.8 5.5 1.8 7.8 3 2.5 1.3 4.8 2.9 6.9 4.7 3.9 3.3 7.2 7.6 9.5 12.5 7.9.2 15.5 3.2 21.7 8.3 3.2 2.7 5.9 5.9 7.9 9.4 2.1 3.6 3.5 7.5 4.2 11.5.7 3.7.7 7.8.2 12.2-.6 5-1.5 8.6-3 11.9-.8 1.8-1.9 3.5-3.3 5.3-1.4 1.6-2.6 2.9-3.9 4 25.8 10.3 47.4 26.8 62.7 48 8.3 11.3 16 24.7 22.9 39.7 7.1-5.1 14.6-12.5 23.2-23.3 22.7-28.1 60.2-50.7 89-53.6 4.5-.4 9-.7 13.3-.7 18.2 0 30.4 3.9 34.1 5.3 1.8-3.1 7.3-11.3 15.7-11.3 1.5 0 3 .3 4.5.8 4.6 1.5 7.8 4.3 9.4 8.2 1.5 3.5 1.3 7.4.7 10.5 1-.3 2.1-.5 3.4-.5 3.3 0 6.4 1.4 9.2 4.2 3.8 3.8 5.2 10.5 3.4 16.5-1.5 4.9-6.3 13.7-22.2 17-5.9 1.2-11.5 1.8-16.7 1.8-11.1 0-17.2-2.8-18.9-3.8-3.9.6-37.3 6.7-56.4 42.2-3.7 6.9-8.6 15.8-14 24.3 2.8 6.9 3.5 16 2.2 26.3-2.5 18.9-10 40-10.1 40.2-.2.6-.8 1-1.4 1l-94.8.9z"/></g><g transform="translate(-184 -205.1)"><defs><path id="e" d="M184 151h494.79999v321H184z"/></defs><clipPath id="f"><use height="100%" width="100%" xlink:href="#e" overflow="visible"/></clipPath><g clip-path="url(#f)"><path d="M414.9 481.4c-8.2-22.8-2.2-33.8 10.8-38.8s27 0 40 24c0 0 7-5 11-25s10-38 27-38c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9z" fill="#ebded8" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M415.1 480.7c-6.4-18.1-4.1-29.8 7-35.9 6.6 4 12.9 11.4 18.7 22.1l.3.5.5-.3c.2-.2 5.6-4.2 9.7-18.8 4.9 4.2 9.6 10.5 14 18.6l-3.7-3.4-.8-1.9c.3-.2 12.4.2 16.4-19.8 2.4-11.8 5.7-24.7 12.7-31.8 4.9 6.5 6.7 17.6 5 30.7-2.3 17.4-8.9 36.7-9.9 39.4l-69.9.6z" class="st4" fill="#fff"/><path d="M469.8 480.5H178.7v-168l3.5-4.5c61-42 180-46.3 235 30" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.2 338c-55.6-75.9-174-72-235-30l-3.5 4.5v168h291.1S458.9 395 417.2 338z" class="st6" fill="#fccf84"/><path d="M416.8 338.3c-6.4-8.7-13.8-16.6-22-23.5-8.2-6.9-17.3-12.8-26.9-17.7-19.2-9.8-40.4-15.4-61.8-17.4-21.4-2-43.2-.7-64.3 4-10.5 2.3-20.9 5.5-30.8 9.6-10 4.1-19.6 9.1-28.5 15.1l.1-.1-3.5 4.5.1-.3v168l-.5-.5h291.1l-.5.6c-1.8-12.6-4.4-25.1-7.4-37.5-3.1-12.4-6.6-24.6-10.9-36.7-4.2-12-9-23.9-14.7-35.3-2.8-5.7-5.9-11.3-9.1-16.8-3.2-5.5-6.7-10.8-10.4-16zm.8-.6c3.8 5.2 7.3 10.5 10.6 16 3.2 5.5 6.4 11.1 9.2 16.9 5.7 11.5 10.6 23.3 14.9 35.4 4.3 12.1 7.9 24.3 11 36.8 3.1 12.4 5.8 24.9 7.7 37.6.1.7-.4 1.3-1.1 1.4h-.2l-291-.8c-.3 0-.5-.2-.5-.5v-168c0-.1 0-.2.1-.3l3.5-4.5.1-.1c9-6.1 18.6-11.1 28.6-15.2s20.4-7.3 31-9.6c21.1-4.7 43-6.1 64.6-4 21.5 2.1 42.8 7.7 62.2 17.5 9.7 4.9 18.8 10.9 27.1 17.8s15.8 14.9 22.2 23.6z"/><path d="M182.3 479.7V323.5s42.9-30 87.3 15.6 79.6 126 148 110.2c56.4-13-17 21.8-17 21.8l-218.3 8.6z" class="st7" fill="#b88671"/><path d="M179.2 312.7l3.3-4.3c16.5-11.3 37.2-19.9 60.1-24.9l79.2.8c1 .5 9.3 4.6 9 10.1-.2 3.6-4.5 9.2-23.3 15-40.8 12.5-119.2 21.1-126.2 21.8l-2.1-18.5z" class="st7" fill="#b88671"/><path d="M181.1 283.7c-6.4 10.6 1.1 24.3 1.1 24.3l11.7-7.5-12.8-16.8z" fill="#a6725c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M646.4 325.7c-.2.2-.4.5-.6.8-4.6 8.1-16.2 13.7-32.9 13.7s-25.8-8.1-25.8-8.1c-65.8 3.5-80.5 51.6-124.5 93.1-44 41.5-131.1 34.9-220.8 17l-7.5 8.8 4.5 29.4s221.6-.5 230.5-.5c-1.6-12.3-2.6-16.4-2.6-16.4 31.7-17.9 49.4-44.9 65.1-74.1 21-39 58-43 58-43s11 7 35 2c17.1-3.5 22.5-14.3 21.6-22.7z" class="st7" fill="#b88671"/><path d="M241.8 392.5c-3.8 0-7-3.1-7.1-6.9l-.2-28c0-3.8 3.1-7 6.9-7.1 3.8 0 7 3.1 7.1 6.9l.2 28c.1 3.9-3 7.1-6.9 7.1zm157.5 0c-3.8.1-7.1-3-7.2-6.8l-.7-28c-.1-3.8 3-7.1 6.8-7.2 3.8-.1 7.1 3 7.2 6.8l.7 28c.1 3.9-2.9 7.1-6.8 7.2z"/><path d="M213.9 482.3c-.4 0-.8-.3-.9-.7-7.6-21.1-3.9-34.2 11.4-40.1 3.1-1.2 6.3-1.8 9.3-1.8 11.5 0 22 8.5 31.3 25.1 1.9-2 6.7-8.4 9.8-23.6 4-20.2 10.2-38.8 28-38.8 4.1 0 7.8 1.8 10.8 5.1 5.8 6.6 8.1 18.7 6.2 33-2.5 18.8-10 39.9-10.1 40.1-.1.4-.5.7-.9.7-.1.1-94.9 1-94.9 1z" class="st4" fill="#fff"/><path d="M302.7 403.5c11 0 19 14 16 37-2.5 18.9-10 39.9-10 39.9l-94.8.9c-8.2-22.8-2.2-33.8 10.8-38.8 2.9-1.1 5.9-1.8 9-1.8 10.3 0 21 7.2 31 25.8 0 0 7-5 11-25s10-38 27-38m0-2c-18.5 0-24.8 19-29 39.6-2.6 12.9-6.4 19.3-8.6 22.1-9.3-16.2-19.9-24.4-31.5-24.4-3.2 0-6.4.6-9.7 1.9-7.5 2.9-12.4 7.6-14.5 14-2.4 7-1.5 16 2.6 27.4.3.8 1 1.3 1.9 1.3l94.8-.9c.8 0 1.6-.5 1.9-1.3.1-.2 7.6-21.3 10.1-40.3 1.9-14.6-.5-26.9-6.5-33.8-3.2-3.7-7.1-5.6-11.5-5.6z"/><path d="M282.8 480.7c7.3-7 11.4-16.5 13.5-23.5 2.1-6.9 6.8-29.2 7.8-36.6.4-3.1 1.9-10.4 6.8-10.4 1 0 2.7.5 3.9 1.1 4.2 6.7 5.4 17 3.7 29.7-2.3 17.4-8.9 36.7-9.9 39.4l-25.8.3zm-69.3.1c-7.1-20-3.6-32.6 10.6-38.1.5-.2.9-.3 1.3-.5-1.5 1.3-2.6 3.2-3.4 5.3-2.4 6.3-.9 15.2 4 24.3 2 3.6 4 6.6 6.1 8.9l-18.6.1z" class="st9" fill="#ebded8"/><path d="M264.8 465.8c-4 4-7 5-7 5" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M525.7 476.5s20-65 22-72 15-17 44-15 44 12 45 21c.6 5.1-1 13-2 18s-12 48-12 48h-97z" class="st5" fill="#fccf84" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M550.8 475.7l18-59.1c2.3.6 13.2 3.2 27.4 3.2 5.1 0 10.1-.3 14.9-1 16.8-2.2 21.9-3.9 25.1-8.9v.3c.6 5.1-1 13.1-2 17.8-.9 4.7-10.8 43.3-11.9 47.6h-71.5v.1z" class="st7" fill="#b88671"/><path d="M548.9 401.8c-2.2 2.7 4.8 11.7 23.8 15.7s44 1 53-1 10.6-7.9 10.6-7.9m-49 11.1c-.6 10.8 3.4 14.8 7.4 14.8s8.5-6.6 8.3-15.1m-2.4 10.6c1.1 5.5 6.1 5.5 9.1 4.5s6-5 5-16m-.7 10.9c1.6 4.1 5.9 4.1 8.7 3.2 3-1 6-5 5-16" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M364.5 264.6c1.4-18.7-12.6-35.1-31.3-36.5-.7-.1-1.5-.1-2.2-.1-5.2-11.8-16.5-20.4-30.2-21.4-9-.7-17.5 2-24.2 7-3.2-1.4-6.6-2.3-10.3-2.6-11.9-.9-22.8 5.1-28.7 14.6-25.3-2.1-53.4 5.5-59 30.9-6.1 27.6 5.1 42.5 25 49.4 18.5 6.5 41.1 8.4 52.7 8.8 13.2.4 41.2-1.7 62.2-8.5 13-4.2 24.7-10.8 26-11.3 14.6-8.7 18.8-14.4 20-30.3z" class="st11" fill="#e0b37d"/><path d="M355.3 266.5c-2.1-17.9-8.8-23.1-21.6-26.6.5 5.9-.4 9.5-.7 10.7-.6 2.4-1.6 4.2-3.1 4.2-1 0-1.9-.7-2.2-1.8-.2-.7-.4-1.6-.6-2.8-.4-2.1-1-5.3-2.5-10.3-3.6-12.7-15.3-18.4-25.3-18.4-3.7 0-7.5 1.1-10.4 2.5 12.1 15.4 3.5 31.3 1.6 34.5-3.1 5.3-8.9 6-9.1 6l-.8.1c-1.2.1-1.7-.6-.9-1.2.8-.6 1.9-1.6 2.3-2.9.9-4 1.5-11.4-1.7-21.6-3.2-10-14.4-17.3-26.6-17.3-5.5 0-11 1.5-15.7 4.4l-.1.1h-.2c-2.6-.2-5.3-.3-7.9-.3-27.4 0-46.3 11.5-50.5 30.8-5.5 24.8 2.8 41.9 24.7 49.5 20.8 7.3 45.4 8.4 52.5 8.6h3.4c15.5 0 40.5-3.2 58.7-9 10.6-3.4 20.5-8.5 24.2-10.4.9-.5 1.5-.8 1.6-.8 2.6-1.5 2.3-1.3 4.1-2.6 4.3-4.7 8-15.2 6.8-25.4z" class="st12" fill="#a6725c"/><path d="M288.7 261c3.5-4.6 5.7-10.2 6.1-16.3 1-13.4-6.7-26-18.3-31.1" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M331.4 227.9c2.5 5.9 3.3 12.4 2.5 18.7 0 .1-.1.1-.1.1-.1 0-.1-.1-.1-.1.6-6.3-.5-12.6-3.2-18.3-.1-.3 0-.5.2-.7.3-.1.6 0 .7.3z"/><path d="M237.9 226.2c-4.1 7.2-3.8 14.9-5 20.8-.8 3.7-5.7 14.4-12.7 19.3" class="st10" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M367.7 358.5c0 16 18 30 40 30s37-8 58-34 58-50 88-53 48 5 48 5 7-15 19-11 10 16 8 20c0 0 7-5 14 2s6 26-18 31-35-2-35-2-37 4-58 43-42 72-101 88" class="st6" fill="#fccf84"/><path d="M368.2 358.5c.1 2.8.7 5.6 1.8 8.2.3.6.6 1.3 1 1.9l.5.9.6.9c.4.6.8 1.2 1.2 1.7l1.4 1.6c.4.6 1 1 1.5 1.5l1.5 1.5c1.1.9 2.1 1.8 3.4 2.6l1.8 1.2 1.9 1c1.2.7 2.5 1.3 3.8 1.9 5.2 2.3 10.9 3.4 16.5 3.7 5.7.2 11.4-.2 17-1.4 5.5-1.2 10.8-3.4 15.6-6.4 4.9-3 9.3-6.6 13.4-10.5 1-1 2.1-2 3.1-3l3-3.1c1.9-2.2 3.9-4.3 5.7-6.5 1.8-2.2 3.8-4.4 5.7-6.7.9-1.1 2-2.1 3-3.2s2-2.2 3.1-3.2c8.3-8.2 17.4-15.7 27.3-22 9.8-6.3 20.2-11.9 31.3-15.7 2.7-1 5.6-1.8 8.4-2.6 1.4-.4 2.9-.6 4.3-1l2.2-.5 2.2-.3c1.5-.2 2.9-.5 4.4-.6l4.4-.3c2.9-.1 5.8-.2 8.8-.2 5.8.1 11.7.5 17.5 1.5 2.9.5 5.8 1 8.6 1.8 2.8.7 5.6 1.6 8.4 2.7l-.7.2c1.9-3.7 4.4-7 7.9-9.5 1.7-1.2 3.7-2.1 5.8-2.4 2.1-.3 4.3 0 6.2.7 2 .7 3.8 1.7 5.4 3.1 1.6 1.4 2.7 3.3 3.4 5.2.7 2 .9 4.1.7 6.2-.1 2.1-.6 4.1-1.5 6.1l-.7-.6c1.8-1.1 3.8-1.7 5.9-1.8 2.1 0 4.2.5 5.9 1.6 1.8 1.1 3.3 2.5 4.4 4.2l.8 1.3.6 1.4c.2.5.3 1 .4 1.5.1.5.3 1 .3 1.5.6 4-.2 8.2-2.2 11.8-2 3.5-5.1 6.3-8.6 8.3-3.5 2-7.4 3.2-11.2 4.1-3.9.8-7.8 1.4-11.8 1.6-4 .2-8 .2-11.9-.3-2-.3-3.9-.6-5.9-1.2-1.9-.6-3.8-1.2-5.6-2.2l.3.1c-4.3.6-8.6 1.9-12.8 3.4-4.1 1.5-8.2 3.4-12 5.6-7.7 4.3-14.6 10-20.5 16.6-2.9 3.3-5.6 6.8-8 10.5-2.4 3.7-4.4 7.6-6.6 11.5-4.3 7.8-8.7 15.6-13.5 23.1-4.9 7.5-10.3 14.6-16.4 21.2l-2.3 2.4c-.8.8-1.5 1.6-2.4 2.4l-4.9 4.6c-3.5 2.9-6.9 5.8-10.6 8.3l-2.7 2c-.9.6-1.9 1.2-2.9 1.8-1.9 1.2-3.8 2.4-5.8 3.5-4 2.1-7.9 4.3-12.1 6l-3.1 1.4-1.5.7c-.5.2-1 .4-1.6.6l-6.3 2.3c-2.1.8-4.2 1.4-6.4 2.1l-6.4 2c-.5.1-1-.1-1.1-.6-.1-.5.1-1 .6-1.1l6.4-1.9c2.1-.7 4.3-1.2 6.3-2l6.2-2.3c.5-.2 1-.4 1.6-.6l1.5-.7 3-1.3c4.1-1.7 8-3.8 11.9-5.8 1.9-1.1 3.8-2.3 5.7-3.4.9-.6 1.9-1.1 2.8-1.8l2.7-1.9c3.7-2.5 7.1-5.3 10.5-8.1l4.9-4.5c.8-.7 1.6-1.6 2.3-2.4l2.3-2.4c6-6.5 11.4-13.6 16.3-21s9.3-15.1 13.6-22.9c2.1-3.9 4.2-7.9 6.7-11.6 2.5-3.7 5.2-7.3 8.2-10.6 6-6.6 13.1-12.3 20.9-16.7 3.9-2.2 8-4.1 12.2-5.6 4.2-1.5 8.5-2.8 13-3.4.1 0 .2 0 .3.1 1.6.9 3.5 1.6 5.4 2.1 1.9.5 3.8.9 5.7 1.1 3.9.5 7.8.6 11.7.3 7.8-.7 15.8-1.8 22.6-5.6 3.3-2 6.3-4.6 8.2-8 2-3.3 2.7-7.3 2.1-11.1 0-.5-.2-.9-.3-1.4-.1-.5-.2-.9-.4-1.4l-.5-1.3-.7-1.2c-1-1.6-2.5-2.9-4.1-3.9-1.6-1-3.5-1.5-5.4-1.5-1.9 0-3.8.6-5.3 1.6-.2.2-.5.1-.7-.2-.1-.1-.1-.3 0-.5.8-1.7 1.3-3.7 1.4-5.7.1-2-.1-4-.7-5.8-.6-1.8-1.7-3.5-3.1-4.8-1.5-1.3-3.2-2.2-5.1-2.9-.9-.3-1.9-.6-2.8-.7-1-.1-1.9-.1-2.9 0-1.9.3-3.7 1.1-5.4 2.2-3.2 2.3-5.7 5.6-7.5 9.1-.1.2-.4.4-.6.2-2.6-1.1-5.4-1.9-8.2-2.6-2.8-.7-5.6-1.3-8.5-1.7-5.7-.9-11.5-1.3-17.3-1.3-5.8 0-11.6.2-17.3 1.1l-2.1.3-2.1.5c-1.4.3-2.8.6-4.2 1-2.8.8-5.6 1.5-8.3 2.6-10.9 3.8-21.2 9.3-30.9 15.6-9.7 6.3-18.7 13.7-26.9 21.9-1.1 1-2 2.1-3 3.1-1 1.1-2 2.1-2.9 3.2-1.9 2.2-3.8 4.4-5.6 6.7-1.8 2.3-3.8 4.4-5.7 6.6l-3 3.2c-1 1.1-2.1 2.1-3.1 3.1-4.2 4-8.7 7.8-13.7 10.8-5 3.1-10.5 5.4-16.2 6.6-5.7 1.2-11.6 1.6-17.5 1.4-5.8-.3-11.7-1.6-17-4-1.3-.6-2.7-1.2-3.9-2l-1.9-1.1-1.8-1.3-.9-.6c-.3-.2-.6-.5-.9-.7l-1.7-1.4-1.6-1.6c-.5-.5-1-1-1.5-1.6l-1.4-1.7c-.4-.6-.8-1.2-1.2-1.9l-.6-.9-.5-1c-.3-.7-.7-1.3-1-2-1.1-2.8-1.7-5.7-1.8-8.7 0-.3.2-.5.5-.5-.4 0-.1.2-.1.5z"/><linearGradient gradientTransform="matrix(1 0 0 -1 0 1080)" y2="628.47382" x2="501.4595" y1="761.37598" x1="522.04169" gradientUnits="userSpaceOnUse" id="g"><stop offset="0" stop-color="#e5b77e"/><stop offset="1" stop-color="#b88671"/></linearGradient><path d="M408.5 480c-13.2-1.7-24.4-9.7-33.3-23.7 39.6-3.4 68.1-12.2 87.7-30.7 12.5-11.8 22.6-24 32.3-35.8 24.1-29.3 45-54.6 91.7-57.2 1.3 1.1 10.5 8.1 26 8.1 15.7 0 28-5 33.1-13.5v.8c0 .3 0 .6-.1 1v.2c0 .3-.1.5-.1.8l-.1.3c0 .3-.1.6-.2.9v.1c-.1.4-.2.7-.3 1l-.1.2c-.1.3-.2.6-.3.8l-.1.3c-.1.3-.3.7-.4 1l-.1.1c-.2.4-.3.6-.5.9l-.2.3c-.2.3-.3.6-.5.8l-.1.2c-.2.3-.4.6-.7 1l-.1.2c-.2.3-.4.6-.6.8l-.2.3-.9.9-.1.1-.8.8-.3.3c-.3.2-.6.5-.9.7l-.2.2c-.4.3-.7.6-1.1.8l-.3.2c-.3.2-.6.4-1 .6l-.4.2c-.4.3-.9.5-1.4.7l-.1.1c-.4.2-.9.4-1.4.6l-.4.2c-.4.2-.8.3-1.3.5l-.3.1c-.5.2-1.1.4-1.7.6l-.4.1c-.5.1-.9.3-1.4.4l-.5.1c-.6.2-1.3.3-1.9.5-5.7 1.2-11.1 1.8-16.2 1.8-12.4 0-18.4-3.7-18.4-3.7l-.1-.1h-.2c-.4 0-37.5 4.5-58.4 43.3-.6 1.1-1.2 2.2-1.7 3.2l-2.4 4.3c-.6 1.1-1.2 2.1-1.8 3.2l-.1.1c-.6 1.1-1.2 2-1.7 3l-.6 1c-.4.7-1.9 3.2-1.9 3.2-.6 1-1.1 1.9-1.7 2.9l-.4.6c-.5.9-1.1 1.7-1.6 2.6l-.7 1.1c-.4.7-.9 1.3-1.3 2l-.7 1.1c-.6.9-1.2 1.8-1.8 2.6l-.5.8c-.5.8-1.1 1.5-1.6 2.3-.2.3-.8 1.1-.8 1.1-.4.6-.9 1.2-1.3 1.8l-.8 1.1c-.6.8-1.2 1.6-1.9 2.4l-.7.9c-.5.7-1.1 1.4-1.7 2-.3.3-.9 1.1-.9 1.1-.5.6-1 1.1-1.4 1.7 0 0-.7.8-.9 1.1-.7.7-1.4 1.5-2 2.2l-.9.9-1.8 1.8-.9.9-.2.2c-.5.5-1 1-1.6 1.5l-.1.1c-.3.3-.6.6-1 .9-.8.7-1.5 1.4-2.3 2.1-.3.3-.6.5-.9.8l-.2.2c-.6.5-1.3 1.1-1.9 1.6-.4.3-.8.6-1.2 1-.6.5-1.2.9-1.8 1.4l-.2.2c-.3.3-.6.5-1 .7-.9.7-1.8 1.3-2.7 2-.3.2-.5.4-.8.5l-.4.3c-.7.5-1.4 1-2.2 1.5-.4.3-.8.5-1.2.8-.7.4-1.3.9-2 1.3l-.3.2c-.4.2-.7.5-1.1.7-1.1.6-2.1 1.3-3.2 1.9-11.1 6.3-23.5 11.2-37.8 15.1-.1.1-4.5 2.1-11.1 3h-11v-.2z" fill="url(#g)"/><path d="M570 334.7c4.9-.8 6.4-3.3 9.2-3.8 3.2-.6 5.4 0 7.7 1.8 2.3 1.7 2.2 4.4 2.2 4.4l-7 2.8-12.1-5.2z" class="st11" fill="#e0b37d"/><path d="M236.6 421c-.6 7.7-9.4 8.9-21.8 8.9s-20.8-.8-21.4-8.5c-.6-7.7 8-11.2 21.4-11.2 13.3-.1 22.4 3.1 21.8 10.8z" class="st12" fill="#a6725c"/><path d="M590.4 423.3c-.5 2.8 3.2 3.7 5.6 3.7 2.4 0 3.9-1.3 4-3 .2-1.7-1.2-2.7-3.6-2.7-2.4 0-5.6-.3-6 2zm18.7-2.3c-1.4.1-3.2.1-4.4.6 0 1.4-.1 2.8-.4 4.2 1.2.9 3.2 1.1 4.7 1 2.4-.1 3.8-1.5 3.8-3.3.1-1.8-1.3-2.7-3.7-2.5zm12.8-1.3c-1.4.2-3.1.3-4.3.8.1 1.4 0 2.8-.2 4.2 1.3.8 3.3.9 4.8.7 2.4-.3 3.7-1.8 3.6-3.5-.1-1.7-1.5-2.5-3.9-2.2z" class="st6" fill="#fccf84"/><path d="M269.2 314.5c6.5-1 13-1.5 19.5-2.4 6.5-.9 12.9-2 19.2-3.5 6.3-1.5 12.6-3.4 18.6-5.9 3-1.2 6-2.5 8.9-3.9 1.5-.7 2.9-1.4 4.4-2.2 1.5-.7 2.8-1.5 4.4-2.2h-.1c3.3-2 6.6-4.1 9.6-6.6 1.5-1.2 2.8-2.6 4.1-4.1 1.2-1.5 2.2-3.1 3-4.8 1.6-3.5 2.3-7.3 2.8-11.2.5-3.9.5-7.7-.1-11.5-.7-3.8-2-7.5-3.9-10.8-1.9-3.3-4.4-6.3-7.4-8.8-5.9-5-13.5-7.9-21.2-8h-.3l-.1-.3c-2.2-4.8-5.4-9.2-9.4-12.7-2-1.7-4.2-3.2-6.6-4.5-2.3-1.2-4.8-2.2-7.4-2.9-5.1-1.4-10.6-1.6-15.8-.6-5.2 1-10.2 3.2-14.5 6.4l-.2.2-.3-.1c-3.3-1.5-6.9-2.4-10.6-2.6-3.6-.2-7.3.2-10.8 1.3-1.8.5-3.4 1.3-5.1 2.1-1.6.9-3.2 1.8-4.6 3-2.9 2.2-5.3 5-7.3 8.1l-.2.3h-.3c-11.1-.9-22.5 0-33 3.7-5.2 1.9-10.2 4.5-14.4 8.1-4.2 3.6-7.5 8.3-9.4 13.4-1 2.6-1.6 5.3-2.1 8l-.4 2.1-.3 2.1c-.2 1.4-.4 2.8-.4 4.2-.3 5.5.2 11.2 2.1 16.4.9 2.6 2.3 5 3.8 7.4.4.6.9 1.1 1.3 1.6s.8 1.1 1.4 1.6c1 1 1.9 2 3 2.9 4.2 3.6 9.2 6.2 14.4 8.4-5.4-1.6-10.6-4.1-15-7.7-1.1-.9-2.1-1.9-3.1-2.9-.5-.5-.9-1.1-1.4-1.6-.4-.6-.9-1.1-1.3-1.7-1.6-2.4-3-4.8-3.9-7.6-2-5.4-2.6-11.1-2.3-16.8 0-1.4.2-2.8.4-4.2l.2-2.1.4-2.1c.5-2.8 1.1-5.6 2.1-8.2 2-5.3 5.4-10.1 9.7-13.9 4.3-3.8 9.4-6.5 14.7-8.4 10.7-3.8 22.3-4.6 33.5-3.6l-.5.2c2-3.2 4.5-6.1 7.5-8.3 1.5-1.2 3.1-2.1 4.7-3.1 1.7-.8 3.4-1.6 5.2-2.1 3.6-1.2 7.4-1.5 11.2-1.3 3.8.2 7.5 1.1 10.9 2.6l-.5.1c4.4-3.2 9.5-5.5 14.9-6.5s11-.9 16.2.6c2.6.7 5.2 1.7 7.6 3 2.4 1.3 4.7 2.8 6.8 4.6 4.2 3.5 7.4 8.1 9.7 13l-.5-.3c8 0 15.9 3 22 8.1 3 2.6 5.7 5.6 7.7 9.1s3.4 7.3 4.1 11.2c.7 3.9.7 8 .2 11.9-.5 3.9-1.2 7.9-2.9 11.6-.8 1.8-1.9 3.5-3.2 5.1-1.3 1.5-2.7 3-4.2 4.2-3 2.6-6.4 4.7-9.8 6.7h-.1c-1.4.7-2.9 1.5-4.3 2.2-1.5.7-2.9 1.5-4.4 2.2-3 1.4-6 2.7-9 3.9-6.1 2.5-12.4 4.4-18.8 5.9s-12.9 2.6-19.4 3.5c-6.3.5-12.9 1.2-19.4 1zm341.8-5.8c2.4.4 4.8.9 7.1 1.7 2.3.7 4.6 1.8 6.7 2.9 2.2 1.1 4.2 2.5 6.1 4.1 1.9 1.5 3.7 3.3 5.1 5.2v.2h-.1c-1.9-1.6-3.7-3.2-5.6-4.6-1.9-1.5-4-2.7-6-3.9-2.1-1.2-4.3-2.2-6.5-3-2.2-.9-4.5-1.6-6.9-2.3-.1 0-.1-.1-.1-.1l.2-.2z"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="h" d="M184 151h494.79999v321H184z"/></defs><clipPath id="i"><use height="100%" width="100%" xlink:href="#h" overflow="visible"/></clipPath><g clip-path="url(#i)"><path d="M270.6 223.8c1-.7 2.1-1.3 3.2-1.7 1.1-.4 2.3-.8 3.5-1 1.2-.2 2.4-.4 3.6-.4 1.2 0 2.4 0 3.6.2-2.4.3-4.7.6-7.1 1.1-1.2.2-2.3.5-3.5.8-1 .3-2.1.7-3.3 1z" class="st15" fill="#fce79c"/></g></g><g transform="translate(-184 -205.1)"><defs><path id="j" d="M184 151h494.79999v321H184z"/></defs><clipPath id="k"><use height="100%" width="100%" xlink:href="#j" overflow="visible"/></clipPath><g clip-path="url(#k)"><path d="M317 225.4c1.7-.9 3.6-1.4 5.5-1.4 1 0 1.9.1 2.8.3.9.2 1.8.5 2.6 1.1-1.9-.2-3.7-.3-5.5-.3-.9 0-1.8 0-2.7.1l-2.7.2z" class="st15" fill="#fce79c"/></g></g></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_plane.svg b/app/javascript/images/elephant_ui_plane.svg
deleted file mode 100644
index a2624d170e..0000000000
--- a/app/javascript/images/elephant_ui_plane.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 292.85862 204.49997" width="292.85861" height="204.49997"><g transform="translate(-395.89999 -820.4)"><defs><path id="a" d="M395.89999 745.09998H690.5v279.79999H395.89999z"/></defs><clipPath id="b"><use xlink:href="#a" width="100%" height="100%" overflow="visible"/></clipPath><path class="st53" d="M339.3 1028.6c1.5-3.2 14.4-31.3 27.4-58.8-6-9.3-2-17 1.5-23.7 1.9-3.7 3.8-7.1 3.6-10.4-.8-22 8.1-38.3 22.8-41.6 2.8-.6 5.2-.9 7.5-.9 3 0 5.6.5 8.1 1.6 1.4-1.3 2.8-2.6 4.2-3.8-2.8-2.6-4.3-5.5-4.5-8.8-.3-4.5 2.2-9.5 6.8-13.7 5.3-4.8 16.5-12.9 31.7-12.9.9 0 1.7 0 2.6.1-.4-.9-1-2-2.1-2.9-2.1-1.6-1.9-3.2-1.6-4 .7-2.1 3.6-3.2 8.1-3.2 3.9 0 9.7 1.2 14 4.4.3-.7.7-1.3 1.3-1.7.5-.3 1.3-.5 2.2-.5 3.4 0 10.6 2.7 15.5 9.9 3.6 5.3 3.6 10.8.1 16 18.3 4.7 30.1 15.6 39.5 24.4 2.5 2.4 5 4.6 7.3 6.5 10.7 8.9 21.4 13.2 32.7 13.2.9 0 1.8 0 2.7-.1 2-13.5-4.1-25.5-10-35.7-6.2-10.7-6.4-12.1-4.9-13.9l.1-.1c.6-.7 1.3-1 2.1-1.1h.3c1.7 0 4.5 1 13 8.7 9.9 9 16.9 22.2 19.2 36.5 8.9-4.9 15.2-12.5 17.1-20.3 2-8.6.5-16.8-4.2-22.7l-13.1 6.1-7-16.9-15.6 3.2 7.2-19.5h.1l-.2-.5 4.6-11.1 65.7 11.9c3.1.6 3.9 2.7 3.6 4.5l-.2 1-.4-.1c-.3.4-.6.7-1 .9-.7.3-7.5 3.6-21 9.9 2.1 2.9 2.2 6.1.4 9.4-1.1 1.9-2.5 6.2.4 13.3 3.7 8.9 3.5 29.2-8.3 46.2-8.1 11.7-18.3 23-37.6 26.6-3 4.6-6.5 9-10.2 12.6-7.8 7.6-24 15.3-42.3 15.3-5.3 0-10.7-.6-15.9-1.9-7.6 12.9-10.5 26.2-10.6 32.1-.2 11 .9 16.1.9 16.2l.4 1.8-164.9.8.9-2.3z" clip-path="url(#b)"/><path class="st53" d="M339.8 1028.8c.1-.3 13.9-30.1 27.5-59.1-6.1-9.2-2.1-16.8 1.4-23.5 2-3.7 3.8-7.3 3.7-10.6-.8-21.7 8-37.9 22.4-41 2.7-.6 5.1-.9 7.4-.9 3 0 5.7.5 8.2 1.7 1.6-1.6 3.2-3 4.9-4.4-3-2.6-4.6-5.5-4.8-8.8-.3-4.4 2.1-9.2 6.6-13.3 5.3-4.8 16.4-12.8 31.4-12.8 1.1 0 2.2 0 3.3.1-.3-1.1-1-2.7-2.5-3.8-1.8-1.4-1.7-2.8-1.5-3.4.6-1.8 3.4-2.9 7.6-2.9 4.4 0 10.3 1.5 14.3 4.8.1-.9.6-1.7 1.3-2.1.4-.3 1.1-.4 1.9-.4 3.3 0 10.3 2.6 15.1 9.7 3.6 5.3 3.5 10.9-.3 16.1 18.6 4.6 30.5 15.6 40 24.4 2.6 2.4 5 4.6 7.3 6.5 10.8 8.9 21.6 13.3 33.1 13.3 1 0 2.1 0 3.1-.1 2.2-13.9-4-26.1-10-36.4-6.3-10.9-6.2-11.8-5-13.3l.1-.1c.2-.2.7-.9 1.8-.9h.2c1.5 0 4.2 1 12.7 8.6 10 9.1 17 22.5 19.2 36.9 9.3-5 16-12.8 17.9-20.9 2.1-8.9.4-17.4-4.5-23.4l-13 6.1-6.9-16.8-15.1 3.1 6.8-18.4h.6l-.5-1 4.4-10.6 65.3 11.8c3.5.7 3.3 3.2 3.2 3.9l-.1.5h-.2c-.2.4-.6.8-1 1-.7.3-7.9 3.7-21.6 10.2.1.1.2.2.3.4 2 2.7 2.2 5.8.4 8.9-1.1 2-2.6 6.4.4 13.7 3.6 8.8 3.4 28.8-8.2 45.7-8.1 11.7-18.2 22.9-37.5 26.4-3 4.7-6.5 9.1-10.3 12.7-7.8 7.5-23.7 15.1-42 15.1-5.4 0-10.9-.7-16.1-2-7.7 13.1-10.7 26.7-10.9 32.7-.2 11.1.9 16.2.9 16.3l.3 1.2-163.5.8.5-1.7z" clip-path="url(#b)"/><path d="M577.5 843.7l-1-2.1 3.9-9.4 64.5 11.6c2.4.5 2.5 2 2.4 2.8" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M584.2 856.7l6.9 16.6s53.7-25.1 55.5-26c.9-.5 1.5-2.2-1-2.3-2.5-.1-69.6-1.4-69.6-1.4l-5.9 16 14.1-2.9z" clip-path="url(#b)" fill="#fff" stroke="#000" stroke-width="1.70000005" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M585.1 857l58.9-11.2 1.4-.5h.4c.8 0 .7.3.8.6.1.3-.1.6-.4.8L587 861.5l-1.9-4.5z" clip-path="url(#b)" fill="#d1d3d4"/><path class="st57" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M584.20001 856.70001l61.79999-11.5"/><path class="st58" d="M388.5 927.9c20-40 49.9-56.3 83.4-54.9 33.6 1.4 48.8 21.7 62.4 32.9 13.6 11.2 27.5 15.6 43.4 12.5 15.9-3.1 28.5-14.6 31.2-26.1 2.7-11.5-1-20.7-6.1-25.8-5.1-5.1-1.4-8.1 4.1-6.8 5.4 1.4 8.1 3.4 8.1 3.4s7.8-6.4 9.8-3.7c2 2.7 1.7 5.4.3 7.8-1.4 2.4-2.7 7.1.3 14.6 3.1 7.5 4.1 27.1-8.1 44.8-12.2 17.6-26.5 30.1-62.1 26.5-38.5-3.9-54.6 44.2-54.9 59-.2 11.5.9 16.5.9 16.5l-160.7.8c.2-.1 33.4-72.4 48-101.5z" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M399.4 989.3c-6.1 0-9.9-4.3-10-4.3l-.2-.2-.3.1c-3.1 1-6.1 1.5-9 1.5-6.1 0-11.4-2.2-15.6-6.5 1.4-3 2.9-6.1 4.3-9.1.1.1.1.2.2.3 6.1 8 12.7 9.7 17 9.7 3.2 0 5.6-.9 6.6-1.3.7 1.3 3 4.7 7.5 4.7 1.2 0 2.5-.3 3.9-.8 6.7-2.5 15.7-13.1 18.3-22.1 3.2 5.7-2.8 18.3-13.8 25.3-3 1.7-6 2.7-8.9 2.7zm24.5-78.1c-5.7-11.1-10.8-14.2-12.4-14.9 15.7-15.3 34.7-23 56.6-23 1.3 0 2.5 0 3.8.1 2.1.1 4.2.3 6.4.5 1.5 2.7-.4 5.6-.8 6.3-3 .8-11.2 6.5-18.5 11.6-1.9 1.3-3.7 2.6-5.3 3.7-5.3 3.7-13.6 4.2-18 4.2-1.8 0-2.9-.1-2.9-.1h-.3l-8.6 11.6zm95.3 49c4.2-7.1 12.6-15.2 28.3-15.2 3.5 0 7.2.4 11 1.2 3.4.7 7 1.1 10.6 1.1 15.9 0 29.8-7.9 34.8-12.5 6.5-6 10.5-9.8 12-12.4 1.4-2.4 3.2-2.8 4.7-2 .1.1-.7 1.1-.6 1.1-.9 1.7-1.9 3.3-3 4.8-11.5 16.6-23.9 26.9-50 26.9-3.6 0-7.5-.2-11.6-.6-1.5-.2-3-.2-4.4-.2-9.4 0-18.1 3.2-25.9 9.4l-5.9-1.6z" clip-path="url(#b)" fill="#38434f"/><path class="st58" d="M427.4 920.5c-9.1-24.2-19-27.9-32.4-25-13.4 3-22.4 18-21.6 40 .4 10.2-15.5 20.5-4.3 35s23.5 8 23.5 8 3 7.1 11 4.1 16.7-13.5 18.5-21.6" clip-path="url(#b)" fill="#53606c" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st59" d="M417.2 934.2c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.4 11.7-14.2 19c.6 15.3-10.2 22.8 0 29.7 10.1 6.9 23.7-2.8 28.5-11.3 4.8-8.5 4-11.8 4-11.8z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M392.6 978.6c6.3-3.9 9.1-7.5 9.1-7.5m15.5-36.9c-7.3.5-8.6-4.8-7.3-7 1.2-2.1 4.6-3.2 4.6-3.2s-5.3-.2-6.3-4c-1-3.7 4-5.3 4-5.3s-2.9-8.6-13.3-6.1-14.6 11.7-14.2 19" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M417.5 891.4c-9.8-6.9-6.2-16 .3-21.8 6.5-5.8 19-14 35.2-12.2 0 0-.2-3.5-3.1-5.8s-.5-4.5 5.5-4.5 12.9 2.6 15.8 6.9c0 0-1.4-3.2.4-4.4 1.8-1.2 10.2 1 15.6 9s1.1 14.9-5.2 19.9c-6.3 5-36.2 11.6-48.8 10.9" clip-path="url(#b)" fill="#53606c"/><g class="st53" clip-path="url(#b)"><path class="st36" d="M459.5 878.7c-11.1.6-22.1 3.3-32.9 6.1-4.1 1.1-8.2 2.2-12.4 2-.4 0-.8-.1-1.3-.1 1 1.6 2.5 3.2 4.6 4.7l15.6-2.1c11.3.7 37-4.7 46.4-9.4-6.5-1.1-13.3-1.5-20-1.2z" fill="#38434f"/></g><path class="st59" d="M417.5 890.8c-3.5-2.5-5.3-5.5-5.5-8.8-.2-3.2 1.2-6.7 4-9.9-.4 1.6-.2 3.2.5 4.7 1.2 2.5 3.6 4 6.3 4 2.1 0 4.3-.9 6.3-2.6 7.2-6 19.4-10.4 29.1-10.4 1.9 0 3.7.2 5.3.5 7.7 1.6 12.3 3.7 13.8 6.7.8 1.6.8 3.3 0 5.4-10.1 4.3-31.2 8.6-42.1 8.6-.7 0-1.4 0-2.1-.1-1.4-.1-2.8-.1-4-.1-7.5-.1-10.6 1.4-11.6 2z" clip-path="url(#b)" fill="#38434f"/><path class="st57" d="M471.2 854c2.2 3.4 1.1 6.7 1.1 6.7" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M489.6 967.9c34.6 23.5 68.7 8.7 80.2-2.4 11.4-11.1 20.8-28.5 20-45.9-.8-17.4-8.5-32.9-19.5-42.8-10.7-9.6-12.4-8.7-13.2-7.7-.8 1-1.4 1.1 5 12.2s13.4 24.6 9.5 40.2c-3.9 15.6-15.6 29.9-29.6 34-14 4-21.6-1.4-26.1-3.2 0 0 1 4-3.4 4.3-4.3.3-11.1-2.9-11.1-2.9s2.7 3 .1 5-5.9-.9-5.9-.9 2.5 2.2 1.5 3.3c-1 1.1-2.3.8-4.2-.6 0 0 3.2 3.6 1 5.5s-4.3 1.9-4.3 1.9z" clip-path="url(#b)" fill="#b3becd" stroke="#000" stroke-width="1.60000002" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M528.6 979.9c-13.1 0-25.8-3.9-37.6-11.7.9-.2 2.1-.7 3.3-1.8 1.4-1.3 1-3 .3-4.3.4.1.8.2 1.1.2.7 0 1.3-.3 1.8-.8.3-.3.4-.6.4-1 0-.3-.1-.6-.2-.9.6.2 1.2.4 1.9.4.9 0 1.7-.3 2.4-.8.3-.2.5-.5.7-.8 12.6 6.2 22.6 9.1 31.5 9.1 7.8 0 14.7-2.3 21.1-6.9 16.8-12.3 21.3-21.3 24.6-27.9l.3-.6c2.3-4.5 4.2-6.5 6.4-6.5.9 0 1.7.3 2.7.9-1.4 13.6-8.7 28-19.6 38.6-7.9 7.4-23.4 14.8-41.1 14.8z" clip-path="url(#b)" fill="#92a1b5"/><path class="st57" d="M489.6 967.9c-3.9.1-6.7-.9-6.7-.9" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path d="M484 908.3c-2.2.9-2.1 3.2.1 6.7 2.1 3.5 4.5 7.9 5.9 10.3 1.4 2.4 2.6 3.5 4 2.8 1.4-.6 1.8-2 .4-4.9-1.4-2.9-5.8-11-7.2-12.7-1.6-1.7-2.4-2.5-3.2-2.2z" clip-path="url(#b)" fill="#38434f" stroke="#000" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><path class="st57" d="M525.9 907.8c2.5-3.7 4.8-5.2 4.8-5.2m3.8 11.9c1.5-3.1 3.7-5.6 3.7-5.6m11.9 13.3c1-3.9 2.7-5.6 2.7-5.6m10.7 9c.6-4.6.9-6.6.9-6.6" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path class="st49" d="M504.9 862.2c.8-.4 1.5-.8 2.2-1.1" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/><path d="M519.8 856.2c13.6-3.5 22.1.5 28.2 3.3 5.3 2.4 11.6 4.7 17.6 5.3" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="4.5286,13.5857"/><path class="st49" d="M572.4 864.5c.8-.2 1.6-.4 2.4-.7" fill="none" stroke="#e3e5e5" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></g><g class="st53" clip-path="url(#b)"><path d="M491.2 946.7c-4.1 1.1-6.1 1.8-10 3.5-2.1.9-4.6.1-5.6-1.9s0-4.6 2.3-5.6c4.3-1.9 6.6-2.7 11.2-3.9 2.4-.6 4.8.8 5.3 2.9.4 2.2-1 4.4-3.2 5z" fill="#505762"/></g><path class="st57" d="M515.8 952.3c-.2-2.3-1.7-3.3-1.7-3.3" clip-path="url(#b)" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10"/><g class="st53" clip-path="url(#b)"><path d="M454.5 887.5c-3.5.7-7.1 1.3-10.6 1.7-3.6.4-7.2.8-10.8.6-.3 0-.5-.2-.5-.5s.2-.5.5-.5c3.5.2 7.1-.1 10.6-.4 3.5-.4 7.1-.9 10.6-1.6.2 0 .4.1.4.3.1.2 0 .4-.2.4z"/></g><g class="st53" clip-path="url(#b)"><path d="M417.2 891.8c-2.2-1.6-4.3-3.6-5.4-6.2l-.4-1-.2-1-.1-.5v-.5c0-.4-.1-.7-.1-1.1 0-1.4.2-2.8.7-4.1.9-2.6 2.6-4.9 4.4-6.9 1.9-2 4-3.6 6.2-5.2s4.6-2.9 7-4.1c2.4-1.2 5-2.2 7.6-2.9 5.2-1.5 10.7-1.9 16.1-1.4l-.6.5c-.2-1.3-.7-2.7-1.4-3.8-.4-.6-.8-1.1-1.4-1.5-.5-.5-1.2-1-1.5-1.9-.1-.2-.1-.5-.1-.7.1-.2.1-.5.2-.7.2-.4.6-.7.9-.9.7-.5 1.4-.7 2.2-.9 1.5-.3 3-.4 4.4-.4 2.9.1 5.9.7 8.6 1.8 2.7 1.1 5.3 2.8 7.1 5.3l-.9.5c-.3-.7-.5-1.3-.5-2.1-.1-.7 0-1.5.4-2.3.3-.3.5-.7 1-.8.2-.1.4-.1.6-.2.2 0 .4-.1.6-.1.7 0 1.4.1 2.1.2 1.4.3 2.6.8 3.9 1.4 1.2.6 2.4 1.3 3.5 2.1 2.2 1.6 4.1 3.6 5.6 5.9.7 1.2 1.4 2.4 1.8 3.7.3.6.4 1.3.5 2 .1.3.1.7.1 1v1c-.1 2.8-1.3 5.5-3 7.6-1.7 2.2-3.6 4-5.9 5.6-2.4 1.4-4.9 2.3-7.4 3.2-2.5.8-5.1 1.5-7.8 1.9 1.2-.5 2.5-.9 3.7-1.4l3.7-1.3c2.5-.9 5-1.8 7.2-3.2 2.1-1.5 4-3.3 5.6-5.4 1.5-2.1 2.6-4.5 2.7-7 .1-2.5-.8-5-2.2-7.1-1.4-2.2-3.2-4.1-5.3-5.6-2.1-1.5-4.4-2.8-6.9-3.4-.6-.1-1.2-.2-1.8-.2-.6 0-1 .1-1.3.5-.5.8-.2 2.3.2 3.4.1.3 0 .5-.3.6-.2.1-.4 0-.6-.2-1.6-2.3-4-3.8-6.6-4.9-2.6-1.1-5.4-1.7-8.2-1.7-1.4 0-2.8.1-4.2.4-.7.2-1.3.4-1.8.7-.5.4-.8.8-.7 1.3.1.5.6.9 1.2 1.4.6.5 1.1 1.1 1.5 1.7.9 1.3 1.4 2.7 1.6 4.3 0 .3-.2.5-.4.5h-.1c-5.3-.5-10.7-.1-15.8 1.4-2.5.7-5 1.7-7.4 2.8-2.4 1.2-4.7 2.5-6.8 4.1-2.2 1.5-4.3 3.2-6.1 5.1-1.8 1.9-3.4 4.1-4.2 6.5-.4 1.2-.6 2.5-.7 3.8 0 .3.1.6.1 1v.5l.1.5.2.9.4.9c1 2.4 2.9 4.3 5 5.8.2.2.3.5.1.7-.2.2-.4.3-.7.1z"/></g><g class="st53" clip-path="url(#b)"><path class="st36" d="M615.1 863.2c2 1.2 2.3 1.8 2.3 1.8" fill="#38434f"/><path d="M615.3 862.9l1.2.9c.2.2.4.3.6.5.2.2.3.4.5.6 0 .1 0 .2-.1.2h-.2l-.5-.5c-.2-.1-.4-.3-.6-.4-.4-.3-.8-.5-1.3-.7-.2-.1-.2-.3-.1-.5s.2-.2.5-.1c-.1 0-.1 0 0 0z"/></g></g></svg>
\ No newline at end of file
diff --git a/app/javascript/images/elephant_ui_working.svg b/app/javascript/images/elephant_ui_working.svg
deleted file mode 100644
index 8ba475db0a..0000000000
--- a/app/javascript/images/elephant_ui_working.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 124.12477 127.91685" width="124.12476" height="127.91685"><path d="M72.584191 46.815676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2.1.9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.5 1.3-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M116.384191 75.015676c0 6.3-3.9 9.8-9.1 9.8-5.3 0-9.9-3.5-9.9-9.8 0-6.3 4.3-10.3 9.5-10.3s9.5 4 9.5 10.3z" style="fill:#3a434e;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M54.184191 16.615676c-23 1.2-30.5 14.1-32.8 27.8-3 18.2-8.2 44.2-9.2 53.2s-1 16 6 22 11 5 23 7 19 0 20-8l16.8-1.1s14.5 5.5 18.8 6.9c4.3 1.4 10.6.5 12.1-7.1s.2-12.5-6.6-14.4c-6.8-1.9-10.6-2.9-10.6-2.9l4.4-30.1s17.4 1.6 22.6-20c0 0 3.9 1.1 4.8-2.8.9-3.9-2.6-6.2-5.6-4.8l-2.5-1s-.2-3.8-3.5-4.2c-2.1-.2-6 3.4-3 7.4 0 0-3.4 8.9-12 7.8-8.6-1.1-12.5-11.2-15-18.2s-10.7-18.3-27.7-17.5z" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M95.484191 69.915676c-.6 0-1.2 0-1.8-.1-4.2-.2-10.9-2.4-17-7.8-.7-1-.4-2-.2-2.5.5-1.1 1.7-1.8 3-1.8.8 0 1.5.3 2.2.8 3 2.2 7.8 5.1 13.8 5.1.9 0 1.8-.1 2.7-.2 7.2-1 12.1-5.8 14.3-9.9.6-1.2 1.3-2.5 1.8-3.5.2-.5.3-.7.6-.9.3-.2 1 .2 1 .2l2.1.8c-4.5 17.8-17.4 19.2-21.2 19.2h-1.3v.6z" class="st3" style="fill:#3a434e;opacity:.98;fill-opacity:1"/><path d="M48.884191 126.915676c-2.2 0-4.7-.2-7.6-.7-2.8-.5-5.1-.8-7.1-1-6.9-.9-10.3-1.3-15.6-5.9-7-6-6.8-13-5.8-21.6.3-2.3.8-5.9 1.7-11.2 3.1 1.4 6.1 2.2 8.7 2.2 3.1 0 5.4-1.2 6.6-3.4 1.6 1.9 6.9 7.3 13.3 7.3 1 0 1.9-.1 2.8-.4 3.5-1 19.8-2.1 46.9-3.4l-1.7 11.7.4.1s3.8 1 10.6 2.9c6.1 1.7 7.9 5.6 6.3 13.8-1.3 6.6-6.2 7.3-8.2 7.3-1.1 0-2.2-.2-3.3-.5-4.2-1.4-18.6-6.8-18.7-6.9h-.1l-17.3 1.2-.1.4c-.7 5.4-4.5 8.1-11.8 8.1z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M41.184191 103.415676c-3.8-1.4-6-1.4-7.7-1.4-1.8 0-4.6 3.3 1.4 5.4 6 2.1 10.3 3.4 10.3 3.4s1.8-2.1 3.5-2.9c1.6-.8 2.3-.9 2.3-.9l-9.8-3.6z" style="fill:#56606b;fill-opacity:1"/><path d="M27.584191 38.615676c1.2-5-2.1-8.2-5.7-9.2-3.5-1-8.4-1.7-13.9 6.9s-9.5 16.5-6.4 20.6c3.1 4.1 9.3 3.4 11.8-.8 0 0 5.7 3.8 9.5-4.2" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M10.884191 45.115676c-1.6 2.5-.8 5 2 5.9 2.7 1 5-1.5 6.5-3.8 1.6-2.3 3.6-5.9 3.6-5.9s-3.7 1.2-5.6-.2c-2-1.4-1.5-3.8-1.5-3.8l-5 7.8z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M22.684191 41.415676c-2.6 1.1-6.8.6-6.9-4.1 0 0-5.1 7.6-5.9 9.6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M67.584191 5.215676c0-3.4-3.9-2.6-3.9-2.6 0-1.2-2-3.5-8.5-.6-6.4 2.9-7.3 6-7.3 6-3.8-1.7-9.6-2.6-13.5.8-3.9 3.4-4.3 10 2.3 13.5 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c5.3-1.7 9.9-4.5 10.3-10.1.5-5.7-3.8-3.9-3.8-3.9z" style="fill:#56606b;fill-opacity:1"/><path d="M67.084191 16.315676c-1-5.5-7-3-7-3 .5-2.1-3-4.1-5.5-2.7-2.5 1.4-6.6-.1-6.6-.1-6.4-4.4-14.3-2.1-16.1 2-1.1 3.3.2 7.3 4.8 9.7 0 0 2.9.9 7.7-.4 4.8-1.3 7.7-3.3 7.7-3.3s3.7 2.3 9 .6c2.3-.6 4.3-1.5 6-2.8 0 .1 0 0 0 0z" style="fill:#3a434e;fill-opacity:1"/><path d="M36.684191 22.715676c-.1 0-.2 0-.2-.1-3.1-1.6-5-4.1-5.4-7-.3-2.7.8-5.4 3-7.3 3.9-3.3 9.5-2.8 13.6-1.1.5-1.1 2.2-3.5 7.3-5.8 4.5-2 6.9-1.5 8-.8.6.4.9.9 1.1 1.3.7-.1 2-.1 3 .7.5.4.9 1 1 1.8.7-.1 1.8-.2 2.7.4 1 .7 1.4 2.1 1.2 4.1-.4 5-3.9 8.5-10.7 10.6-5.5 1.7-9.3-.6-9.4-.7-.2-.1-.3-.5-.2-.7.1-.2.5-.3.7-.2 0 0 3.6 2.2 8.6.6 6.3-2 9.6-5.1 10-9.7.1-1.6-.2-2.8-.8-3.3-.9-.7-2.3-.1-2.3-.1-.2.1-.3 0-.5 0-.1-.1-.2-.2-.2-.4 0-.8-.2-1.3-.6-1.7-.9-.8-2.6-.4-2.7-.4-.1 0-.3 0-.4-.1-.1-.1-.2-.2-.2-.4 0-.3-.2-.7-.7-1-.6-.4-2.6-1.1-7.1.8-6.1 2.7-7 5.6-7 5.7 0 .1-.1.3-.3.3-.1.1-.3.1-.4 0-3.9-1.7-9.3-2.4-13 .8-1.9 1.7-2.9 4.1-2.6 6.4.3 2.5 2 4.7 4.8 6.2.2.1.3.4.2.7-.1.3-.3.4-.5.4z"/><path d="M40.584191 84.115676s6.3 16.8 7.1 19.3c.8 2.5 1.8 3.4 7.3 3 5.5-.4 6.7-21.5 6.7-21.5l-21.1-.8z" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M51.084191 103.415676c-1.7-2.1-1.9-4.2-1.9-4.2l2-10.9 3-1.4-3.1 16.5zm33.9-35.3l-23.9 1.9 1.2 8 25.2 1.1 4.6-9c-2.3-.3-4.7-.9-7.1-2z" class="st9" style="fill:#191b22;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4" class="st2" style="fill:#56606b;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M49.284191 80.515676c-.3-.2-.5-.4-.7-.6-1.2.7-2.3 1.3-2.8 1.6-2 1.2-3.8.5-4.7-.3-.9-.9-2.3-2.4-5.5-1.5-3.7 1-4.5 5.7-2.5 8.4 6.5 6.1 12.8 4.1 15.2 3.3 2.4-.8 6.3-2.7 6.3-2.7l.6-6c-2-.8-4.1-.9-5.9-2.2z" class="st3" style="fill:#3a434e;fill-opacity:1"/><path d="M28.484191 82.915676c7.2 9.4 12.7 11.4 21.8 7.7 8.5-3.4 15.4-9 15.1-15-.3-6-2.1-10.3-9.1-9.8-2.3.2-6.8 2.8-9.6 4.4-1.8 1-4.2 2.2-6 .4-1.8-1.8-4.3-4.4-4.3-4.4m35.4-8.6c6.5 8.3 15.5 12.5 21.8 12.7" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.415676c-1.6.1-2.7-1.1-2.4-2.7l4.9-25.9c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6.5 3.7.7 4.6.2.9.3 3 .1 4.6l-2.2 21.3c-.2 1.6-1.7 3.1-3.3 3.3l-45.6 4z" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M55.684191 105.915676c-1.6.1-2.3-.4-2-2l4.4-25.6c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-45.5 3.1z" style="fill:#191b22;fill-opacity:1"/><path d="M53.184191 104.315676l4.9-26c.3-1.6 1.9-3 3.6-3.1l26.9-1.7c1.6-.1 3.6-1.4 4.4-2.9l.7-1.3c.7-1.5 2.7-2.8 4.4-2.9l4.5-.3c1.6-.1 3.1 1.1 3.3 2.8v.2c.2 1.6 1.3 2.9 2.5 2.8 1.2-.1 1.9 1.2 1.6 2.8l-5.2 24.9c-.3 1.6-2 3.1-3.6 3.2l-46.7 3.7m9.2-103.9c-.3 2.9-2.9 4.9-4.1 5.8m8-3.2c-.7 3.5-4 6-4 6" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M39.884191 53.615676c-2.3-2.2-4.2-2.5-6.6-.6-2.4 1.9-2.1 4.8.9 7.6 3.1 2.9 4.7 4.1 6.7 5 2 .9 5.4 2.5 10.5-2s10.2-11.1 9.4-14.7c-.8-3.6-4.1-1.8-6.8 1.2s-3.7 4-5.4 5.2c-1.7 1.2-3.8 3-8.7-1.7z" class="st0" style="fill:#93a1b5;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;fill-opacity:1"/><path d="M44.384191 61.315676c-2.3 0-4.7-1.2-6.6-3.1-.9-.9-1.1-2-.7-2.9.3-.8 1.1-1.3 1.8-1.3.2 0 .5 0 .7.1 2.3 2.1 4.2 3.2 5.9 3.2 1.6 0 2.7-.8 3.5-1.4 1.7-1.3 2.8-2.3 5.5-5.3.9-1.1 1.9-1.9 2.7-2.4.3.2.6.4.7.8.2.8-.2 2-.7 2.7-.9 1.3-4.9 5.4-9 8.4-1.1.7-2.4 1.2-3.8 1.2z" style="fill:#b3bfcd;fill-opacity:1"/><path d="M45.784191 50.115676c-.7 0-1.4-.6-1.4-1.4v-6.1c0-.7.6-1.4 1.4-1.4.7 0 1.4.6 1.4 1.4v6.1c0 .8-.6 1.4-1.4 1.4z"/><path d="M61.184191 118.215676c.7-7.1-3.5-10.6-9.2-11.1-5.7-.5-10.2 6.8-9.1 13.1 1.1 6.3 6.7 7.2 6.7 7.2" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M52.084191 107.515676c-2.2-.7-4.3-1.4-6.5-2.2-2.1-.8-4.3-1.5-6.4-2.3-.1 0-.2-.2-.1-.3 0-.1.2-.2.3-.2 2.2.6 4.4 1.3 6.5 1.9 2.2.7 4.3 1.3 6.5 2 .3.1.4.4.3.6-.1.4-.4.6-.6.5zm25.4 10.1c-.2-1.4-.2-2.9.1-4.2.2-1.4.6-2.7 1.1-4-.3 1.3-.5 2.7-.6 4.1 0 1.4.1 2.7.4 4 .1.3-.1.5-.3.6-.2.1-.6-.1-.7-.5 0 .1 0 .1 0 0z"/><path d="M104.284191 103.615676c-3.6-.7-8.5 2.1-9.5 9.7s2.1 10.7 5.3 11.6m15.1-83.5l-.39999 1.4m-1.90001-1.2c2.4 1.7 6.4 3.4 6.4 3.4m-1.6-2.6l-.60001 1.59999" class="st5" style="fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10"/><path d="M47.484191 79.215676c3.2 2.7 7 3.3 7 3.3" style="fill:none;stroke:#000;stroke-miterlimit:10"/><path d="M69.284191 24.315676c-3.5.4-2.7 2.9-1.2 3.5 1.5.6 3.7.1 4.3-1.6.4-1.6-1.3-2.1-3.1-1.9z" style="fill:#4f5862;fill-opacity:1"/></svg>
\ No newline at end of file
diff --git a/app/javascript/images/logo.svg b/app/javascript/images/logo.svg
deleted file mode 100644
index 034a9c2217..0000000000
--- a/app/javascript/images/logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M211.80734 139.0875c-3.18125 16.36625-28.4925 34.2775-57.5625 37.74875-15.15875 1.80875-30.08375 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.39125 27.9425 21.11625.7225 39.91875-5.20625 39.91875-5.20625l.8675 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23234 213.82 1.40609 165.31125.20859 116.09125c-.365-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67234 3.45375 78.20359.2425 107.86484 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.975 14.7525 32.975 65.0825 0 0 .41375 37.13375-4.59875 62.915" fill="#3088d4"/><path d="M177.50984 80.077v60.94125h-24.14375v-59.15c0-12.46875-5.24625-18.7975-15.74-18.7975-11.6025 0-17.4175 7.5075-17.4175 22.3525v32.37625H96.20734V85.42325c0-14.845-5.81625-22.3525-17.41875-22.3525-10.49375 0-15.74 6.32875-15.74 18.7975v59.15H38.90484V80.077c0-12.455 3.17125-22.3525 9.54125-29.675 6.56875-7.3225 15.17125-11.07625 25.85-11.07625 12.355 0 21.71125 4.74875 27.8975 14.2475l6.01375 10.08125 6.015-10.08125c6.185-9.49875 15.54125-14.2475 27.8975-14.2475 10.6775 0 19.28 3.75375 25.85 11.07625 6.36875 7.3225 9.54 17.22 9.54 29.675" fill="#fff"/></svg>
diff --git a/app/javascript/images/logo_alt.svg b/app/javascript/images/logo_alt.svg
deleted file mode 100644
index 102d4c787e..0000000000
--- a/app/javascript/images/logo_alt.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.41507 232.00976"><path d="M211.80683 139.0875c-3.1825 16.36625-28.4925 34.2775-57.5625 37.74875-15.16 1.80875-30.0825 3.47125-45.99875 2.74125-26.0275-1.1925-46.565-6.2125-46.565-6.2125 0 2.53375.15625 4.94625.46875 7.2025 3.38375 25.68625 25.47 27.225 46.3925 27.9425 21.115.7225 39.91625-5.20625 39.91625-5.20625l.86875 19.09s-14.77 7.93125-41.08125 9.39c-14.50875.7975-32.52375-.365-53.50625-5.91875C9.23183 213.82 1.40558 165.31125.20808 116.09125c-.36375-14.61375-.14-28.39375-.14-39.91875 0-50.33 32.97625-65.0825 32.97625-65.0825C49.67058 3.45375 78.20308.2425 107.86433 0h.72875c29.66125.2425 58.21125 3.45375 74.8375 11.09 0 0 32.97625 14.7525 32.97625 65.0825 0 0 .4125 37.13375-4.6 62.915" fill="#3088d4"/><path d="M65.68743 96.45938c0 9.01375-7.3075 16.32125-16.3225 16.32125-9.01375 0-16.32-7.3075-16.32-16.32125 0-9.01375 7.30625-16.3225 16.32-16.3225 9.015 0 16.3225 7.30875 16.3225 16.3225M124.52893 96.45938c0 9.01375-7.30875 16.32125-16.3225 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.3225 7.30875 16.3225 16.3225M183.36933 96.45938c0 9.01375-7.3075 16.32125-16.32125 16.32125-9.01375 0-16.32125-7.3075-16.32125-16.32125 0-9.01375 7.3075-16.3225 16.32125-16.3225 9.01375 0 16.32125 7.30875 16.32125 16.3225" fill="#fff"/></svg>
diff --git a/app/javascript/images/logo_full.svg b/app/javascript/images/logo_full.svg
deleted file mode 100644
index c33883342d..0000000000
--- a/app/javascript/images/logo_full.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 713.35878 175.8678"><path d="M160.55476 105.43125c-2.4125 12.40625-21.5975 25.9825-43.63375 28.61375-11.49125 1.3725-22.80375 2.63125-34.8675 2.07875-19.73-.90375-35.2975-4.71-35.2975-4.71 0 1.92125.11875 3.75.355 5.46 2.565 19.47 19.3075 20.6375 35.16625 21.18125 16.00625.5475 30.2575-3.9475 30.2575-3.9475l.65875 14.4725s-11.19625 6.01125-31.14 7.11625c-10.99875.605-24.65375-.27625-40.56-4.485C6.99851 162.08 1.06601 125.31.15851 88-.11899 76.9225.05226 66.47625.05226 57.74125c0-38.1525 24.99625-49.335 24.99625-49.335C37.65226 2.6175 59.27976.18375 81.76351 0h.5525c22.48375.18375 44.125 2.6175 56.72875 8.40625 0 0 24.99625 11.1825 24.99625 49.335 0 0 .3125 28.1475-3.48625 47.69" fill="#3088d4"/><path d="M34.65751 48.494c0-5.55375 4.5025-10.055 10.055-10.055 5.55375 0 10.055 4.50125 10.055 10.055 0 5.5525-4.50125 10.055-10.055 10.055-5.5525 0-10.055-4.5025-10.055-10.055M178.86476 60.69975v46.195h-18.30125v-44.8375c0-9.4525-3.9775-14.24875-11.9325-14.24875-8.79375 0-13.2025 5.69125-13.2025 16.94375V89.2935h-18.19375V64.75225c0-11.2525-4.40875-16.94375-13.2025-16.94375-7.955 0-11.9325 4.79625-11.9325 14.24875v44.8375H73.79851v-46.195c0-9.44125 2.40375-16.94375 7.2325-22.495 4.98-5.55 11.50125-8.395 19.595-8.395 9.36625 0 16.45875 3.59875 21.14625 10.79875l4.56 7.6425 4.55875-7.6425c4.68875-7.2 11.78-10.79875 21.1475-10.79875 8.09375 0 14.61375 2.845 19.59375 8.395 4.82875 5.55125 7.2325 13.05375 7.2325 22.495M241.91276 83.663625c3.77625-3.99 5.595-9.015 5.595-15.075 0-6.06-1.81875-11.085-5.595-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.84875 5.91125-3.6375 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.81875 11.085 5.45625 15.075 3.63625 3.8425 8.2525 5.76375 13.84875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.595-52.025h18.04625v73.9h-18.04625v-8.72125c-5.455 7.2425-13.01 10.79-22.80125 10.79-9.3725 0-17.34625-3.695-24.06125-11.23375-6.57375-7.5375-9.93125-16.84875-9.93125-27.785 0-10.78875 3.3575-20.10125 9.93125-27.63875 6.715-7.5375 14.68875-11.38 24.06125-11.38 9.79125 0 17.34625 3.5475 22.80125 10.78875v-8.72zM326.26951 67.258625c5.315 3.99 7.97375 9.60625 7.83375 16.7 0 7.53875-2.65875 13.45-8.11375 17.58875-5.45625 3.99125-12.03 6.06-20.00375 6.06-14.40875 0-24.20125-5.9125-29.3775-17.58875l15.66875-9.31c2.0975 6.35375 6.71375 9.60625 13.70875 9.60625 6.43375 0 9.6525-2.07 9.6525-6.35625 0-3.10375-4.1975-5.91125-12.73-8.1275-3.21875-.8875-5.87625-1.77375-7.97375-2.51375-2.9375-1.18125-5.455-2.5125-7.55375-4.1375-5.17625-3.99-7.83375-9.3125-7.83375-16.11 0-7.2425 2.5175-13.00625 7.55375-17.145 5.17625-4.28625 11.47-6.355 19.025-6.355 12.03 0 20.84375 5.1725 26.5775 15.66625l-15.38625 8.8675c-2.23875-5.02375-6.015-7.53625-11.19125-7.53625-5.45625 0-8.11375 2.06875-8.11375 6.05875 0 3.10375 4.19625 5.91125 12.73 8.12875 6.575 1.4775 11.75 3.695 15.5275 6.50375M383.626635 49.966125h-15.8075v30.7425c0 3.695 1.4 5.91125 4.0575 6.945 1.95875.74 5.875.8875 11.75.59125v17.29375c-12.16875 1.4775-20.9825.295-26.15875-3.69625-5.175-3.8425-7.69375-10.93625-7.69375-21.13375v-30.7425h-12.17v-18.3275h12.17v-14.9275l18.045-5.76375v20.69125h15.8075v18.3275zM441.124885 83.2205c3.6375-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.8175-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.93125 1.92-13.56875 5.76375-3.4975 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.81875 10.6425 5.31625 14.6325 3.6375 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.13375-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.4975-20.1 10.63125-27.6375 7.13375-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.165-3.69375-26.29875-11.2325M524.92126 83.663625c3.6375-3.99 5.455-9.015 5.455-15.075 0-6.06-1.8175-11.085-5.455-14.9275-3.63625-3.99125-8.25375-5.91125-13.84875-5.91125-5.59625 0-10.2125 1.92-13.98875 5.91125-3.63625 3.8425-5.45625 8.8675-5.45625 14.9275 0 6.06 1.82 11.085 5.45625 15.075 3.77625 3.8425 8.5325 5.76375 13.98875 5.76375 5.595 0 10.2125-1.92125 13.84875-5.76375m5.455-81.585h18.04625v103.46h-18.04625v-8.72125c-5.315 7.2425-12.87 10.79-22.66125 10.79-9.3725 0-17.485-3.695-24.2-11.23375-6.575-7.5375-9.9325-16.84875-9.9325-27.785 0-10.78875 3.3575-20.10125 9.9325-27.63875 6.715-7.5375 14.8275-11.38 24.2-11.38 9.79125 0 17.34625 3.5475 22.66125 10.78875v-38.28zM611.79626 83.2205c3.63625-3.84375 5.455-8.72125 5.455-14.6325 0-5.91125-1.81875-10.78875-5.455-14.63125-3.6375-3.84375-8.11375-5.76375-13.57-5.76375-5.455 0-9.9325 1.92-13.56875 5.76375-3.49875 3.99-5.31625 8.8675-5.31625 14.63125 0 5.765 1.8175 10.6425 5.31625 14.6325 3.63625 3.8425 8.11375 5.76375 13.56875 5.76375 5.45625 0 9.9325-1.92125 13.57-5.76375m-39.86875 13.15375c-7.135-7.5375-10.63125-16.70125-10.63125-27.78625 0-10.9375 3.49625-20.1 10.63125-27.6375 7.135-7.5375 15.9475-11.38 26.29875-11.38 10.3525 0 19.165 3.8425 26.3 11.38 7.135 7.5375 10.77125 16.84875 10.77125 27.6375 0 10.9375-3.63625 20.24875-10.77125 27.78625-7.135 7.53875-15.8075 11.2325-26.3 11.2325-10.49125 0-19.16375-3.69375-26.29875-11.2325M713.35876 60.163875v45.37375h-18.04625v-43.00875c0-4.8775-1.25875-8.5725-3.77625-11.38-2.37875-2.5125-5.73625-3.84375-10.0725-3.84375-10.2125 0-15.3875 6.06-15.3875 18.3275v39.905h-18.04625v-73.89875h18.04625v8.27625c4.33625-6.94625 11.19-10.345 20.84375-10.345 7.69375 0 13.98875 2.66 18.885 8.12875 5.035 5.46875 7.55375 12.85875 7.55375 22.465" fill="#fff"/></svg>
diff --git a/app/javascript/images/logo_transparent.svg b/app/javascript/images/logo_transparent.svg
deleted file mode 100644
index abd6d1f67d..0000000000
--- a/app/javascript/images/logo_transparent.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 216.4144 232.00976"><path d="M107.86523 0C78.203984.2425 49.672422 3.4535937 33.044922 11.089844c0 0-32.97656262 14.752031-32.97656262 65.082031 0 11.525-.224375 25.306175.140625 39.919925 1.19750002 49.22 9.02375002 97.72843 54.53124962 109.77343 20.9825 5.55375 38.99711 6.71547 53.505856 5.91797 26.31125-1.45875 41.08203-9.38867 41.08203-9.38867l-.86914-19.08984s-18.80171 5.92758-39.91796 5.20508c-20.921254-.7175-43.006879-2.25516-46.390629-27.94141-.3125-2.25625-.46875-4.66938-.46875-7.20313 0 0 20.536953 5.0204 46.564449 6.21289 15.915.73001 30.8393-.93343 45.99805-2.74218 29.07-3.47125 54.38125-21.3818 57.5625-37.74805 5.0125-25.78125 4.59961-62.916015 4.59961-62.916015 0-50.33-32.97461-65.082031-32.97461-65.082031C166.80539 3.4535938 138.255.2425 108.59375 0h-.72852zM74.296875 39.326172c12.355 0 21.710234 4.749297 27.896485 14.248047l6.01367 10.080078 6.01563-10.080078c6.185-9.49875 15.54023-14.248047 27.89648-14.248047 10.6775 0 19.28156 3.753672 25.85156 11.076172 6.36875 7.3225 9.53907 17.218828 9.53907 29.673828v60.941408h-24.14454V81.869141c0-12.46875-5.24453-18.798829-15.73828-18.798829-11.6025 0-17.41797 7.508516-17.41797 22.353516v32.375002H96.207031V85.423828c0-14.845-5.815468-22.353515-17.417969-22.353516-10.49375 0-15.740234 6.330079-15.740234 18.798829v59.148439H38.904297V80.076172c0-12.455 3.171016-22.351328 9.541015-29.673828 6.568751-7.3225 15.172813-11.076172 25.851563-11.076172z" fill="#fff"/></svg>
\ No newline at end of file
diff --git a/app/javascript/images/preview.jpg b/app/javascript/images/preview.jpg
deleted file mode 100644
index ec28567484445dd96612b642c4b90df996744d44..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 292252
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

diff --git a/app/javascript/mastodon/features/compose/index.js b/app/javascript/mastodon/features/compose/index.js
index b65d056cf7..8a67eae611 100644
--- a/app/javascript/mastodon/features/compose/index.js
+++ b/app/javascript/mastodon/features/compose/index.js
@@ -12,7 +12,6 @@ import Motion from '../ui/util/optional_motion';
 import spring from 'react-motion/lib/spring';
 import SearchResultsContainer from './containers/search_results_container';
 import { changeComposing } from '../../actions/compose';
-import elephantUIPlane from '../../../images/elephant_ui_plane.svg';
 import { mascot } from '../../initial_state';
 import Icon from 'mastodon/components/icon';
 
@@ -107,11 +106,6 @@ class Compose extends React.PureComponent {
           {!isSearchPage && <div className='drawer__inner' onFocus={this.onFocus}>
             <NavigationContainer onClose={this.onBlur} />
             <ComposeFormContainer />
-            {multiColumn && (
-              <div className='drawer__inner__mastodon'>
-                <img alt='' draggable='false' src={mascot || elephantUIPlane} />
-              </div>
-            )}
           </div>}
 
           <Motion defaultStyle={{ x: isSearchPage ? 0 : -100 }} style={{ x: spring(showSearch || isSearchPage ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
diff --git a/app/javascript/mastodon/features/introduction/index.js b/app/javascript/mastodon/features/introduction/index.js
index 754477bb99..6bc40c3eee 100644
--- a/app/javascript/mastodon/features/introduction/index.js
+++ b/app/javascript/mastodon/features/introduction/index.js
@@ -8,11 +8,10 @@ import { closeOnboarding } from '../../actions/onboarding';
 import screenHello from '../../../images/screen_hello.svg';
 import screenFederation from '../../../images/screen_federation.svg';
 import screenInteractions from '../../../images/screen_interactions.svg';
-import logoTransparent from '../../../images/logo_transparent.svg';
 
 const FrameWelcome = ({ domain, onNext }) => (
   <div className='introduction__frame'>
-    <div className='introduction__illustration' style={{ background: `url(${logoTransparent}) no-repeat center center / auto 80%` }}>
+    <div className='introduction__illustration'>
       <img src={screenHello} alt='' />
     </div>
 
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index d975af397d..532d06ccaa 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -2714,7 +2714,6 @@ a.status-card.compact:hover {
   }
 
   &__figure {
-    background: url('~images/elephant_ui_working.svg') no-repeat center 0;
     width: 100%;
     height: 160px;
     background-size: contain;
@@ -2726,10 +2725,6 @@ a.status-card.compact:hover {
 
   &.missing-indicator {
     padding-top: 20px + 48px;
-
-    .regeneration-indicator__figure {
-      background-image: url('~images/elephant_ui_disappointed.svg');
-    }
   }
 
   &__label {
diff --git a/app/javascript/styles/mastodon/modal.scss b/app/javascript/styles/mastodon/modal.scss
index 10de454c69..2a0d477ac9 100644
--- a/app/javascript/styles/mastodon/modal.scss
+++ b/app/javascript/styles/mastodon/modal.scss
@@ -15,7 +15,6 @@
   > * {
     flex: 1;
     max-height: 235px;
-    background: url('~images/elephant_ui_plane.svg') no-repeat left bottom / contain;
   }
 }
 
-- 
GitLab


From a8728445674027f2c1ee7b07c7527e131c4ce67a Mon Sep 17 00:00:00 2001
From: Morgan Bazalgette <the@howl.moe>
Date: Sat, 31 Mar 2018 16:31:39 +0200
Subject: [PATCH 170/192] Pleroma theme for mastofe
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

- resize columns dynamically, with min width of 330↵
- Change colours of mastodon frontend↵
- make avatars circled↵
- add slight hint of rounding on main ui components↵
---
 .../glitch/styles/components/status.scss      |  2 +-
 .../flavours/glitch/styles/variables.scss     | 20 ++++++++++++-------
 .../features/compose/components/search.js     |  2 +-
 .../styles/mastodon/components.scss           | 12 ++++++++---
 app/javascript/styles/mastodon/variables.scss | 14 +++++++++----
 5 files changed, 34 insertions(+), 16 deletions(-)

diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 65d3ee2251..774f91cf6a 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -32,7 +32,7 @@
   }
 
   a {
-    color: $secondary-text-color;
+    color: $pleroma-links;
     text-decoration: none;
 
     &:hover {
diff --git a/app/javascript/flavours/glitch/styles/variables.scss b/app/javascript/flavours/glitch/styles/variables.scss
index 1ed1a57787..f817f08c55 100644
--- a/app/javascript/flavours/glitch/styles/variables.scss
+++ b/app/javascript/flavours/glitch/styles/variables.scss
@@ -8,11 +8,17 @@ $gold-star: #ca8f04;        // Dark Goldenrod
 
 $red-bookmark: $warning-red;
 
+// Pleroma-Dark colors
+$pleroma-bg: #121a24;
+$pleroma-fg: #182230;
+$pleroma-text: #b9b9ba;
+$pleroma-links: #d8a070;
+
 // Values from the classic Mastodon UI
-$classic-base-color: #282c37;         // Midnight Express
-$classic-primary-color: #9baec8;      // Echo Blue
-$classic-secondary-color: #d9e1e8;    // Pattens Blue
-$classic-highlight-color: #2b90d9;    // Summer Sky
+$classic-base-color: $pleroma-bg;
+$classic-primary-color: #9baec8;
+$classic-secondary-color: #d9e1e8;
+$classic-highlight-color: #d8a070;
 
 // Variables for defaults in UI
 $base-shadow-color: $black !default;
@@ -51,9 +57,9 @@ $media-modal-media-max-height: 80%;
 
 $no-gap-breakpoint: 415px;
 
-$font-sans-serif: 'mastodon-font-sans-serif' !default;
-$font-display: 'mastodon-font-display' !default;
-$font-monospace: 'mastodon-font-monospace' !default;
+$font-sans-serif: sans-serif !default;
+$font-display: sans-serif !default;
+$font-monospace: monospace !default;
 
 // Avatar border size (8% default, 100% for rounded avatars)
 $ui-avatar-border-size: 8%;
diff --git a/app/javascript/mastodon/features/compose/components/search.js b/app/javascript/mastodon/features/compose/components/search.js
index 1ab197ac58..8f34df49ac 100644
--- a/app/javascript/mastodon/features/compose/components/search.js
+++ b/app/javascript/mastodon/features/compose/components/search.js
@@ -21,7 +21,7 @@ class SearchPopout extends React.PureComponent {
     const { style } = this.props;
     const extraInformation = searchEnabled ? <FormattedMessage id='search_popout.tips.full_text' defaultMessage='Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.' /> : <FormattedMessage id='search_popout.tips.text' defaultMessage='Simple text returns matching display names, usernames and hashtags' />;
     return (
-      <div style={{ ...style, position: 'absolute', width: 285 }}>
+      <div style={{ ...style, position: 'absolute', width: 315 }}>
         <Motion defaultStyle={{ opacity: 0, scaleX: 0.85, scaleY: 0.75 }} style={{ opacity: spring(1, { damping: 35, stiffness: 400 }), scaleX: spring(1, { damping: 35, stiffness: 400 }), scaleY: spring(1, { damping: 35, stiffness: 400 }) }}>
           {({ opacity, scaleX, scaleY }) => (
             <div className='search-popout' style={{ opacity: opacity, transform: `scale(${scaleX}, ${scaleY})` }}>
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 532d06ccaa..ca644c9c0e 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -669,7 +669,7 @@
   }
 
   a {
-    color: $secondary-text-color;
+    color: $pleroma-links;
     text-decoration: none;
 
     &:hover {
@@ -1862,6 +1862,8 @@ a.account__display-name {
 
   > .scrollable {
     background: $ui-base-color;
+    border-bottom-left-radius: 2px;
+    border-bottom-right-radius: 2px;
   }
 }
 
@@ -1875,7 +1877,7 @@ a.account__display-name {
 }
 
 .drawer {
-  width: 300px;
+  width: 330px;
   box-sizing: border-box;
   display: flex;
   flex-direction: column;
@@ -1944,7 +1946,7 @@ a.account__display-name {
 
   .column,
   .drawer {
-    flex: 0 0 auto;
+    flex: 1 1 auto;
     padding: 10px;
     padding-left: 5px;
     padding-right: 5px;
@@ -1989,6 +1991,7 @@ a.account__display-name {
   overflow-y: auto;
   width: 100%;
   height: 100%;
+  border-radius: 2px;
 
   &.darker {
     background: $ui-base-color;
@@ -2025,6 +2028,7 @@ a.account__display-name {
   margin-bottom: 10px;
   display: flex;
   flex-direction: row;
+  border-radius: 2px;
 
   a {
     transition: background 100ms ease-in;
@@ -2775,6 +2779,8 @@ a.status-card.compact:hover {
   z-index: 2;
   outline: 0;
   overflow: hidden;
+  border-top-left-radius: 2px;
+  border-top-right-radius: 2px;
 
   & > button {
     margin: 0;
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index a82c442296..bb07eefb54 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -6,11 +6,17 @@ $error-red: #df405a !default;        // Cerise
 $warning-red: #ff5050 !default;      // Sunset Orange
 $gold-star: #ca8f04 !default;        // Dark Goldenrod
 
+// Pleroma-Dark colors
+$pleroma-bg: #121a24;
+$pleroma-fg: #182230;
+$pleroma-text: #b9b9ba;
+$pleroma-links: #d8a070;
+
 // Values from the classic Mastodon UI
-$classic-base-color: #282c37;         // Midnight Express
-$classic-primary-color: #9baec8;      // Echo Blue
-$classic-secondary-color: #d9e1e8;    // Pattens Blue
-$classic-highlight-color: #2b90d9;    // Summer Sky
+$classic-base-color: $pleroma-bg;
+$classic-primary-color: #9baec8;
+$classic-secondary-color: #d9e1e8;
+$classic-highlight-color: #d8a070;
 
 // Variables for defaults in UI
 $base-shadow-color: $black !default;
-- 
GitLab


From f8cd770a7e889ac66296492a3f0f47a51db3fa70 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Wed, 4 Jul 2018 15:13:25 +0200
Subject: [PATCH 171/192] Revert: Resize images before upload in web UI to
 reduce bandwidth

Closes: https://git.pleroma.social/pleroma/mastofe/issues/22

(Can also fix an issue with canvas and the Tor Browser)
---
 .../flavours/glitch/actions/compose.js        | 50 +++++++++++++------
 app/javascript/mastodon/actions/compose.js    | 33 ++++++------
 2 files changed, 53 insertions(+), 30 deletions(-)

diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index a24316da21..54216383ad 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -5,7 +5,6 @@ import { search as emojiSearch } from 'flavours/glitch/util/emoji/emoji_mart_sea
 import { useEmoji } from './emojis';
 import { tagHistory } from 'flavours/glitch/util/settings';
 import { recoverHashtags } from 'flavours/glitch/util/hashtag';
-import resizeImage from 'flavours/glitch/util/resize_image';
 
 import { updateTimeline } from './timelines';
 import { showAlertForError } from './alerts';
@@ -219,21 +218,42 @@ export function uploadCompose(files) {
     }
     dispatch(uploadComposeRequest());
 
-    for (const [i, f] of Array.from(files).entries()) {
-      if (media.size + i > 3) break;
-
-      resizeImage(f).then(file => {
-        const data = new FormData();
-        data.append('file', file);
-
-        return api(getState).post('/api/v1/media', data, {
-          onUploadProgress: function({ loaded }){
-            progress[i] = loaded;
-            dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
-          },
-        }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
-      }).catch(error => dispatch(uploadComposeFail(error)));
+    for (const [i, file] of Array.from(files).entries()) {
+      // Looks useless or should reuse uploadLimit
+      // if (media.size + i > 3) break;
+
+      const data = new FormData();
+      data.append('file', file);
+
+      api(getState).post('/api/v1/media', data, {
+        onUploadProgress: function({ loaded }){
+          progress[i] = loaded;
+          dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
+        },
+      }).then(function (response) {
+        dispatch(uploadComposeSuccess(response.data));
+      }).catch(function (error) {
+        dispatch(uploadComposeFail(error));
+      });
     };
+
+   /*
+    * Previous pre-multiple upload code
+    *
+    * a372436a8... Revert: Resize images before upload in web UI to reduce bandwidth
+    *
+    * let data = new FormData();
+    * data.append('file', files[0]);
+    * api(getState).post('/api/v1/media', data, {
+    *   onUploadProgress: function (e) {
+    *     dispatch(uploadComposeProgress(e.loaded, e.total));
+    *   },
+    * }).then(function (response) {
+    *   dispatch(uploadComposeSuccess(response.data));
+    * }).catch(function (error) {
+    *   dispatch(uploadComposeFail(error));
+    * });
+    */
   };
 };
 
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index 0be2a5cd46..07462db8e4 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -4,7 +4,6 @@ import { throttle } from 'lodash';
 import { search as emojiSearch } from '../features/emoji/emoji_mart_search_light';
 import { tagHistory } from '../settings';
 import { useEmoji } from './emojis';
-import resizeImage from '../utils/resize_image';
 import { importFetchedAccounts } from './importer';
 import { updateTimeline } from './timelines';
 import { showAlertForError } from './alerts';
@@ -201,20 +200,24 @@ export function uploadCompose(files) {
     }
     dispatch(uploadComposeRequest());
 
-    for (const [i, f] of Array.from(files).entries()) {
-      if (media.size + i > 3) break;
-
-      resizeImage(f).then(file => {
-        const data = new FormData();
-        data.append('file', file);
-
-        return api(getState).post('/api/v1/media', data, {
-          onUploadProgress: function({ loaded }){
-            progress[i] = loaded;
-            dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
-          },
-        }).then(({ data }) => dispatch(uploadComposeSuccess(data)));
-      }).catch(error => dispatch(uploadComposeFail(error)));
+    for (const [i, file] of Array.from(files).entries()) {
+      // Looks useless or should reuse uploadLimit
+      // if (media.size + i > 3) break;
+
+      let data = new FormData();
+      data.append('file', file);
+
+      api(getState).post('/api/v1/media', data, {
+        onUploadProgress: function(e) {
+          // progress[i] = loaded;
+          // dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
+          dispatch(uploadComposeProgress(e.loaded, e.total));
+        },
+      }).then(function (response) {
+        dispatch(uploadComposeSuccess(response.data));
+      }).catch(function (error) {
+        dispatch(uploadComposeFail(error));
+      });
     };
   };
 };
-- 
GitLab


From 9fab20c069f0271f5f3940609dadc463e3d723c8 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 12 Aug 2018 18:06:18 +0200
Subject: [PATCH 172/192] config/webpack/production.js: Remove caching in
 OfflinePlugin (introduced in 0692991b5)

---
 config/webpack/production.js | 31 +------------------------------
 1 file changed, 1 insertion(+), 30 deletions(-)

diff --git a/config/webpack/production.js b/config/webpack/production.js
index 0e9aa0c1c0..1539dae71f 100644
--- a/config/webpack/production.js
+++ b/config/webpack/production.js
@@ -58,36 +58,7 @@ module.exports = merge(sharedConfig, {
   plugins: [
     new OfflinePlugin({
       publicPath: publicPath, // sw.js must be served from the root to avoid scope issues
-      caches: {
-        main: [':rest:'],
-        additional: [':externals:'],
-        optional: [
-          '**/locale_*.js', // don't fetch every locale; the user only needs one
-          '**/*_polyfills-*.js', // the user may not need polyfills
-          '**/*.woff2', // the user may have system-fonts enabled
-          // images/audio can be cached on-demand
-          '**/*.png',
-          '**/*.jpg',
-          '**/*.jpeg',
-          '**/*.svg',
-          '**/*.mp3',
-          '**/*.ogg',
-        ],
-      },
-      externals: [
-        '/emoji/1f602.svg', // used for emoji picker dropdown
-        '/emoji/sheet_10.png', // used in emoji-mart
-      ],
-      excludes: [
-        '**/*.map',
-        'stats.json',
-        'report.html',
-        // any browser that supports ServiceWorker will support woff2
-        '**/*.eot',
-        '**/*.ttf',
-        '**/*-webfont-*.svg',
-        '**/*.woff',
-      ],
+      caches: {},
       ServiceWorker: {
         entry: `imports-loader?ATTACHMENT_HOST=>${encodeURIComponent(JSON.stringify(attachmentHost))}!${encodeURI(path.join(__dirname, '../../app/javascript/mastodon/service_worker/entry.js'))}`,
         cacheName: 'mastodon',
-- 
GitLab


From 10df6a5aa1197ab7d4c5be4941b394ce0d48b096 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Mon, 13 Aug 2018 18:21:51 +0200
Subject: [PATCH 173/192] Change pleroma config endpoint from static to
 api-based

---
 app/javascript/mastodon/actions/pleroma.js  | 2 +-
 app/javascript/mastodon/reducers/pleroma.js | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js
index 7b879acb4b..a4ab8cd801 100644
--- a/app/javascript/mastodon/actions/pleroma.js
+++ b/app/javascript/mastodon/actions/pleroma.js
@@ -38,7 +38,7 @@ export function fetchPleromaConfig() {
   return (dispatch, getState) => {
     dispatch(fetchPleromaConfigRequest());
 
-    api(getState).get('/static/config.json').then(response => {
+    api(getState).get('/api/statusnet/config.json').then(response => {
       dispatch(fetchPleromaConfigSuccess(response.data));
     }).catch(error => {
       dispatch(fetchPleromaConfigFail(error));
diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js
index 4cbf59b0bc..2cd5a1a4aa 100644
--- a/app/javascript/mastodon/reducers/pleroma.js
+++ b/app/javascript/mastodon/reducers/pleroma.js
@@ -11,7 +11,7 @@ export function custom_panel(state = initialPanel, action) {
   case PANEL_FETCH_SUCCESS:
     return state.set('panel', action.panel); break;
   case PLEROMA_CONFIG_FETCH_SUCCESS:
-    return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false);
+    return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false);
   }
 
   return state;
-- 
GitLab


From 025762cde3f986f88b53935803695acfd8850080 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 14 Sep 2018 03:40:16 +0200
Subject: [PATCH 174/192] [glitch-port] initial_state.js: consistent
 max_toot_chars

---
 app/javascript/flavours/glitch/util/initial_state.js | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/util/initial_state.js b/app/javascript/flavours/glitch/util/initial_state.js
index c34a818ff2..90a6dbed62 100644
--- a/app/javascript/flavours/glitch/util/initial_state.js
+++ b/app/javascript/flavours/glitch/util/initial_state.js
@@ -22,10 +22,13 @@ export const favouriteModal = getMeta('favourite_modal');
 export const deleteModal = getMeta('delete_modal');
 export const me = getMeta('me');
 export const searchEnabled = getMeta('search_enabled');
-export const maxChars = (initialState && initialState.max_toot_chars) || 500;
+export const maxChars = getMeta('max_toot_chars') || 500;
+//@TODO: Look if possible to reuse for AdminAPI
 export const invitesEnabled = getMeta('invites_enabled');
+//Should it be set to something?
 export const version = getMeta('version');
 export const mascot = getMeta('mascot');
+//@TODO: Look if possible to reuse for AdminAPI
 export const isStaff = getMeta('is_staff');
 
 export const deleteOthersNotice = getRight('delete_others_notice');
-- 
GitLab


From 859f855b5f2116a09a39a74dd01b97a1b0c399c1 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Thu, 22 Nov 2018 07:51:34 +0100
Subject: [PATCH 175/192] flavours/glitch/util/backend_links.js: Initial
 Configuration

---
 app/javascript/flavours/glitch/util/backend_links.js | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/javascript/flavours/glitch/util/backend_links.js b/app/javascript/flavours/glitch/util/backend_links.js
index 4fc03f9190..07b3951ea9 100644
--- a/app/javascript/flavours/glitch/util/backend_links.js
+++ b/app/javascript/flavours/glitch/util/backend_links.js
@@ -1,6 +1,6 @@
-export const preferencesLink = '/settings/preferences';
-export const profileLink = '/settings/profile';
+export const preferencesLink = '/settings';
+export const profileLink = '/user-settings';
 export const signOutLink = '/auth/sign_out';
 export const termsLink = '/terms';
-export const accountAdminLink = (id) => `/admin/accounts/${id}`;
-export const statusAdminLink = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`;
+export const accountAdminLink = undefined; // = (id) => `/admin/accounts/${id}`;
+export const statusAdminLink = undefined; // = (account_id, status_id) => `/admin/accounts/${account_id}/statuses/${status_id}`;
-- 
GitLab


From 2e941b80aab0fdb96d83025fd16403e06470a47a Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Feb 2019 23:21:04 +0100
Subject: [PATCH 176/192] flavours/glitch/components/error_boundary: Add
 switching to pleroma-fe

---
 .../flavours/glitch/components/error_boundary.js         | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/app/javascript/flavours/glitch/components/error_boundary.js b/app/javascript/flavours/glitch/components/error_boundary.js
index 142a0c21a1..d84bd857aa 100644
--- a/app/javascript/flavours/glitch/components/error_boundary.js
+++ b/app/javascript/flavours/glitch/components/error_boundary.js
@@ -55,7 +55,7 @@ export default class ErrorBoundary extends React.PureComponent {
                 <FormattedMessage
                   id='web_app_crash.report_issue'
                   defaultMessage='Report a bug in the {issuetracker}'
-                  values={{ issuetracker: <a href='https://github.com/glitch-soc/mastodon/issues' rel='noopener' target='_blank'><FormattedMessage id='web_app_crash.issue_tracker' defaultMessage='issue tracker' /></a> }}
+                  values={{ issuetracker: <a href='https://git.pleroma.social/pleroma/mastofe/issues' rel='noopener' target='_blank'><FormattedMessage id='web_app_crash.issue_tracker' defaultMessage='issue tracker' /></a> }}
                 />
                 { debugInfo !== '' && (
                   <details>
@@ -85,6 +85,13 @@ export default class ErrorBoundary extends React.PureComponent {
                   />
                 </li>
               )}
+              <li>
+                <FormattedMessage
+                  id='web_app_crash.load_pleromafe'
+                  defaultMessage='Load {pleromafe} instead of mastofe'
+                  values={{ pleromafe: <a href='/main/all'><FormattedMessage id='web_app_crash.pleromafe' defaultMessage='Pleroma Frontend' /></a> }}
+                />
+              </li>
             </ul>
           </p>
         </div>
-- 
GitLab


From 83328a7cb1ab00cbb965a8e2a69d5700c13574d0 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Feb 2019 23:34:57 +0100
Subject: [PATCH 177/192] README.md: Update notes

---
 README.md | 53 +++++++++++------------------------------------------
 1 file changed, 11 insertions(+), 42 deletions(-)

diff --git a/README.md b/README.md
index f22b062f40..0da87f1f91 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,6 @@
-# Glitch-fe: glitch-soc frontend for pleroma
+# Mastodon Frontend, Glitch-soc + Pleroma Edition
 
-Here is a fork of mastodon. We could really just remove all of the code except
-for the frontend, but to easily pull the upstream repo we'll just keep
-everything. This is my fork for the moment with the idea of making the mastofe
-just as polished as the pleromafe. If you want to get access, open an issue or
-hit me up at howl@social.zxq.co.
+Here is a distribution of the glitch-soc frontend for pleroma. Everything from the upstream repository is kept and rebased on for easy updates, this does screws up on Merge Requests so they’ll be treated as a patchset if done here.
 
 # Deployement
 
@@ -16,39 +12,13 @@ This is what you want to do to update the mastofe bundled with pleroma.
   - ``git commit -m "update mastofe"``
 
 # Development
-
-I use a combination of the pleroma backend + yarn + nginx to do local
-development. I refuse to install Ruby. Here's how to get it running on your own
-machine:
-
-## Install yarn
-
-Yarn will be needed to set up the mastodon frontend for development. Check out
-https://yarnpkg.com/lang/en/docs/install/ . For Debian, it's like this:
-
-```sh
-# import yarn pub key and repo
-curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
-echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
-sudo apt-get update
-sudo apt-get install yarn
-```
-
-## Mastodon Frontend Setup
-
-```sh
-# Install dependencies
-yarn install -D
-npm run dev
-# check that http://localhost:3035/packs/common.css works in your browser once
-# webpack is done compiling. if css shows up, then it should have worked!
-```
+## Tools
+- Node.js
+- yarn (preferred) or npm
+- HTTP proxy (such as nginx)
 
 ## nginx setup
-
-I'll assume that you have already fired up pleroma using the installation guide.
-To work on the frontend while still having the backend up, use this nginx
-config.
+I'll assume that you have already fired up pleroma using the installation guide. To work on the frontend while still having the backend up, use this nginx config.
 
 ```
 server {
@@ -75,9 +45,8 @@ server {
 }
 ```
 
-Change the `server_name` if you like. I personally like to create a new entry
-in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you.
+Change the `server_name` if you like. I personally like to create a new entry in /etc/hosts and add `127.0.0.1 pleroma.testing`, but you do what suits you.
 
-If you have enough luck, navigating to your \<server\_name\>/web should show
-you the mastodon frontend, and should also work with all the nice things of
-webpack such as hot reloading. Have fun!
+## Running
+- Getting the node dependencies is done with `yarn install -D` (or `npm install` if you don’t have yarn)
+- Launching the frontend is done with `npm run dev`. It should be reachable once it finnishes compiling.
-- 
GitLab


From 8e3718cf85c92bc9f35a18dc1f60a13e0aedab3f Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Feb 2019 11:30:46 +0100
Subject: [PATCH 178/192] mastodon/features/getting_started/index.js: Warn
 against support of vanilla

---
 app/javascript/mastodon/features/getting_started/index.js | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index c05e5cb110..02a4e673e1 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -204,6 +204,10 @@ class GettingStarted extends ImmutablePureComponent {
                   pleroma: <a href='https://pleroma.social' rel='noopener' target='_blank'>Pleroma</a>,
                 }}
               />
+              <FormattedMessage
+                id='getting_started.vanilla_support_warning'
+                defaultMessage='Please be warned that the vanilla flavour isn’t as supported as the glitch one, expect bugs related to the API'
+              />
             </p>
           </div>
         </div>
-- 
GitLab


From 9f515e806488242f344140a893f2ff78d3541221 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Feb 2019 13:54:34 +0100
Subject: [PATCH 179/192] Getting-Started: Add button to switch between the two
 flavours

---
 .../features/getting_started_misc/index.js    |  8 ++++
 app/javascript/mastodon/actions/pleroma.js    | 40 +++++++++++++++++++
 .../features/getting_started/index.js         | 12 +++++-
 3 files changed, 58 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/getting_started_misc/index.js b/app/javascript/flavours/glitch/features/getting_started_misc/index.js
index ee4452472f..d5db4c9ea8 100644
--- a/app/javascript/flavours/glitch/features/getting_started_misc/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started_misc/index.js
@@ -8,6 +8,7 @@ import ColumnLink from 'flavours/glitch/features/ui/components/column_link';
 import ColumnSubheading from 'flavours/glitch/features/ui/components/column_subheading';
 import { openModal } from 'flavours/glitch/actions/modal';
 import { connect } from 'react-redux';
+import { switchFlavour } from 'mastodon/actions/pleroma';
 
 const messages = defineMessages({
   heading: { id: 'column.heading', defaultMessage: 'Misc' },
@@ -22,6 +23,7 @@ const messages = defineMessages({
   info: { id: 'navigation_bar.info', defaultMessage: 'Extended information' },
   keyboard_shortcuts: { id: 'navigation_bar.keyboard_shortcuts', defaultMessage: 'Keyboard shortcuts' },
   featured_users: { id: 'navigation_bar.featured_users', defaultMessage: 'Featured users' },
+  switch_to_vanilla: { id: 'navigation_bar.switch_to_vanilla', defaultMessage: 'Switch to Vanilla Flavour' },
 });
 
 @connect()
@@ -31,6 +33,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent {
   static propTypes = {
     intl: PropTypes.object.isRequired,
     dispatch: PropTypes.func.isRequired,
+    switchFlavour: PropTypes.func.isRequired,
   };
 
   openOnboardingModal = (e) => {
@@ -41,6 +44,10 @@ export default class gettingStartedMisc extends ImmutablePureComponent {
     this.props.dispatch(openModal('PINNED_ACCOUNTS_EDITOR'));
   }
 
+  switch_flavour_vanilla = (e) => {
+    this.props.dispatch(switchFlavour('vanilla'));
+  }
+
   render () {
     const { intl } = this.props;
 
@@ -61,6 +68,7 @@ export default class gettingStartedMisc extends ImmutablePureComponent {
           <ColumnLink key='{i++}' icon='question' text={intl.formatMessage(messages.keyboard_shortcuts)} to='/keyboard-shortcuts' />
           <ColumnLink key='{i++}' icon='book' text={intl.formatMessage(messages.info)} href='/about/more' />
           <ColumnLink key='{i++}' icon='hand-o-right' text={intl.formatMessage(messages.show_me_around)} onClick={this.openOnboardingModal} />
+          <ColumnLink key='{i++}' icon='exchange' text={intl.formatMessage(messages.switch_to_vanilla)} onClick={this.switch_flavour_vanilla} />
         </div>
       </Column>
     );
diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js
index a4ab8cd801..d64fe52c47 100644
--- a/app/javascript/mastodon/actions/pleroma.js
+++ b/app/javascript/mastodon/actions/pleroma.js
@@ -3,6 +3,9 @@ import api from '../api';
 export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST';
 export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS';
 export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL';
+export const FLAVOUR_SWITCH_REQUEST = 'FLAVOUR_SWITCH_REQUEST';
+export const FLAVOUR_SWITCH_SUCCESS = 'FLAVOUR_SWITCH_SUCCESS';
+export const FLAVOUR_SWITCH_FAIL = 'FLAVOUR_SWITCH_FAIL';
 export const PANEL_FETCH_REQUEST = 'PANEL_FETCH_REQUEST';
 export const PANEL_FETCH_SUCCESS = 'PANEL_FETCH_SUCCESS';
 export const PANEL_FETCH_FAIL = 'PANEL_FETCH_FAIL';
@@ -10,6 +13,22 @@ export const PLEROMA_CONFIG_FETCH_REQUEST = 'PLEROMA_CONFIG_FETCH_REQUEST';
 export const PLEROMA_CONFIG_FETCH_SUCCESS = 'PLEROMA_CONFIG_FETCH_SUCCESS';
 export const PLEROMA_CONFIG_FETCH_FAIL = 'PLEROMA_CONFIG_FETCH_FAIL';
 
+export function switchFlavour(flavour) {
+  return (dispatch, getState) => {
+    dispatch(switchFlavourRequest());
+    if(flavour === undefined) {
+      flavour = 'glitch';
+    }
+
+    api(getState).post('/api/v1/pleroma/flavour/'+flavour).then(response => {
+      dispatch(switchFlavourSuccess(response.data));
+      location.href = '/web/getting-started';
+    }).catch(error => {
+      dispatch(switchFlavourFail(error));
+    });
+  };
+};
+
 export function fetchTOS() {
   return (dispatch, getState) => {
     dispatch(fetchTOSRequest());
@@ -66,6 +85,27 @@ export function fetchTOSFail(error) {
   };
 };
 
+export function switchFlavourRequest() {
+  return {
+    type: FLAVOUR_SWITCH_REQUEST,
+  };
+};
+
+export function switchFlavourSuccess(tos) {
+  return {
+    type: FLAVOUR_SWITCH_SUCCESS,
+    tos,
+  };
+};
+
+export function switchFlavourFail(error) {
+  return {
+    type: FLAVOUR_SWITCH_FAIL,
+    error,
+  };
+};
+
+
 export function fetchPanelRequest() {
   return {
     type: PANEL_FETCH_REQUEST,
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index 02a4e673e1..3676dd60da 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -9,7 +9,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import { me, invitesEnabled, profile_directory } from '../../initial_state';
 import { fetchFollowRequests } from '../../actions/accounts';
-import { fetchPanel, fetchPleromaConfig } from 'mastodon/actions/pleroma';
+import { fetchPanel, fetchPleromaConfig, switchFlavour } from 'mastodon/actions/pleroma';
 import { List as ImmutableList } from 'immutable';
 import { Link } from 'react-router-dom';
 import NavigationBar from '../compose/components/navigation_bar';
@@ -35,6 +35,7 @@ const messages = defineMessages({
   security: { id: 'navigation_bar.security', defaultMessage: 'Security' },
   menu: { id: 'getting_started.heading', defaultMessage: 'Getting started' },
   profile_directory: { id: 'getting_started.directory', defaultMessage: 'Profile directory' },
+  switch_to_glitch: { id: 'navigation_bar.switch_to_glitch', defaultMessage: 'Switch to Glitch Flavour' },
 });
 
 const mapStateToProps = state => ({
@@ -48,6 +49,7 @@ const mapDispatchToProps = dispatch => ({
   fetchFollowRequests: () => dispatch(fetchFollowRequests()),
   fetchPanel: () => dispatch(fetchPanel()),
   fetchPleromaConfig: () => dispatch(fetchPleromaConfig()),
+  switchFlavour: () => dispatch(switchFlavour()),
 });
 
 const badgeDisplay = (number, limit) => {
@@ -72,12 +74,17 @@ class GettingStarted extends ImmutablePureComponent {
     fetchFollowRequests: PropTypes.func.isRequired,
     fetchPanel: PropTypes.func.isRequired,
     fetchPleromaConfig: PropTypes.func.isRequired,
+    switchFlavour: PropTypes.func.isRequired,
     unreadFollowRequests: PropTypes.number,
     unreadNotifications: PropTypes.number,
     customPanelEnabled: PropTypes.bool,
     customPanel: PropTypes.string.isRequired,
   };
 
+  switch_flavour_glitch = (e) => {
+    this.props.switchFlavour('glitch');
+  }
+
   componentDidMount () {
     const { myAccount, fetchFollowRequests, fetchPleromaConfig, fetchPanel } = this.props;
 
@@ -129,7 +136,8 @@ class GettingStarted extends ImmutablePureComponent {
     navItems.push(
       <ColumnLink key={i++} icon='envelope' text={intl.formatMessage(messages.direct)} to='/timelines/direct' />,
       <ColumnLink key={i++} icon='star' text={intl.formatMessage(messages.favourites)} to='/favourites' />,
-      <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />
+      <ColumnLink key={i++} icon='list-ul' text={intl.formatMessage(messages.lists)} to='/lists' />,
+      <a key={i++} href='#' onClick={this.switch_flavour_glitch} className='column-link' tabIndex='0'><i className={`fa fa-fw fa-exchange column-link__icon`} />{intl.formatMessage(messages.switch_to_glitch)}</a>
     );
 
     height += 48*3;
-- 
GitLab


From 210a7a578a78210e54fe12d22a10a33197ddefea Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 10 Feb 2019 19:28:33 +0100
Subject: [PATCH 180/192] README.md: Add notes on branches

---
 README.md | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/README.md b/README.md
index 0da87f1f91..99fb403947 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,11 @@ This is what you want to do to update the mastofe bundled with pleroma.
   - ``git commit -m "update mastofe"``
 
 # Development
+## Branches
+- `pleroma` branch which merges from `rebase/glitch-soc` once it is stable
+- `rebase/glitch-soc`: branch which rebases from upstream, used for testing
+- Development branches are targeting `rebase/glitch-soc` and thus can need a frequent rebase
+
 ## Tools
 - Node.js
 - yarn (preferred) or npm
-- 
GitLab


From cdf95800dba536a2094b46ed61935d378cab1242 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Thu, 21 Feb 2019 21:52:48 +0100
Subject: [PATCH 181/192] flavours/glitch/reducers/compose.js: Fix toLowerCase
 TypeError

[Error] TypeError: e.toLowerCase is not a function. (In 'e.toLowerCase()', 'e.toLowerCase' is undefined)

Some added context: https://queer.hacktivis.me/notice/9g4OfhpIWQLNoZ3mLI
---
 app/javascript/flavours/glitch/reducers/compose.js | 2 +-
 app/javascript/mastodon/reducers/compose.js        | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index 7281cbd61e..0695002538 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -216,7 +216,7 @@ const updateSuggestionTags = (state, token) => {
 
   return state.merge({
     suggestions: state.get('tagHistory')
-      .filter(tag => tag.toLowerCase().startsWith(prefix.toLowerCase()))
+      .filter(tag => tag && tag.toLowerCase().startsWith(prefix.toLowerCase()))
       .slice(0, 4)
       .map(tag => '#' + tag),
     suggestion_token: token,
diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js
index 1622871b8f..42344c5986 100644
--- a/app/javascript/mastodon/reducers/compose.js
+++ b/app/javascript/mastodon/reducers/compose.js
@@ -133,7 +133,7 @@ const updateSuggestionTags = (state, token) => {
 
   return state.merge({
     suggestions: state.get('tagHistory')
-      .filter(tag => tag.toLowerCase().startsWith(prefix.toLowerCase()))
+      .filter(tag => tag && tag.toLowerCase().startsWith(prefix.toLowerCase()))
       .slice(0, 4)
       .map(tag => '#' + tag),
     suggestion_token: token,
-- 
GitLab


From b0fc8b087691da38b1f46333551838e0fa48c51d Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Mar 2019 05:43:01 +0100
Subject: [PATCH 182/192] build.sh: Do not override TARGET

Related: https://git.pleroma.social/pleroma/mastofe/issues/55
---
 build.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/build.sh b/build.sh
index 9a218c3a2e..27a92cc2b5 100755
--- a/build.sh
+++ b/build.sh
@@ -1,5 +1,5 @@
 #!/bin/sh
-TARGET="../pleroma" # Where pleroma’s repository is sitting
+TARGET="${TARGET:-../pleroma}" # Where pleroma’s repository is sitting
 
 yarn install -D
 
-- 
GitLab


From dd6198088a7f2a0b9d3e64aba3d74e2c12163600 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Mar 2019 05:51:13 +0100
Subject: [PATCH 183/192] =?UTF-8?q?build.sh:=20Error=20out=20when=20TARGET?=
 =?UTF-8?q?=20isn=E2=80=99t=20a=20pleroma=20repository?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes: https://git.pleroma.social/pleroma/mastofe/issues/55
---
 build.sh | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/build.sh b/build.sh
index 27a92cc2b5..52c0e0165d 100755
--- a/build.sh
+++ b/build.sh
@@ -1,6 +1,13 @@
 #!/bin/sh
 TARGET="${TARGET:-../pleroma}" # Where pleroma’s repository is sitting
 
+if [[ ! -d "${TARGET}/priv/static" ]]
+then
+	echo "Error: ${TARGET}/priv/static directory is missing, are you sure TARGET is set to a pleroma repository?"
+	echo "Info: TARGET=${TARGET}"
+	exit 1
+fi
+
 yarn install -D
 
 rm -rf public/packs public/assets
-- 
GitLab


From a8d713dc3d064527608bb191b2e462324d797504 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Mar 2019 10:11:56 +0100
Subject: [PATCH 184/192] README.md: Add `master` branch usage, try a cleaner
 way to do MRs

---
 README.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 99fb403947..4a2ca60ae8 100644
--- a/README.md
+++ b/README.md
@@ -14,8 +14,12 @@ This is what you want to do to update the mastofe bundled with pleroma.
 # Development
 ## Branches
 - `pleroma` branch which merges from `rebase/glitch-soc` once it is stable
+- `master`: Same branch as upstream repository
 - `rebase/glitch-soc`: branch which rebases from upstream, used for testing
-- Development branches are targeting `rebase/glitch-soc` and thus can need a frequent rebase
+
+For developement/Merge Requests I would suggest to use `master` when you are introducing new modifications that cannot be in the upstream, and when you are changing current modifications prefer `rebase/glitch-soc`.
+
+Never use `pleroma` as a base for Merge Requests, it is not meant to be modified directly.
 
 ## Tools
 - Node.js
-- 
GitLab


From 640c456fdf982eab8f566795f7c9a1ae7a8d024d Mon Sep 17 00:00:00 2001
From: KokaKiwi <kokakiwi@kokakiwi.net>
Date: Sun, 17 Feb 2019 23:53:51 +0100
Subject: [PATCH 185/192] Add status content type dropdown to compose box.

---
 .../flavours/glitch/actions/compose.js        |  9 ++++
 .../glitch/features/composer/index.js         | 11 ++++
 .../glitch/features/composer/options/index.js | 51 +++++++++++++++++++
 .../flavours/glitch/reducers/compose.js       |  6 +++
 4 files changed, 77 insertions(+)

diff --git a/app/javascript/flavours/glitch/actions/compose.js b/app/javascript/flavours/glitch/actions/compose.js
index 54216383ad..a7ef6860ef 100644
--- a/app/javascript/flavours/glitch/actions/compose.js
+++ b/app/javascript/flavours/glitch/actions/compose.js
@@ -45,6 +45,7 @@ export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
 export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
 export const COMPOSE_VISIBILITY_CHANGE  = 'COMPOSE_VISIBILITY_CHANGE';
 export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
+export const COMPOSE_CONTENT_TYPE_CHANGE = 'COMPOSE_CONTENT_TYPE_CHANGE';
 
 export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
 
@@ -132,6 +133,7 @@ export function submitCompose(routerHistory) {
     }
     api(getState).post('/api/v1/statuses', {
       status,
+      content_type: getState().getIn(['compose', 'content_type']),
       in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
       media_ids: media.map(item => item.get('id')),
       sensitive: getState().getIn(['compose', 'sensitive']) || (spoilerText.length > 0 && media.size !== 0),
@@ -510,6 +512,13 @@ export function changeComposeVisibility(value) {
   };
 };
 
+export function changeComposeContentType(value) {
+  return {
+    type: COMPOSE_CONTENT_TYPE_CHANGE,
+    value,
+  };
+};
+
 export function insertEmojiCompose(position, emoji) {
   return {
     type: COMPOSE_EMOJI_INSERT,
diff --git a/app/javascript/flavours/glitch/features/composer/index.js b/app/javascript/flavours/glitch/features/composer/index.js
index ec0e405a47..d81ef385c2 100644
--- a/app/javascript/flavours/glitch/features/composer/index.js
+++ b/app/javascript/flavours/glitch/features/composer/index.js
@@ -15,6 +15,7 @@ import {
   changeComposeSpoilerText,
   changeComposeSpoilerness,
   changeComposeVisibility,
+  changeComposeContentType,
   changeUploadCompose,
   clearComposeSuggestions,
   fetchComposeSuggestions,
@@ -88,6 +89,7 @@ function mapStateToProps (state) {
     media: state.getIn(['compose', 'media_attachments']),
     preselectDate: state.getIn(['compose', 'preselectDate']),
     privacy: state.getIn(['compose', 'privacy']),
+    contentType: state.getIn(['compose', 'content_type']),
     progress: state.getIn(['compose', 'progress']),
     inReplyTo: inReplyTo ? state.getIn(['statuses', inReplyTo]) : null,
     replyAccount: inReplyTo ? state.getIn(['statuses', inReplyTo, 'account']) : null,
@@ -116,6 +118,9 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
   onChangeAdvancedOption(option, value) {
     dispatch(changeComposeAdvancedOption(option, value));
   },
+  onChangeContentType(value) {
+    dispatch(changeComposeContentType(value));
+  },
   onChangeDescription(id, description) {
     dispatch(changeUploadCompose(id, { description }));
   },
@@ -388,6 +393,7 @@ class Composer extends React.Component {
       advancedOptions,
       amUnlocked,
       anyMedia,
+      contentType,
       intl,
       isSubmitting,
       isChangingUpload,
@@ -396,6 +402,7 @@ class Composer extends React.Component {
       media,
       onCancelReply,
       onChangeAdvancedOption,
+      onChangeContentType,
       onChangeDescription,
       onChangeSensitivity,
       onChangeSpoilerness,
@@ -478,6 +485,7 @@ class Composer extends React.Component {
         <ComposerOptions
           acceptContentTypes={acceptContentTypes}
           advancedOptions={advancedOptions}
+          contentType={contentType}
           disabled={isSubmitting}
           full={media ? media.size >= 4 || media.some(
             item => item.get('type') === 'video'
@@ -485,6 +493,7 @@ class Composer extends React.Component {
           hasMedia={media && !!media.size}
           intl={intl}
           onChangeAdvancedOption={onChangeAdvancedOption}
+          onChangeContentType={onChangeContentType}
           onChangeSensitivity={onChangeSensitivity}
           onChangeVisibility={onChangeVisibility}
           onDoodleOpen={onOpenDoodleModal}
@@ -529,6 +538,7 @@ Composer.propTypes = {
   media: ImmutablePropTypes.list,
   preselectDate: PropTypes.instanceOf(Date),
   privacy: PropTypes.string,
+  contentType: PropTypes.string,
   progress: PropTypes.number,
   inReplyTo: ImmutablePropTypes.map,
   resetFileKey: PropTypes.number,
@@ -548,6 +558,7 @@ Composer.propTypes = {
   //  Dispatch props.
   onCancelReply: PropTypes.func,
   onChangeAdvancedOption: PropTypes.func,
+  onChangeContentType: PropTypes.func,
   onChangeDescription: PropTypes.func,
   onChangeSensitivity: PropTypes.func,
   onChangeSpoilerText: PropTypes.func,
diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js
index 5b4a7444c0..8e18f38bbb 100644
--- a/app/javascript/flavours/glitch/features/composer/options/index.js
+++ b/app/javascript/flavours/glitch/features/composer/options/index.js
@@ -34,6 +34,10 @@ const messages = defineMessages({
     defaultMessage: 'Adjust status privacy',
     id: 'privacy.change',
   },
+  content_type: {
+    defaultMessage: 'Content type',
+    id: 'content-type.change',
+  },
   direct_long: {
     defaultMessage: 'Post to mentioned users only',
     id: 'privacy.direct.long',
@@ -46,6 +50,10 @@ const messages = defineMessages({
     defaultMessage: 'Draw something',
     id: 'compose.attach.doodle',
   },
+  html: {
+    defaultMessage: 'HTML',
+    id: 'compose.content-type.html',
+  },
   local_only_long: {
     defaultMessage: 'Do not post to other instances',
     id: 'advanced_options.local-only.long',
@@ -54,6 +62,14 @@ const messages = defineMessages({
     defaultMessage: 'Local-only',
     id: 'advanced_options.local-only.short',
   },
+  markdown: {
+    defaultMessage: 'Markdown',
+    id: 'compose.content-type.markdown',
+  },
+  plain: {
+    defaultMessage: 'Plain text',
+    id: 'compose.content-type.plain',
+  },
   private_long: {
     defaultMessage: 'Post to followers only',
     id: 'privacy.private.long',
@@ -159,6 +175,7 @@ export default class ComposerOptions extends React.PureComponent {
     const {
       acceptContentTypes,
       advancedOptions,
+      contentType,
       disabled,
       full,
       hasMedia,
@@ -166,6 +183,7 @@ export default class ComposerOptions extends React.PureComponent {
       onChangeAdvancedOption,
       onChangeSensitivity,
       onChangeVisibility,
+      onChangeContentType,
       onModalClose,
       onModalOpen,
       onToggleSpoiler,
@@ -204,6 +222,24 @@ export default class ComposerOptions extends React.PureComponent {
       },
     };
 
+    const contentTypeItems = {
+      plain: {
+        icon: 'file',
+        name: 'text/plain',
+        text: <FormattedMessage {...messages.plain} />,
+      },
+      html: {
+        icon: 'file-text',
+        name: 'text/html',
+        text: <FormattedMessage {...messages.html} />,
+      },
+      markdown: {
+        icon: 'file-text',
+        name: 'text/markdown',
+        text: <FormattedMessage {...messages.markdown} />,
+      },
+    };
+
     //  The result.
     return (
       <div className='composer--options'>
@@ -286,6 +322,19 @@ export default class ComposerOptions extends React.PureComponent {
           title={intl.formatMessage(messages.change_privacy)}
           value={privacy}
         />
+        <Dropdown
+          icon="code"
+          items={[
+            contentTypeItems.plain,
+            contentTypeItems.html,
+            contentTypeItems.markdown,
+          ]}
+          onChange={onChangeContentType}
+          onModalClose={onModalClose}
+          onModalOpen={onModalOpen}
+          title={intl.formatMessage(messages.content_type)}
+          value={contentType}
+        />
         {onToggleSpoiler && (
           <TextIconButton
             active={spoiler}
@@ -328,6 +377,7 @@ export default class ComposerOptions extends React.PureComponent {
 ComposerOptions.propTypes = {
   acceptContentTypes: PropTypes.string,
   advancedOptions: ImmutablePropTypes.map,
+  contentType: PropTypes.string,
   disabled: PropTypes.bool,
   full: PropTypes.bool,
   hasMedia: PropTypes.bool,
@@ -335,6 +385,7 @@ ComposerOptions.propTypes = {
   onChangeAdvancedOption: PropTypes.func,
   onChangeSensitivity: PropTypes.func,
   onChangeVisibility: PropTypes.func,
+  onChangeContentType: PropTypes.func,
   onDoodleOpen: PropTypes.func,
   onModalClose: PropTypes.func,
   onModalOpen: PropTypes.func,
diff --git a/app/javascript/flavours/glitch/reducers/compose.js b/app/javascript/flavours/glitch/reducers/compose.js
index 0695002538..4cb9c121e8 100644
--- a/app/javascript/flavours/glitch/reducers/compose.js
+++ b/app/javascript/flavours/glitch/reducers/compose.js
@@ -25,6 +25,7 @@ import {
   COMPOSE_SPOILERNESS_CHANGE,
   COMPOSE_SPOILER_TEXT_CHANGE,
   COMPOSE_VISIBILITY_CHANGE,
+  COMPOSE_CONTENT_TYPE_CHANGE,
   COMPOSE_EMOJI_INSERT,
   COMPOSE_UPLOAD_CHANGE_REQUEST,
   COMPOSE_UPLOAD_CHANGE_SUCCESS,
@@ -60,6 +61,7 @@ const initialState = ImmutableMap({
   spoiler: false,
   spoiler_text: '',
   privacy: null,
+  content_type: 'text/plain',
   text: '',
   focusDate: null,
   caretPosition: null,
@@ -294,6 +296,10 @@ export default function compose(state = initialState, action) {
     return state
       .set('privacy', action.value)
       .set('idempotencyKey', uuid());
+  case COMPOSE_CONTENT_TYPE_CHANGE:
+    return state
+      .set('content_type', action.value)
+      .set('idempotencyKey', uuid());
   case COMPOSE_CHANGE:
     return state
       .set('text', action.text)
-- 
GitLab


From 37e72c35d0be969230e18b345a1ff645cf4faa65 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 1 Apr 2018 23:09:35 +0200
Subject: [PATCH 186/192] Allow status rich-formatting

---
 .../glitch/styles/components/status.scss        | 17 ++++++++++++++++-
 app/javascript/styles/mastodon/components.scss  | 17 ++++++++++++++++-
 2 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 774f91cf6a..3e3792ebfb 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -8,10 +8,25 @@
   font-size: 15px;
   line-height: 20px;
   word-wrap: break-word;
-  font-weight: 400;
   overflow: visible;
   padding-top: 5px;
 
+  em {
+    font-style: italic;
+  }
+
+  strong {
+    font-weight: bold;
+  }
+
+  ul { list-style: disc inside; }
+  ol { list-style: decimal inside; }
+
+  blockquote {
+    margin: .2em 0 .2em 2em;
+    font-style: italic;
+  }
+
   &:focus {
     outline: 0;
   }
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index ca644c9c0e..0848df009f 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -635,7 +635,6 @@
   font-size: 15px;
   line-height: 20px;
   word-wrap: break-word;
-  font-weight: 400;
   overflow: hidden;
   text-overflow: ellipsis;
   padding-top: 2px;
@@ -721,6 +720,22 @@
       display: block;
     }
   }
+
+  em {
+    font-style: italic;
+  }
+
+  strong {
+    font-weight: bold;
+  }
+
+  ul { list-style: disc inside; }
+  ol { list-style: decimal inside; }
+
+  blockquote {
+    margin: .2em 0 .2em 2em;
+    font-style: italic;
+  }
 }
 
 .status__content.status__content--collapsed {
-- 
GitLab


From bc52654ec74741c600dd9321adf286edc7e2057a Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Fri, 1 Mar 2019 11:45:16 +0100
Subject: [PATCH 187/192] Content-Type Dropdown: use the selected option icon
 for the menu

---
 .../flavours/glitch/features/composer/options/index.js   | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js
index 8e18f38bbb..7b8d174b5c 100644
--- a/app/javascript/flavours/glitch/features/composer/options/index.js
+++ b/app/javascript/flavours/glitch/features/composer/options/index.js
@@ -224,17 +224,17 @@ export default class ComposerOptions extends React.PureComponent {
 
     const contentTypeItems = {
       plain: {
-        icon: 'file',
+        icon: 'align-left',
         name: 'text/plain',
         text: <FormattedMessage {...messages.plain} />,
       },
       html: {
-        icon: 'file-text',
+        icon: 'code',
         name: 'text/html',
         text: <FormattedMessage {...messages.html} />,
       },
       markdown: {
-        icon: 'file-text',
+        icon: 'arrow-circle-down',
         name: 'text/markdown',
         text: <FormattedMessage {...messages.markdown} />,
       },
@@ -323,7 +323,8 @@ export default class ComposerOptions extends React.PureComponent {
           value={privacy}
         />
         <Dropdown
-          icon="code"
+          disabled={disabled}
+          icon={(contentTypeItems[contentType.split('/')[1]] || {}).icon}
           items={[
             contentTypeItems.plain,
             contentTypeItems.html,
-- 
GitLab


From 0e656e1a58120cbabdec4e661db0ceabd7f3e1aa Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Mar 2019 10:00:59 +0100
Subject: [PATCH 188/192] Remove unsupported Delete&Redraft

---
 app/javascript/flavours/glitch/components/status_action_bar.js   | 1 -
 .../flavours/glitch/features/status/components/action_bar.js     | 1 -
 app/javascript/mastodon/components/status_action_bar.js          | 1 -
 3 files changed, 3 deletions(-)

diff --git a/app/javascript/flavours/glitch/components/status_action_bar.js b/app/javascript/flavours/glitch/components/status_action_bar.js
index dda174f66f..bb8d4802c4 100644
--- a/app/javascript/flavours/glitch/components/status_action_bar.js
+++ b/app/javascript/flavours/glitch/components/status_action_bar.js
@@ -218,7 +218,6 @@ export default class StatusActionBar extends ImmutablePureComponent {
       }
 
       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
-      menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
     } else {
       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
diff --git a/app/javascript/flavours/glitch/features/status/components/action_bar.js b/app/javascript/flavours/glitch/features/status/components/action_bar.js
index 66cc10d787..18e4736b13 100644
--- a/app/javascript/flavours/glitch/features/status/components/action_bar.js
+++ b/app/javascript/flavours/glitch/features/status/components/action_bar.js
@@ -162,7 +162,6 @@ export default class ActionBar extends React.PureComponent {
       menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });
       menu.push(null);
       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
-      menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
     } else {
       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
diff --git a/app/javascript/mastodon/components/status_action_bar.js b/app/javascript/mastodon/components/status_action_bar.js
index 77e7699d54..644ed538a4 100644
--- a/app/javascript/mastodon/components/status_action_bar.js
+++ b/app/javascript/mastodon/components/status_action_bar.js
@@ -213,7 +213,6 @@ class StatusActionBar extends ImmutablePureComponent {
       }
 
       menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });
-      menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });
     } else {
       menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });
       menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });
-- 
GitLab


From 2e180be76d275e4724c01631841acbc8cc1a80d2 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Mar 2019 10:03:33 +0100
Subject: [PATCH 189/192] Remove unsupported Local-only
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Note: It’s still being considered to be added, but in a different way so removing it for now
---
 .../flavours/glitch/features/composer/options/index.js      | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/composer/options/index.js b/app/javascript/flavours/glitch/features/composer/options/index.js
index 5b4a7444c0..364810381e 100644
--- a/app/javascript/flavours/glitch/features/composer/options/index.js
+++ b/app/javascript/flavours/glitch/features/composer/options/index.js
@@ -300,12 +300,6 @@ export default class ComposerOptions extends React.PureComponent {
           disabled={disabled}
           icon='ellipsis-h'
           items={advancedOptions ? [
-            {
-              meta: <FormattedMessage {...messages.local_only_long} />,
-              name: 'do_not_federate',
-              on: advancedOptions.get('do_not_federate'),
-              text: <FormattedMessage {...messages.local_only_short} />,
-            },
             {
               meta: <FormattedMessage {...messages.threaded_mode_long} />,
               name: 'threaded_mode',
-- 
GitLab


From 1a297466d2bd1b69432bf402f4c984c3570ceac5 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Mar 2019 12:12:59 +0100
Subject: [PATCH 190/192] Getting-Started: Change endpoint to
 /api/pleroma/frontend_configurations and key to masto_fe

---
 app/javascript/flavours/glitch/reducers/pleroma.js | 2 +-
 app/javascript/mastodon/actions/pleroma.js         | 4 ++--
 app/javascript/mastodon/reducers/pleroma.js        | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/javascript/flavours/glitch/reducers/pleroma.js b/app/javascript/flavours/glitch/reducers/pleroma.js
index 938eb94166..fb3871d787 100644
--- a/app/javascript/flavours/glitch/reducers/pleroma.js
+++ b/app/javascript/flavours/glitch/reducers/pleroma.js
@@ -11,7 +11,7 @@ export default function custom_panel(state = initialPanel, action) {
   case PANEL_FETCH_SUCCESS:
     return state.set('panel', action.panel); break;
   case PLEROMA_CONFIG_FETCH_SUCCESS:
-    return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false);
+    return state.set('enabled', (action.config || {}).showInstanceSpecificPanel);
   }
 
   return state;
diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js
index d64fe52c47..515b2f2b93 100644
--- a/app/javascript/mastodon/actions/pleroma.js
+++ b/app/javascript/mastodon/actions/pleroma.js
@@ -57,8 +57,8 @@ export function fetchPleromaConfig() {
   return (dispatch, getState) => {
     dispatch(fetchPleromaConfigRequest());
 
-    api(getState).get('/api/statusnet/config.json').then(response => {
-      dispatch(fetchPleromaConfigSuccess(response.data));
+    api(getState).get('/api/pleroma/frontend_configurations').then(response => {
+      dispatch(fetchPleromaConfigSuccess(response.data.masto_fe));
     }).catch(error => {
       dispatch(fetchPleromaConfigFail(error));
     });
diff --git a/app/javascript/mastodon/reducers/pleroma.js b/app/javascript/mastodon/reducers/pleroma.js
index 2cd5a1a4aa..4cbf59b0bc 100644
--- a/app/javascript/mastodon/reducers/pleroma.js
+++ b/app/javascript/mastodon/reducers/pleroma.js
@@ -11,7 +11,7 @@ export function custom_panel(state = initialPanel, action) {
   case PANEL_FETCH_SUCCESS:
     return state.set('panel', action.panel); break;
   case PLEROMA_CONFIG_FETCH_SUCCESS:
-    return state.set('enabled', (action.config || {}).site.pleromafe.showInstanceSpecificPanel || false);
+    return state.set('enabled', (action.config || {}).showInstanceSpecificPanel || false);
   }
 
   return state;
-- 
GitLab


From 35a8a73bfb744465886edb4c5df475b5b5656d61 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Mar 2019 12:13:56 +0100
Subject: [PATCH 191/192] =?UTF-8?q?Getting-Started:=20Don=E2=80=99t=20put?=
 =?UTF-8?q?=20a=20placeholder=20panel=20when=20it=E2=80=99s=20disabled?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../glitch/features/getting_started/index.js    | 17 ++---------------
 .../mastodon/features/getting_started/index.js  | 17 ++---------------
 2 files changed, 4 insertions(+), 30 deletions(-)

diff --git a/app/javascript/flavours/glitch/features/getting_started/index.js b/app/javascript/flavours/glitch/features/getting_started/index.js
index ac90863919..93ab5aa414 100644
--- a/app/javascript/flavours/glitch/features/getting_started/index.js
+++ b/app/javascript/flavours/glitch/features/getting_started/index.js
@@ -161,18 +161,7 @@ export default class GettingStarted extends ImmutablePureComponent {
       </div>,
     ]);
 
-    const dot = ' • ';
-    const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{__html: customPanel}} style={{marginLeft: -12, marginRight: -12}} /> :
-      <p>
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a>
-        {dot}
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a>
-        {dot}
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a>
-        {dot}
-        <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a>
-      </p>
-    );
+    const instance_panel = (customPanelEnabled ? <div className='getting-started getting-started__panel scrollable' dangerouslySetInnerHTML={{__html: customPanel}} /> : null);
 
     return (
       <Column name='getting-started' icon='asterisk' heading={intl.formatMessage(messages.heading)} label={intl.formatMessage(messages.menu)} hideHeadingOnMobile>
@@ -187,9 +176,7 @@ export default class GettingStarted extends ImmutablePureComponent {
           <ColumnLink icon='sign-out' text={intl.formatMessage(messages.sign_out)} href={signOutLink} method='delete' />
         </div>
 
-        <div className='getting-started getting-started__panel scrollable'>
-          {staticContent}
-        </div>
+        {instance_panel}
 
         <div className='getting-started__footer scrollable'>
           <p>
diff --git a/app/javascript/mastodon/features/getting_started/index.js b/app/javascript/mastodon/features/getting_started/index.js
index 3676dd60da..220a0fd8c0 100644
--- a/app/javascript/mastodon/features/getting_started/index.js
+++ b/app/javascript/mastodon/features/getting_started/index.js
@@ -156,18 +156,7 @@ class GettingStarted extends ImmutablePureComponent {
       height += 34 + 48;
     }
 
-    const dot = ' • ';
-    const staticContent = (customPanelEnabled ? <div dangerouslySetInnerHTML={{ __html: customPanel }} style={{ marginLeft: -12, marginRight: -12 }} /> : (
-      <p>
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/FAQ.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.faq' defaultMessage='FAQ' /></a>
-        {dot}
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.userguide' defaultMessage='User Guide' /></a>
-        {dot}
-        <a href='https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/Apps.md' rel='noopener' target='_blank'><FormattedMessage id='getting_started.appsshort' defaultMessage='Apps' /></a>
-        {dot}
-        <a href='https://pleroma.social'><FormattedMessage id='getting_started.pleroma' defaultMessage='Pleroma' /></a>
-      </p> )
-    );
+    const instance_panel = (customPanelEnabled ? <div className='getting-started getting-started__panel scrollable' dangerouslySetInnerHTML={{__html: customPanel}} /> : null);
 
     return (
       <Column label={intl.formatMessage(messages.menu)}>
@@ -188,9 +177,7 @@ class GettingStarted extends ImmutablePureComponent {
 
           {!multiColumn && <div className='flex-spacer' />}
 
-          <div className='getting-started getting-started__panel scrollable'>
-            {staticContent}
-          </div>
+          {instance_panel}
 
           {!multiColumn && <div className='flex-spacer' />}
 
-- 
GitLab


From 994b0d8563c04edc72e59c8fe8938fa006876051 Mon Sep 17 00:00:00 2001
From: "Haelwenn (lanodan) Monnier" <contact@hacktivis.me>
Date: Sun, 3 Mar 2019 12:14:47 +0100
Subject: [PATCH 192/192] mastodon/actions/pleroma.js: Remove unused
 terms-of-service code

---
 app/javascript/mastodon/actions/pleroma.js | 35 ----------------------
 1 file changed, 35 deletions(-)

diff --git a/app/javascript/mastodon/actions/pleroma.js b/app/javascript/mastodon/actions/pleroma.js
index 515b2f2b93..ed111effee 100644
--- a/app/javascript/mastodon/actions/pleroma.js
+++ b/app/javascript/mastodon/actions/pleroma.js
@@ -1,8 +1,5 @@
 import api from '../api';
 
-export const TOS_FETCH_REQUEST = 'TOS_FETCH_REQUEST';
-export const TOS_FETCH_SUCCESS = 'TOS_FETCH_SUCCESS';
-export const TOS_FETCH_FAIL = 'TOS_FETCH_FAIL';
 export const FLAVOUR_SWITCH_REQUEST = 'FLAVOUR_SWITCH_REQUEST';
 export const FLAVOUR_SWITCH_SUCCESS = 'FLAVOUR_SWITCH_SUCCESS';
 export const FLAVOUR_SWITCH_FAIL = 'FLAVOUR_SWITCH_FAIL';
@@ -29,18 +26,6 @@ export function switchFlavour(flavour) {
   };
 };
 
-export function fetchTOS() {
-  return (dispatch, getState) => {
-    dispatch(fetchTOSRequest());
-
-    api(getState).get('/static/terms-of-service.html').then(response => {
-      dispatch(fetchTOSSuccess(response.data));
-    }).catch(error => {
-      dispatch(fetchTOSFail(error));
-    });
-  };
-};
-
 export function fetchPanel() {
   return (dispatch, getState) => {
     dispatch(fetchPanelRequest());
@@ -65,26 +50,6 @@ export function fetchPleromaConfig() {
   };
 };
 
-export function fetchTOSRequest() {
-  return {
-    type: TOS_FETCH_REQUEST,
-  };
-};
-
-export function fetchTOSSuccess(tos) {
-  return {
-    type: TOS_FETCH_SUCCESS,
-    tos,
-  };
-};
-
-export function fetchTOSFail(error) {
-  return {
-    type: TOS_FETCH_FAIL,
-    error,
-  };
-};
-
 export function switchFlavourRequest() {
   return {
     type: FLAVOUR_SWITCH_REQUEST,
-- 
GitLab