about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStarfall <admin@plural.cafe>2020-06-19 13:14:45 -0500
committerStarfall <admin@plural.cafe>2020-06-19 13:14:45 -0500
commit5668836f56cddf3257f38a2483c1d42cacbad3a8 (patch)
treec241a44562f79ccecaf215eb572c22d559b08dd1
parent76f79dd29909d39f1d36ef48e6892223d59e29d7 (diff)
parentc7da2cc5a1821e589e7241aec21d8bb426722c2a (diff)
Merge branch 'glitch' into main
-rw-r--r--.dependabot/config.yml28
-rw-r--r--.env.vagrant1
-rw-r--r--Gemfile22
-rw-r--r--Gemfile.lock104
-rw-r--r--SECURITY.md12
-rw-r--r--app/controllers/accounts_controller.rb8
-rw-r--r--app/controllers/activitypub/claims_controller.rb21
-rw-r--r--app/controllers/activitypub/collections_controller.rb48
-rw-r--r--app/controllers/admin/custom_emojis_controller.rb2
-rw-r--r--app/controllers/api/v1/crypto/deliveries_controller.rb30
-rw-r--r--app/controllers/api/v1/crypto/encrypted_messages_controller.rb59
-rw-r--r--app/controllers/api/v1/crypto/keys/claims_controller.rb25
-rw-r--r--app/controllers/api/v1/crypto/keys/counts_controller.rb17
-rw-r--r--app/controllers/api/v1/crypto/keys/queries_controller.rb26
-rw-r--r--app/controllers/api/v1/crypto/keys/uploads_controller.rb29
-rw-r--r--app/controllers/auth/sessions_controller.rb52
-rw-r--r--app/controllers/concerns/sign_in_token_authentication_concern.rb50
-rw-r--r--app/controllers/concerns/two_factor_authentication_concern.rb48
-rw-r--r--app/controllers/settings/migration/redirects_controller.rb2
-rw-r--r--app/controllers/statuses_controller.rb2
-rw-r--r--app/controllers/tags_controller.rb4
-rw-r--r--app/helpers/application_helper.rb5
-rw-r--r--app/helpers/webfinger_helper.rb19
-rw-r--r--app/javascript/flavours/glitch/actions/importer/normalizer.js2
-rw-r--r--app/javascript/flavours/glitch/components/autosuggest_textarea.js2
-rw-r--r--app/javascript/flavours/glitch/components/scrollable_list.js5
-rw-r--r--app/javascript/flavours/glitch/components/status.js1
-rw-r--r--app/javascript/flavours/glitch/components/timeline_hint.js18
-rw-r--r--app/javascript/flavours/glitch/features/account_timeline/index.js28
-rw-r--r--app/javascript/flavours/glitch/features/audio/index.js1
-rw-r--r--app/javascript/flavours/glitch/features/emoji_picker/index.js7
-rw-r--r--app/javascript/flavours/glitch/features/followers/index.js26
-rw-r--r--app/javascript/flavours/glitch/features/following/index.js26
-rw-r--r--app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js4
-rw-r--r--app/javascript/flavours/glitch/features/status/components/card.js85
-rw-r--r--app/javascript/flavours/glitch/features/status/components/detailed_status.js2
-rw-r--r--app/javascript/flavours/glitch/features/ui/index.js11
-rw-r--r--app/javascript/flavours/glitch/styles/accessibility.scss10
-rw-r--r--app/javascript/flavours/glitch/styles/components/columns.scss21
-rw-r--r--app/javascript/flavours/glitch/styles/components/index.scss25
-rw-r--r--app/javascript/flavours/glitch/styles/components/status.scss26
-rw-r--r--app/javascript/flavours/glitch/styles/forms.scss2
-rw-r--r--app/javascript/flavours/glitch/styles/mastodon-light/variables.scss2
-rw-r--r--app/javascript/flavours/glitch/util/emoji/index.js16
-rw-r--r--app/javascript/mastodon/actions/importer/normalizer.js2
-rw-r--r--app/javascript/mastodon/components/autosuggest_textarea.js2
-rw-r--r--app/javascript/mastodon/components/modal_root.js2
-rw-r--r--app/javascript/mastodon/components/scrollable_list.js5
-rw-r--r--app/javascript/mastodon/components/status.js1
-rw-r--r--app/javascript/mastodon/components/timeline_hint.js18
-rw-r--r--app/javascript/mastodon/features/account_timeline/index.js28
-rw-r--r--app/javascript/mastodon/features/audio/index.js1
-rw-r--r--app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js7
-rw-r--r--app/javascript/mastodon/features/emoji/__tests__/emoji-test.js12
-rw-r--r--app/javascript/mastodon/features/emoji/emoji.js16
-rw-r--r--app/javascript/mastodon/features/followers/index.js28
-rw-r--r--app/javascript/mastodon/features/following/index.js28
-rw-r--r--app/javascript/mastodon/features/keyboard_shortcuts/index.js4
-rw-r--r--app/javascript/mastodon/features/status/components/card.js85
-rw-r--r--app/javascript/mastodon/features/status/components/detailed_status.js2
-rw-r--r--app/javascript/mastodon/features/ui/components/compose_panel.js38
-rw-r--r--app/javascript/mastodon/features/ui/index.js12
-rw-r--r--app/javascript/mastodon/locales/ar.json6
-rw-r--r--app/javascript/mastodon/locales/ast.json6
-rw-r--r--app/javascript/mastodon/locales/bg.json6
-rw-r--r--app/javascript/mastodon/locales/bn.json6
-rw-r--r--app/javascript/mastodon/locales/br.json6
-rw-r--r--app/javascript/mastodon/locales/ca.json6
-rw-r--r--app/javascript/mastodon/locales/co.json6
-rw-r--r--app/javascript/mastodon/locales/cs.json6
-rw-r--r--app/javascript/mastodon/locales/cy.json6
-rw-r--r--app/javascript/mastodon/locales/da.json6
-rw-r--r--app/javascript/mastodon/locales/de.json6
-rw-r--r--app/javascript/mastodon/locales/defaultMessages.json40
-rw-r--r--app/javascript/mastodon/locales/el.json6
-rw-r--r--app/javascript/mastodon/locales/en.json34
-rw-r--r--app/javascript/mastodon/locales/eo.json6
-rw-r--r--app/javascript/mastodon/locales/es-AR.json6
-rw-r--r--app/javascript/mastodon/locales/es.json6
-rw-r--r--app/javascript/mastodon/locales/et.json6
-rw-r--r--app/javascript/mastodon/locales/eu.json6
-rw-r--r--app/javascript/mastodon/locales/fa.json6
-rw-r--r--app/javascript/mastodon/locales/fi.json6
-rw-r--r--app/javascript/mastodon/locales/fr.json6
-rw-r--r--app/javascript/mastodon/locales/ga.json6
-rw-r--r--app/javascript/mastodon/locales/gl.json6
-rw-r--r--app/javascript/mastodon/locales/he.json6
-rw-r--r--app/javascript/mastodon/locales/hi.json6
-rw-r--r--app/javascript/mastodon/locales/hr.json6
-rw-r--r--app/javascript/mastodon/locales/hu.json6
-rw-r--r--app/javascript/mastodon/locales/hy.json6
-rw-r--r--app/javascript/mastodon/locales/id.json6
-rw-r--r--app/javascript/mastodon/locales/io.json6
-rw-r--r--app/javascript/mastodon/locales/is.json6
-rw-r--r--app/javascript/mastodon/locales/it.json6
-rw-r--r--app/javascript/mastodon/locales/ja.json6
-rw-r--r--app/javascript/mastodon/locales/ka.json6
-rw-r--r--app/javascript/mastodon/locales/kab.json6
-rw-r--r--app/javascript/mastodon/locales/kk.json6
-rw-r--r--app/javascript/mastodon/locales/kn.json6
-rw-r--r--app/javascript/mastodon/locales/ko.json6
-rw-r--r--app/javascript/mastodon/locales/lt.json6
-rw-r--r--app/javascript/mastodon/locales/lv.json6
-rw-r--r--app/javascript/mastodon/locales/mk.json6
-rw-r--r--app/javascript/mastodon/locales/ml.json6
-rw-r--r--app/javascript/mastodon/locales/mr.json6
-rw-r--r--app/javascript/mastodon/locales/ms.json6
-rw-r--r--app/javascript/mastodon/locales/nl.json6
-rw-r--r--app/javascript/mastodon/locales/nn.json6
-rw-r--r--app/javascript/mastodon/locales/no.json6
-rw-r--r--app/javascript/mastodon/locales/oc.json6
-rw-r--r--app/javascript/mastodon/locales/pl.json6
-rw-r--r--app/javascript/mastodon/locales/pt-BR.json6
-rw-r--r--app/javascript/mastodon/locales/pt-PT.json6
-rw-r--r--app/javascript/mastodon/locales/ro.json6
-rw-r--r--app/javascript/mastodon/locales/ru.json6
-rw-r--r--app/javascript/mastodon/locales/sc.json6
-rw-r--r--app/javascript/mastodon/locales/sk.json6
-rw-r--r--app/javascript/mastodon/locales/sl.json6
-rw-r--r--app/javascript/mastodon/locales/sq.json6
-rw-r--r--app/javascript/mastodon/locales/sr-Latn.json6
-rw-r--r--app/javascript/mastodon/locales/sr.json6
-rw-r--r--app/javascript/mastodon/locales/sv.json6
-rw-r--r--app/javascript/mastodon/locales/ta.json6
-rw-r--r--app/javascript/mastodon/locales/te.json6
-rw-r--r--app/javascript/mastodon/locales/th.json6
-rw-r--r--app/javascript/mastodon/locales/tr.json6
-rw-r--r--app/javascript/mastodon/locales/uk.json6
-rw-r--r--app/javascript/mastodon/locales/ur.json6
-rw-r--r--app/javascript/mastodon/locales/vi.json6
-rw-r--r--app/javascript/mastodon/locales/zh-CN.json6
-rw-r--r--app/javascript/mastodon/locales/zh-HK.json6
-rw-r--r--app/javascript/mastodon/locales/zh-TW.json6
-rw-r--r--app/javascript/styles/mastodon-light/variables.scss2
-rw-r--r--app/javascript/styles/mastodon/accessibility.scss11
-rw-r--r--app/javascript/styles/mastodon/components.scss51
-rw-r--r--app/javascript/styles/mastodon/forms.scss2
-rw-r--r--app/lib/activitypub/activity/create.rb50
-rw-r--r--app/lib/activitypub/adapter.rb1
-rw-r--r--app/lib/feed_manager.rb11
-rw-r--r--app/lib/inline_renderer.rb2
-rw-r--r--app/mailers/user_mailer.rb17
-rw-r--r--app/models/account.rb1
-rw-r--r--app/models/concerns/account_associations.rb1
-rw-r--r--app/models/concerns/domain_normalizable.rb2
-rw-r--r--app/models/device.rb35
-rw-r--r--app/models/domain_block.rb4
-rw-r--r--app/models/encrypted_message.rb50
-rw-r--r--app/models/message_franking.rb19
-rw-r--r--app/models/one_time_key.rb21
-rw-r--r--app/models/preview_card.rb9
-rw-r--r--app/models/system_key.rb41
-rw-r--r--app/models/user.rb28
-rw-r--r--app/presenters/activitypub/activity_presenter.rb41
-rw-r--r--app/presenters/initial_state_presenter.rb2
-rw-r--r--app/serializers/activitypub/activity_serializer.rb54
-rw-r--r--app/serializers/activitypub/actor_serializer.rb9
-rw-r--r--app/serializers/activitypub/collection_serializer.rb24
-rw-r--r--app/serializers/activitypub/device_serializer.rb52
-rw-r--r--app/serializers/activitypub/encrypted_message_serializer.rb61
-rw-r--r--app/serializers/activitypub/one_time_key_serializer.rb35
-rw-r--r--app/serializers/activitypub/outbox_serializer.rb11
-rw-r--r--app/serializers/activitypub/undo_announce_serializer.rb6
-rw-r--r--app/serializers/initial_state_serializer.rb2
-rw-r--r--app/serializers/rest/encrypted_message_serializer.rb19
-rw-r--r--app/serializers/rest/keys/claim_result_serializer.rb9
-rw-r--r--app/serializers/rest/keys/device_serializer.rb6
-rw-r--r--app/serializers/rest/keys/query_result_serializer.rb11
-rw-r--r--app/serializers/rest/preview_card_serializer.rb2
-rw-r--r--app/services/activitypub/process_account_service.rb1
-rw-r--r--app/services/backup_service.rb2
-rw-r--r--app/services/block_domain_service.rb53
-rw-r--r--app/services/clear_domain_media_service.rb70
-rw-r--r--app/services/concerns/payloadable.rb3
-rw-r--r--app/services/deliver_to_device_service.rb78
-rw-r--r--app/services/import_service.rb4
-rw-r--r--app/services/keys/claim_service.rb77
-rw-r--r--app/services/keys/query_service.rb75
-rw-r--r--app/services/process_mentions_service.rb2
-rw-r--r--app/services/reblog_service.rb2
-rw-r--r--app/services/resolve_account_service.rb2
-rw-r--r--app/validators/ed25519_key_validator.rb19
-rw-r--r--app/validators/ed25519_signature_validator.rb29
-rw-r--r--app/views/about/more.html.haml3
-rw-r--r--app/views/admin/custom_emojis/index.html.haml10
-rw-r--r--app/views/admin/instances/index.html.haml12
-rw-r--r--app/views/auth/sessions/sign_in_token.html.haml14
-rw-r--r--app/views/statuses/_detailed_status.html.haml2
-rw-r--r--app/views/statuses/_simple_status.html.haml2
-rw-r--r--app/views/user_mailer/sign_in_token.html.haml105
-rw-r--r--app/views/user_mailer/sign_in_token.text.erb17
-rw-r--r--app/workers/activitypub/distribution_worker.rb2
-rw-r--r--app/workers/activitypub/reply_distribution_worker.rb2
-rw-r--r--app/workers/domain_block_worker.rb7
-rw-r--r--app/workers/domain_clear_media_worker.rb14
-rw-r--r--app/workers/import/relationship_worker.rb21
-rw-r--r--app/workers/push_conversation_worker.rb3
-rw-r--r--app/workers/push_encrypted_message_worker.rb16
-rw-r--r--app/workers/scheduler/doorkeeper_cleanup_scheduler.rb1
-rw-r--r--config/brakeman.ignore228
-rw-r--r--config/deploy.rb2
-rw-r--r--config/initializers/doorkeeper.rb3
-rw-r--r--config/initializers/inflections.rb1
-rw-r--r--config/initializers/redis.rb2
-rw-r--r--config/locales/en.yml22
-rw-r--r--config/locales/simple_form.en.yml1
-rw-r--r--config/routes.rb18
-rw-r--r--config/webpack/shared.js10
-rw-r--r--db/migrate/20170129000348_create_devices.rb13
-rw-r--r--db/migrate/20170205175257_remove_devices.rb2
-rw-r--r--db/migrate/20200516180352_create_devices.rb14
-rw-r--r--db/migrate/20200516183822_create_one_time_keys.rb12
-rw-r--r--db/migrate/20200518083523_create_encrypted_messages.rb15
-rw-r--r--db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb13
-rw-r--r--db/migrate/20200529214050_add_devices_url_to_accounts.rb5
-rw-r--r--db/migrate/20200601222558_create_system_keys.rb9
-rw-r--r--db/migrate/20200605155027_add_blurhash_to_preview_cards.rb5
-rw-r--r--db/migrate/20200608113046_add_sign_in_token_to_users.rb6
-rw-r--r--db/schema.rb55
-rw-r--r--docker-compose.yml9
-rw-r--r--lib/paperclip/blurhash_transcoder.rb2
-rw-r--r--lib/tasks/emojis.rake44
-rw-r--r--lib/tasks/mastodon.rake7
-rw-r--r--package.json34
-rw-r--r--public/emoji/1f327_border.svg9
-rw-r--r--public/emoji/1f328_border.svg9
-rw-r--r--public/emoji/1f329_border.svg9
-rw-r--r--public/emoji/1f359_border.svg11
-rw-r--r--public/emoji/1f35a_border.svg13
-rw-r--r--public/emoji/1f365_border.svg9
-rw-r--r--public/emoji/1f373_border.svg13
-rw-r--r--public/emoji/1f393_border.svg19
-rw-r--r--public/emoji/1f3a4_border.svg11
-rw-r--r--public/emoji/1f3a5_border.svg21
-rw-r--r--public/emoji/1f3a9_border.svg11
-rw-r--r--public/emoji/1f3ae_border.svg35
-rw-r--r--public/emoji/1f3b1_border.svg11
-rw-r--r--public/emoji/1f3b3_border.svg21
-rw-r--r--public/emoji/1f3bc_border.svg9
-rw-r--r--public/emoji/1f3d0_border.svg9
-rw-r--r--public/emoji/1f3f3_border.svg15
-rw-r--r--public/emoji/1f3f4_border.svg15
-rw-r--r--public/emoji/1f403_border.svg11
-rw-r--r--public/emoji/1f40f_border.svg23
-rw-r--r--public/emoji/1f410_border.svg15
-rw-r--r--public/emoji/1f411_border.svg13
-rw-r--r--public/emoji/1f413_border.svg13
-rw-r--r--public/emoji/1f414_border.svg19
-rw-r--r--public/emoji/1f41c_border.svg11
-rw-r--r--public/emoji/1f440_border.svg25
-rw-r--r--public/emoji/1f464_border.svg7
-rw-r--r--public/emoji/1f465_border.svg9
-rw-r--r--public/emoji/1f47b_border.svg15
-rw-r--r--public/emoji/1f47d_border.svg9
-rw-r--r--public/emoji/1f480_border.svg13
-rw-r--r--public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fb_border.svg31
-rw-r--r--public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fc_border.svg31
-rw-r--r--public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fd_border.svg31
-rw-r--r--public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3fe_border.svg31
-rw-r--r--public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-1f3ff_border.svg31
-rw-r--r--public/emoji/1f482-200d-2640-fe0f_border.svg27
-rw-r--r--public/emoji/1f482-200d-2642-fe0f_border.svg27
-rw-r--r--public/emoji/1f482_border.svg31
-rw-r--r--public/emoji/1f4a3_border.svg15
-rw-r--r--public/emoji/1f4a8_border.svg7
-rw-r--r--public/emoji/1f4ac_border.svg13
-rw-r--r--public/emoji/1f4ad_border.svg9
-rw-r--r--public/emoji/1f4b1_border.svg9
-rw-r--r--public/emoji/1f4b2_border.svg7
-rw-r--r--public/emoji/1f4c3_border.svg11
-rw-r--r--public/emoji/1f4de_border.svg7
-rw-r--r--public/emoji/1f4f7_border.svg19
-rw-r--r--public/emoji/1f4f8_border.svg19
-rw-r--r--public/emoji/1f4f9_border.svg9
-rw-r--r--public/emoji/1f4fc_border.svg23
-rw-r--r--public/emoji/1f4fd_border.svg13
-rw-r--r--public/emoji/1f507_border.svg11
-rw-r--r--public/emoji/1f508_border.svg9
-rw-r--r--public/emoji/1f509_border.svg11
-rw-r--r--public/emoji/1f50a_border.svg15
-rw-r--r--public/emoji/1f50c_border.svg9
-rw-r--r--public/emoji/1f519_border.svg7
-rw-r--r--public/emoji/1f51a_border.svg7
-rw-r--r--public/emoji/1f51b_border.svg7
-rw-r--r--public/emoji/1f51c_border.svg7
-rw-r--r--public/emoji/1f51d_border.svg7
-rw-r--r--public/emoji/1f52a_border.svg15
-rw-r--r--public/emoji/1f54a_border.svg15
-rw-r--r--public/emoji/1f54b_border.svg19
-rw-r--r--public/emoji/1f573_border.svg11
-rw-r--r--public/emoji/1f576_border.svg7
-rw-r--r--public/emoji/1f577_border.svg25
-rw-r--r--public/emoji/1f579_border.svg19
-rw-r--r--public/emoji/1f58a_border.svg17
-rw-r--r--public/emoji/1f58b_border.svg13
-rw-r--r--public/emoji/1f5a4_border.svg7
-rw-r--r--public/emoji/1f5e3_border.svg9
-rw-r--r--public/emoji/1f983_border.svg19
-rw-r--r--public/emoji/1f98d_border.svg23
-rw-r--r--public/emoji/2122_border.svg7
-rw-r--r--public/emoji/25aa_border.svg7
-rw-r--r--public/emoji/25ab_border.svg7
-rw-r--r--public/emoji/25fb_border.svg7
-rw-r--r--public/emoji/25fc_border.svg7
-rw-r--r--public/emoji/25fd_border.svg7
-rw-r--r--public/emoji/25fe_border.svg7
-rw-r--r--public/emoji/2601_border.svg9
-rw-r--r--public/emoji/2620_border.svg13
-rw-r--r--public/emoji/2660_border.svg7
-rw-r--r--public/emoji/2663_border.svg7
-rw-r--r--public/emoji/26aa_border.svg7
-rw-r--r--public/emoji/26ab_border.svg7
-rw-r--r--public/emoji/26be_border.svg11
-rw-r--r--public/emoji/26f8_border.svg15
-rw-r--r--public/emoji/2712_border.svg13
-rw-r--r--public/emoji/2714_border.svg7
-rw-r--r--public/emoji/2716_border.svg7
-rw-r--r--public/emoji/2734_border.svg7
-rw-r--r--public/emoji/2754_border.svg9
-rw-r--r--public/emoji/2755_border.svg9
-rw-r--r--public/emoji/2795_border.svg7
-rw-r--r--public/emoji/2796_border.svg7
-rw-r--r--public/emoji/2797_border.svg11
-rw-r--r--public/emoji/27b0_border.svg7
-rw-r--r--public/emoji/2b1b_border.svg7
-rw-r--r--public/emoji/2b1c_border.svg7
-rw-r--r--public/emoji/3030_border.svg7
-rw-r--r--spec/controllers/activitypub/replies_controller_spec.rb17
-rw-r--r--spec/controllers/auth/sessions_controller_spec.rb66
-rw-r--r--spec/fabricators/device_fabricator.rb8
-rw-r--r--spec/fabricators/encrypted_message_fabricator.rb8
-rw-r--r--spec/fabricators/one_time_key_fabricator.rb11
-rw-r--r--spec/fabricators/system_key_fabricator.rb3
-rw-r--r--spec/lib/activitypub/activity/create_spec.rb56
-rw-r--r--spec/mailers/previews/user_mailer_preview.rb5
-rw-r--r--spec/models/device_spec.rb5
-rw-r--r--spec/models/encrypted_message_spec.rb5
-rw-r--r--spec/models/one_time_key_spec.rb5
-rw-r--r--spec/models/system_key_spec.rb5
-rw-r--r--spec/services/clear_domain_media_service_spec.rb23
-rw-r--r--spec/workers/domain_block_worker_spec.rb4
-rw-r--r--spec/workers/domain_clear_media_worker_spec.rb26
-rw-r--r--streaming/index.js65
-rw-r--r--yarn.lock3011
354 files changed, 6597 insertions, 1944 deletions
diff --git a/.dependabot/config.yml b/.dependabot/config.yml
deleted file mode 100644
index 06df775c2..000000000
--- a/.dependabot/config.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-version: 1
-
-update_configs:
-  - package_manager: "ruby:bundler"
-    directory: "/"
-    update_schedule: "weekly"
-    # Supported update schedule: live daily weekly monthly
-    version_requirement_updates: "auto"
-    # Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
-    allowed_updates:
-      - match:
-          dependency_type: "all"
-          # Supported dependency types: all indirect direct production development
-          update_type: "all"
-          # Supported update types: all security
-
-  - package_manager: "javascript"
-    directory: "/"
-    update_schedule: "weekly"
-    # Supported update schedule: live daily weekly monthly
-    version_requirement_updates: "auto"
-    # Supported version requirements: auto widen_ranges increase_versions increase_versions_if_necessary
-    allowed_updates:
-      - match:
-          dependency_type: "all"
-          # Supported dependency types: all indirect direct production development
-          update_type: "all"
-          # Supported update types: all security
diff --git a/.env.vagrant b/.env.vagrant
index c2d26fa45..32ed9b922 100644
--- a/.env.vagrant
+++ b/.env.vagrant
@@ -1,3 +1,4 @@
 VAGRANT=true
 LOCAL_DOMAIN=mastodon.local
 BIND=0.0.0.0
+DB_HOST=/var/run/postgresql/
diff --git a/Gemfile b/Gemfile
index 01e35caa7..da9e8012e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -9,7 +9,7 @@ gem 'puma', '~> 4.3'
 gem 'rails', '~> 5.2.4.3'
 gem 'sprockets', '~> 3.7.2'
 gem 'thor', '~> 0.20'
-gem 'rack', '~> 2.2.2'
+gem 'rack', '~> 2.2.3'
 
 gem 'thwait', '~> 0.1.0'
 gem 'e2mmap', '~> 0.1.0'
@@ -20,7 +20,7 @@ gem 'makara', '~> 0.4'
 gem 'pghero', '~> 2.5'
 gem 'dotenv-rails', '~> 2.7'
 
-gem 'aws-sdk-s3', '~> 1.66', require: false
+gem 'aws-sdk-s3', '~> 1.68', require: false
 gem 'fog-core', '<= 2.1.0'
 gem 'fog-openstack', '~> 0.3', require: false
 gem 'paperclip', '~> 6.0'
@@ -50,6 +50,7 @@ gem 'omniauth', '~> 1.9'
 
 gem 'discard', '~> 1.2'
 gem 'doorkeeper', '~> 5.4'
+gem 'ed25519', '~> 1.2'
 gem 'fast_blank', '~> 1.0'
 gem 'fastimage'
 gem 'goldfinger', '~> 2.1'
@@ -60,7 +61,7 @@ gem 'htmlentities', '~> 4.3'
 gem 'http', '~> 4.4'
 gem 'http_accept_language', '~> 2.1'
 gem 'http_parser.rb', '~> 0.6', git: 'https://github.com/tmm1/http_parser.rb', ref: '54b17ba8c7d8d20a16dfc65d1775241833219cf2', submodules: true
-gem 'httplog', '~> 1.4.2'
+gem 'httplog', '~> 1.4.3'
 gem 'idn-ruby', require: 'idn'
 gem 'kaminari', '~> 1.2'
 gem 'link_header', '~> 0.0'
@@ -79,11 +80,11 @@ gem 'rack-attack', '~> 6.3'
 gem 'rack-cors', '~> 1.1', require: 'rack/cors'
 gem 'rails-i18n', '~> 5.1'
 gem 'rails-settings-cached', '~> 0.6'
-gem 'redis', '~> 4.1', require: ['redis', 'redis/connection/hiredis']
+gem 'redis', '~> 4.2', require: ['redis', 'redis/connection/hiredis']
 gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
 gem 'rqrcode', '~> 1.1'
 gem 'ruby-progressbar', '~> 1.10'
-gem 'sanitize', '~> 5.1'
+gem 'sanitize', '~> 5.2'
 gem 'sidekiq', '~> 6.0'
 gem 'sidekiq-scheduler', '~> 3.0'
 gem 'sidekiq-unique-jobs', '~> 6.0'
@@ -93,7 +94,6 @@ gem 'simple_form', '~> 5.0'
 gem 'sprockets-rails', '~> 3.2', require: 'sprockets/railtie'
 gem 'stoplight', '~> 2.2.0'
 gem 'strong_migrations', '~> 0.6'
-gem 'tty-command', '~> 0.9', require: false
 gem 'tty-prompt', '~> 0.21', require: false
 gem 'twitter-text', '~> 1.14'
 gem 'tzinfo-data', '~> 1.2020'
@@ -122,13 +122,13 @@ end
 group :test do
   gem 'capybara', '~> 3.32'
   gem 'climate_control', '~> 0.2'
-  gem 'faker', '~> 2.11'
+  gem 'faker', '~> 2.12'
   gem 'microformats', '~> 4.2'
   gem 'rails-controller-testing', '~> 1.0'
   gem 'rspec-sidekiq', '~> 3.0'
   gem 'simplecov', '~> 0.18', require: false
   gem 'webmock', '~> 3.8'
-  gem 'parallel_tests', '~> 2.32'
+  gem 'parallel_tests', '~> 3.0'
   gem 'rspec_junit_formatter', '~> 0.4'
 end
 
@@ -141,10 +141,10 @@ group :development do
   gem 'letter_opener', '~> 1.7'
   gem 'letter_opener_web', '~> 1.4'
   gem 'memory_profiler'
-  gem 'rubocop', '~> 0.84', require: false
-  gem 'rubocop-rails', '~> 2.5', require: false
+  gem 'rubocop', '~> 0.85', require: false
+  gem 'rubocop-rails', '~> 2.6', require: false
   gem 'brakeman', '~> 4.8', require: false
-  gem 'bundler-audit', '~> 0.6', require: false
+  gem 'bundler-audit', '~> 0.7', require: false
 
   gem 'capistrano', '~> 3.14'
   gem 'capistrano-rails', '~> 1.5'
diff --git a/Gemfile.lock b/Gemfile.lock
index 111bdabcd..b47ab0091 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -86,26 +86,26 @@ GEM
       activerecord (>= 3.2, < 7.0)
       rake (>= 10.4, < 14.0)
     arel (9.0.0)
-    ast (2.4.0)
+    ast (2.4.1)
     attr_encrypted (3.1.0)
       encryptor (~> 3.0.0)
     av (0.9.0)
       cocaine (~> 0.5.3)
     aws-eventstream (1.1.0)
-    aws-partitions (1.320.0)
-    aws-sdk-core (3.96.1)
+    aws-partitions (1.329.0)
+    aws-sdk-core (3.99.2)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.31.0)
-      aws-sdk-core (~> 3, >= 3.71.0)
+    aws-sdk-kms (1.34.1)
+      aws-sdk-core (~> 3, >= 3.99.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.66.0)
-      aws-sdk-core (~> 3, >= 3.96.1)
+    aws-sdk-s3 (1.68.1)
+      aws-sdk-core (~> 3, >= 3.99.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.1)
-    aws-sigv4 (1.1.3)
+    aws-sigv4 (1.1.4)
       aws-eventstream (~> 1.0, >= 1.0.2)
     bcrypt (3.1.13)
     better_errors (2.7.1)
@@ -119,16 +119,16 @@ GEM
     bootsnap (1.4.6)
       msgpack (~> 1.0)
     brakeman (4.8.2)
-    browser (4.1.0)
+    browser (4.2.0)
     builder (3.2.4)
     bullet (6.1.0)
       activesupport (>= 3.0.0)
       uniform_notifier (~> 1.11)
-    bundler-audit (0.6.1)
+    bundler-audit (0.7.0.1)
       bundler (>= 1.2.0, < 3)
-      thor (~> 0.18)
+      thor (>= 0.18, < 2)
     byebug (11.1.3)
-    capistrano (3.14.0)
+    capistrano (3.14.1)
       airbrussh (>= 1.0.0)
       i18n
       rake (>= 10.0.0)
@@ -164,16 +164,16 @@ GEM
     climate_control (0.2.0)
     cocaine (0.5.8)
       climate_control (>= 0.0.3, < 1.0)
-    coderay (1.1.2)
+    coderay (1.1.3)
     concurrent-ruby (1.1.6)
-    connection_pool (2.2.2)
+    connection_pool (2.2.3)
     crack (0.4.3)
       safe_yaml (~> 1.0.0)
     crass (1.0.6)
     css_parser (1.7.1)
       addressable
     debug_inspector (0.0.3)
-    devise (4.7.1)
+    devise (4.7.2)
       bcrypt (~> 3.0)
       orm_adapter (~> 0.1)
       railties (>= 4.1.0)
@@ -201,6 +201,7 @@ GEM
       dotenv (= 2.7.5)
       railties (>= 3.2, < 6.1)
     e2mmap (0.1.0)
+    ed25519 (1.2.4)
     elasticsearch (7.7.0)
       elasticsearch-api (= 7.7.0)
       elasticsearch-transport (= 7.7.0)
@@ -215,9 +216,9 @@ GEM
     erubi (1.9.0)
     et-orbi (1.2.4)
       tzinfo
-    excon (0.73.0)
+    excon (0.74.0)
     fabrication (2.21.1)
-    faker (2.11.0)
+    faker (2.12.0)
       i18n (>= 1.6, < 2)
     faraday (1.0.1)
       multipart-post (>= 1.2, < 3)
@@ -235,14 +236,14 @@ GEM
     fog-json (1.2.0)
       fog-core
       multi_json (~> 1.10)
-    fog-openstack (0.3.7)
+    fog-openstack (0.3.10)
       fog-core (>= 1.45, <= 2.1.0)
       fog-json (>= 1.0)
       ipaddress (>= 0.8)
     formatador (0.2.5)
-    fugit (1.3.5)
+    fugit (1.3.6)
       et-orbi (~> 1.1, >= 1.1.8)
-      raabro (~> 1.1)
+      raabro (~> 1.3)
     fuubar (2.5.0)
       rspec-core (~> 3.0)
       ruby-progressbar (~> 1.4)
@@ -281,10 +282,10 @@ GEM
     http-parser (1.2.1)
       ffi-compiler (>= 1.0, < 2.0)
     http_accept_language (2.1.1)
-    httplog (1.4.2)
+    httplog (1.4.3)
       rack (>= 1.0)
       rainbow (>= 2.0.0)
-    i18n (1.8.2)
+    i18n (1.8.3)
       concurrent-ruby (~> 1.0)
     i18n-tasks (0.9.31)
       activesupport (>= 4.0.2)
@@ -309,7 +310,7 @@ GEM
       multi_json (~> 1.14)
       rack (~> 2.0)
       rdf (~> 3.1)
-    json-ld-preloaded (3.1.2)
+    json-ld-preloaded (3.1.3)
       json-ld (~> 3.1)
       rdf (~> 3.1)
     jsonapi-renderer (0.2.2)
@@ -370,7 +371,7 @@ GEM
     net-ldap (0.16.2)
     net-scp (3.0.0)
       net-ssh (>= 2.6.5, < 7.0.0)
-    net-ssh (6.0.2)
+    net-ssh (6.1.0)
     nio4r (2.5.2)
     nokogiri (1.10.9)
       mini_portile2 (~> 2.4.0)
@@ -403,10 +404,10 @@ GEM
     paperclip-av-transcoder (0.6.4)
       av (~> 0.9.0)
       paperclip (>= 2.5.2)
-    parallel (1.19.1)
-    parallel_tests (2.32.0)
+    parallel (1.19.2)
+    parallel_tests (3.0.0)
       parallel
-    parser (2.7.1.2)
+    parser (2.7.1.3)
       ast (~> 2.4.0)
     parslet (2.0.0)
     pastel (0.7.4)
@@ -438,7 +439,7 @@ GEM
     pundit (2.1.0)
       activesupport (>= 3.0.0)
     raabro (1.3.1)
-    rack (2.2.2)
+    rack (2.2.3)
     rack-attack (6.3.1)
       rack (>= 1.0, < 3)
     rack-cors (1.1.1)
@@ -484,13 +485,13 @@ GEM
       thor (>= 0.19.0, < 2.0)
     rainbow (3.0.0)
     rake (13.0.1)
-    rdf (3.1.1)
+    rdf (3.1.2)
       hamster (~> 3.0)
       link_header (~> 0.0, >= 0.0.8)
     rdf-normalize (0.4.0)
       rdf (~> 3.1)
     redcarpet (3.5.0)
-    redis (4.1.4)
+    redis (4.2.1)
     redis-actionpack (5.2.0)
       actionpack (>= 5, < 7)
       redis-rack (>= 2.1.0, < 3)
@@ -509,10 +510,10 @@ GEM
       redis-store (>= 1.2, < 2)
     redis-store (1.8.2)
       redis (>= 4, < 5)
-    regexp_parser (1.7.0)
+    regexp_parser (1.7.1)
     request_store (1.5.0)
       rack (>= 1.4)
-    responders (3.0.0)
+    responders (3.0.1)
       actionpack (>= 5.0)
       railties (>= 5.0)
     rexml (3.2.4)
@@ -544,27 +545,28 @@ GEM
     rspec-support (3.9.3)
     rspec_junit_formatter (0.4.1)
       rspec-core (>= 2, < 4, != 2.12.0)
-    rubocop (0.84.0)
+    rubocop (0.85.1)
       parallel (~> 1.10)
       parser (>= 2.7.0.1)
       rainbow (>= 2.2.2, < 4.0)
+      regexp_parser (>= 1.7)
       rexml
       rubocop-ast (>= 0.0.3)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 2.0)
     rubocop-ast (0.0.3)
       parser (>= 2.7.0.1)
-    rubocop-rails (2.5.2)
-      activesupport
+    rubocop-rails (2.6.0)
+      activesupport (>= 4.2.0)
       rack (>= 1.1)
-      rubocop (>= 0.72.0)
+      rubocop (>= 0.82.0)
     ruby-progressbar (1.10.1)
     ruby-saml (1.11.0)
       nokogiri (>= 1.5.10)
     rufus-scheduler (3.6.0)
       fugit (~> 1.1, >= 1.1.6)
     safe_yaml (1.0.5)
-    sanitize (5.1.0)
+    sanitize (5.2.1)
       crass (~> 1.0.2)
       nokogiri (>= 1.8.0)
       nokogumbo (~> 2.0)
@@ -623,8 +625,6 @@ GEM
     thwait (0.1.0)
     tilt (2.0.10)
     tty-color (0.5.1)
-    tty-command (0.9.0)
-      pastel (~> 0.7.0)
     tty-cursor (0.7.1)
     tty-prompt (0.21.0)
       necromancer (~> 0.5.0)
@@ -634,7 +634,7 @@ GEM
       tty-cursor (~> 0.7)
       tty-screen (~> 0.7)
       wisper (~> 2.0.0)
-    tty-screen (0.7.1)
+    tty-screen (0.8.0)
     twitter-text (1.14.7)
       unf (~> 0.1.0)
     tzinfo (1.2.7)
@@ -662,7 +662,7 @@ GEM
       jwt (~> 2.0)
     websocket-driver (0.7.2)
       websocket-extensions (>= 0.1.0)
-    websocket-extensions (0.1.4)
+    websocket-extensions (0.1.5)
     wisper (2.0.1)
     xpath (3.2.0)
       nokogiri (~> 1.8)
@@ -675,7 +675,7 @@ DEPENDENCIES
   active_record_query_trace (~> 1.7)
   addressable (~> 2.7)
   annotate (~> 3.1)
-  aws-sdk-s3 (~> 1.66)
+  aws-sdk-s3 (~> 1.68)
   better_errors (~> 2.7)
   binding_of_caller (~> 0.7)
   blurhash (~> 0.1)
@@ -683,7 +683,7 @@ DEPENDENCIES
   brakeman (~> 4.8)
   browser
   bullet (~> 6.1)
-  bundler-audit (~> 0.6)
+  bundler-audit (~> 0.7)
   capistrano (~> 3.14)
   capistrano-rails (~> 1.5)
   capistrano-rbenv (~> 2.1)
@@ -702,8 +702,9 @@ DEPENDENCIES
   doorkeeper (~> 5.4)
   dotenv-rails (~> 2.7)
   e2mmap (~> 0.1.0)
+  ed25519 (~> 1.2)
   fabrication (~> 2.21)
-  faker (~> 2.11)
+  faker (~> 2.12)
   fast_blank (~> 1.0)
   fastimage
   fog-core (<= 2.1.0)
@@ -717,7 +718,7 @@ DEPENDENCIES
   http (~> 4.4)
   http_accept_language (~> 2.1)
   http_parser.rb (~> 0.6)!
-  httplog (~> 1.4.2)
+  httplog (~> 1.4.3)
   i18n-tasks (~> 0.9)
   idn-ruby
   iso-639
@@ -745,7 +746,7 @@ DEPENDENCIES
   paperclip (~> 6.0)
   paperclip-av-transcoder (~> 0.6)
   parallel (~> 1.19)
-  parallel_tests (~> 2.32)
+  parallel_tests (~> 3.0)
   parslet
   pg (~> 1.2)
   pghero (~> 2.5)
@@ -757,7 +758,7 @@ DEPENDENCIES
   pry-rails (~> 0.3)
   puma (~> 4.3)
   pundit (~> 2.1)
-  rack (~> 2.2.2)
+  rack (~> 2.2.3)
   rack-attack (~> 6.3)
   rack-cors (~> 1.1)
   rails (~> 5.2.4.3)
@@ -766,17 +767,17 @@ DEPENDENCIES
   rails-settings-cached (~> 0.6)
   rdf-normalize (~> 0.4)
   redcarpet (~> 3.4)
-  redis (~> 4.1)
+  redis (~> 4.2)
   redis-namespace (~> 1.7)
   redis-rails (~> 5.0)
   rqrcode (~> 1.1)
   rspec-rails (~> 4.0)
   rspec-sidekiq (~> 3.0)
   rspec_junit_formatter (~> 0.4)
-  rubocop (~> 0.84)
-  rubocop-rails (~> 2.5)
+  rubocop (~> 0.85)
+  rubocop-rails (~> 2.6)
   ruby-progressbar (~> 1.10)
-  sanitize (~> 5.1)
+  sanitize (~> 5.2)
   sidekiq (~> 6.0)
   sidekiq-bulk (~> 0.2.0)
   sidekiq-scheduler (~> 3.0)
@@ -792,7 +793,6 @@ DEPENDENCIES
   strong_migrations (~> 0.6)
   thor (~> 0.20)
   thwait (~> 0.1.0)
-  tty-command (~> 0.9)
   tty-prompt (~> 0.21)
   twitter-text (~> 1.14)
   tzinfo-data (~> 1.2020)
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..7625597fe
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,12 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported          |
+| ------- | ------------------ |
+| 3.1.x   | :white_check_mark: |
+| < 3.1   | :x:                |
+
+## Reporting a Vulnerability
+
+hello@joinmastodon.org
diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb
index e3d8c1061..b8bca580f 100644
--- a/app/controllers/accounts_controller.rb
+++ b/app/controllers/accounts_controller.rb
@@ -1,7 +1,8 @@
 # frozen_string_literal: true
 
 class AccountsController < ApplicationController
-  PAGE_SIZE = 20
+  PAGE_SIZE     = 20
+  PAGE_SIZE_MAX = 200
 
   include AccountControllerConcern
   include SignatureAuthentication
@@ -27,7 +28,7 @@ class AccountsController < ApplicationController
           return
         end
 
-        @pinned_statuses = cache_collection(@account.pinned_statuses, Status) if show_pinned_statuses?
+        @pinned_statuses = cache_collection(@account.pinned_statuses.not_local_only, Status) if show_pinned_statuses?
         @statuses        = filtered_status_page
         @statuses        = cache_collection(@statuses, Status)
         @rss_url         = rss_url
@@ -41,7 +42,8 @@ class AccountsController < ApplicationController
       format.rss do
         expires_in 1.minute, public: true
 
-        @statuses = filtered_statuses.without_reblogs.limit(PAGE_SIZE)
+        limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
+        @statuses = filtered_statuses.without_reblogs.limit(limit)
         @statuses = cache_collection(@statuses, Status)
         render xml: RSS::AccountSerializer.render(@account, @statuses, params[:tag])
       end
diff --git a/app/controllers/activitypub/claims_controller.rb b/app/controllers/activitypub/claims_controller.rb
new file mode 100644
index 000000000..08ad952df
--- /dev/null
+++ b/app/controllers/activitypub/claims_controller.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+
+class ActivityPub::ClaimsController < ActivityPub::BaseController
+  include SignatureVerification
+  include AccountOwnedConcern
+
+  skip_before_action :authenticate_user!
+
+  before_action :require_signature!
+  before_action :set_claim_result
+
+  def create
+    render json: @claim_result, serializer: ActivityPub::OneTimeKeySerializer
+  end
+
+  private
+
+  def set_claim_result
+    @claim_result = ::Keys::ClaimService.new.call(@account.id, params[:id])
+  end
+end
diff --git a/app/controllers/activitypub/collections_controller.rb b/app/controllers/activitypub/collections_controller.rb
index c1e7aa550..e62fba748 100644
--- a/app/controllers/activitypub/collections_controller.rb
+++ b/app/controllers/activitypub/collections_controller.rb
@@ -5,8 +5,9 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
   include AccountOwnedConcern
 
   before_action :require_signature!, if: :authorized_fetch_mode?
+  before_action :set_items
   before_action :set_size
-  before_action :set_statuses
+  before_action :set_type
   before_action :set_cache_headers
 
   def show
@@ -16,40 +17,53 @@ class ActivityPub::CollectionsController < ActivityPub::BaseController
 
   private
 
-  def set_statuses
-    @statuses = scope_for_collection
-    @statuses = cache_collection(@statuses, Status)
+  def set_items
+    case params[:id]
+    when 'featured'
+      @items = begin
+        # Because in public fetch mode we cache the response, there would be no
+        # benefit from performing the check below, since a blocked account or domain
+        # would likely be served the cache from the reverse proxy anyway
+
+        if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
+          []
+        else
+          cache_collection(@account.pinned_statuses.not_local_only, Status)
+        end
+      end
+    when 'devices'
+      @items = @account.devices
+    else
+      not_found
+    end
   end
 
   def set_size
     case params[:id]
-    when 'featured'
-      @size = @account.pinned_statuses.count
+    when 'featured', 'devices'
+      @size = @items.size
     else
       not_found
     end
   end
 
-  def scope_for_collection
+  def set_type
     case params[:id]
     when 'featured'
-      # Because in public fetch mode we cache the response, there would be no
-      # benefit from performing the check below, since a blocked account or domain
-      # would likely be served the cache from the reverse proxy anyway
-      if authorized_fetch_mode? && !signed_request_account.nil? && (@account.blocking?(signed_request_account) || (!signed_request_account.domain.nil? && @account.domain_blocking?(signed_request_account.domain)))
-        Status.none
-      else
-        @account.pinned_statuses
-      end
+      @type = :ordered
+    when 'devices'
+      @type = :unordered
+    else
+      not_found
     end
   end
 
   def collection_presenter
     ActivityPub::CollectionPresenter.new(
       id: account_collection_url(@account, params[:id]),
-      type: :ordered,
+      type: @type,
       size: @size,
-      items: @statuses
+      items: @items
     )
   end
 end
diff --git a/app/controllers/admin/custom_emojis_controller.rb b/app/controllers/admin/custom_emojis_controller.rb
index efa8f2950..71efb543e 100644
--- a/app/controllers/admin/custom_emojis_controller.rb
+++ b/app/controllers/admin/custom_emojis_controller.rb
@@ -33,6 +33,8 @@ module Admin
       @form.save
     rescue ActionController::ParameterMissing
       flash[:alert] = I18n.t('admin.accounts.no_account_selected')
+    rescue Mastodon::NotPermittedError
+      flash[:alert] = I18n.t('admin.custom_emojis.not_permitted')
     ensure
       redirect_to admin_custom_emojis_path(filter_params)
     end
diff --git a/app/controllers/api/v1/crypto/deliveries_controller.rb b/app/controllers/api/v1/crypto/deliveries_controller.rb
new file mode 100644
index 000000000..aa9df6e03
--- /dev/null
+++ b/app/controllers/api/v1/crypto/deliveries_controller.rb
@@ -0,0 +1,30 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::DeliveriesController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  def create
+    devices.each do |device_params|
+      DeliverToDeviceService.new.call(current_account, @current_device, device_params)
+    end
+
+    render_empty
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+
+  def resource_params
+    params.require(:device)
+    params.permit(device: [:account_id, :device_id, :type, :body, :hmac])
+  end
+
+  def devices
+    Array(resource_params[:device])
+  end
+end
diff --git a/app/controllers/api/v1/crypto/encrypted_messages_controller.rb b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb
new file mode 100644
index 000000000..c764915e5
--- /dev/null
+++ b/app/controllers/api/v1/crypto/encrypted_messages_controller.rb
@@ -0,0 +1,59 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::EncryptedMessagesController < Api::BaseController
+  LIMIT = 80
+
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  before_action :set_encrypted_messages,    only: :index
+  after_action  :insert_pagination_headers, only: :index
+
+  def index
+    render json: @encrypted_messages, each_serializer: REST::EncryptedMessageSerializer
+  end
+
+  def clear
+    @current_device.encrypted_messages.up_to(params[:up_to_id]).delete_all
+    render_empty
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+
+  def set_encrypted_messages
+    @encrypted_messages = @current_device.encrypted_messages.paginate_by_id(limit_param(LIMIT), params_slice(:max_id, :since_id, :min_id))
+  end
+
+  def insert_pagination_headers
+    set_pagination_headers(next_path, prev_path)
+  end
+
+  def next_path
+    api_v1_crypto_encrypted_messages_url pagination_params(max_id: pagination_max_id) if records_continue?
+  end
+
+  def prev_path
+    api_v1_crypto_encrypted_messages_url pagination_params(min_id: pagination_since_id) unless @encrypted_messages.empty?
+  end
+
+  def pagination_max_id
+    @encrypted_messages.last.id
+  end
+
+  def pagination_since_id
+    @encrypted_messages.first.id
+  end
+
+  def records_continue?
+    @encrypted_messages.size == limit_param(LIMIT)
+  end
+
+  def pagination_params(core_params)
+    params.slice(:limit).permit(:limit).merge(core_params)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/claims_controller.rb b/app/controllers/api/v1/crypto/keys/claims_controller.rb
new file mode 100644
index 000000000..34b21a380
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/claims_controller.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::ClaimsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_claim_results
+
+  def create
+    render json: @claim_results, each_serializer: REST::Keys::ClaimResultSerializer
+  end
+
+  private
+
+  def set_claim_results
+    @claim_results = devices.map { |device_params| ::Keys::ClaimService.new.call(current_account, device_params[:account_id], device_params[:device_id]) }.compact
+  end
+
+  def resource_params
+    params.permit(device: [:account_id, :device_id])
+  end
+
+  def devices
+    Array(resource_params[:device])
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/counts_controller.rb b/app/controllers/api/v1/crypto/keys/counts_controller.rb
new file mode 100644
index 000000000..ffd7151b7
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/counts_controller.rb
@@ -0,0 +1,17 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::CountsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_current_device
+
+  def show
+    render json: { one_time_keys: @current_device.one_time_keys.count }
+  end
+
+  private
+
+  def set_current_device
+    @current_device = Device.find_by!(access_token: doorkeeper_token)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/queries_controller.rb b/app/controllers/api/v1/crypto/keys/queries_controller.rb
new file mode 100644
index 000000000..0851d797d
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/queries_controller.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::QueriesController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+  before_action :set_accounts
+  before_action :set_query_results
+
+  def create
+    render json: @query_results, each_serializer: REST::Keys::QueryResultSerializer
+  end
+
+  private
+
+  def set_accounts
+    @accounts = Account.where(id: account_ids).includes(:devices)
+  end
+
+  def set_query_results
+    @query_results = @accounts.map { |account| ::Keys::QueryService.new.call(account) }.compact
+  end
+
+  def account_ids
+    Array(params[:id]).map(&:to_i)
+  end
+end
diff --git a/app/controllers/api/v1/crypto/keys/uploads_controller.rb b/app/controllers/api/v1/crypto/keys/uploads_controller.rb
new file mode 100644
index 000000000..fc4abf63b
--- /dev/null
+++ b/app/controllers/api/v1/crypto/keys/uploads_controller.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Api::V1::Crypto::Keys::UploadsController < Api::BaseController
+  before_action -> { doorkeeper_authorize! :crypto }
+  before_action :require_user!
+
+  def create
+    device = Device.find_or_initialize_by(access_token: doorkeeper_token)
+
+    device.transaction do
+      device.account = current_account
+      device.update!(resource_params[:device])
+
+      if resource_params[:one_time_keys].present? && resource_params[:one_time_keys].is_a?(Enumerable)
+        resource_params[:one_time_keys].each do |one_time_key_params|
+          device.one_time_keys.create!(one_time_key_params)
+        end
+      end
+    end
+
+    render json: device, serializer: REST::Keys::DeviceSerializer
+  end
+
+  private
+
+  def resource_params
+    params.permit(device: [:device_id, :name, :fingerprint_key, :identity_key], one_time_keys: [:key_id, :key, :signature])
+  end
+end
diff --git a/app/controllers/auth/sessions_controller.rb b/app/controllers/auth/sessions_controller.rb
index c36561b86..c54f6643a 100644
--- a/app/controllers/auth/sessions_controller.rb
+++ b/app/controllers/auth/sessions_controller.rb
@@ -9,7 +9,9 @@ class Auth::SessionsController < Devise::SessionsController
   skip_before_action :require_functional!
 
   prepend_before_action :set_pack
-  prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
+
+  include TwoFactorAuthenticationConcern
+  include SignInTokenAuthenticationConcern
 
   before_action :set_instance_presenter, only: [:new]
   before_action :set_body_classes
@@ -40,8 +42,8 @@ class Auth::SessionsController < Devise::SessionsController
   protected
 
   def find_user
-    if session[:otp_user_id]
-      User.find(session[:otp_user_id])
+    if session[:attempt_user_id]
+      User.find(session[:attempt_user_id])
     else
       user   = User.authenticate_with_ldap(user_params) if Devise.ldap_authentication
       user ||= User.authenticate_with_pam(user_params) if Devise.pam_authentication
@@ -50,7 +52,7 @@ class Auth::SessionsController < Devise::SessionsController
   end
 
   def user_params
-    params.require(:user).permit(:email, :password, :otp_attempt)
+    params.require(:user).permit(:email, :password, :otp_attempt, :sign_in_token_attempt)
   end
 
   def after_sign_in_path_for(resource)
@@ -71,48 +73,6 @@ class Auth::SessionsController < Devise::SessionsController
     super
   end
 
-  def two_factor_enabled?
-    find_user&.otp_required_for_login?
-  end
-
-  def valid_otp_attempt?(user)
-    user.validate_and_consume_otp!(user_params[:otp_attempt]) ||
-      user.invalidate_otp_backup_code!(user_params[:otp_attempt])
-  rescue OpenSSL::Cipher::CipherError
-    false
-  end
-
-  def authenticate_with_two_factor
-    user = self.resource = find_user
-
-    if user_params[:otp_attempt].present? && session[:otp_user_id]
-      authenticate_with_two_factor_via_otp(user)
-    elsif user.present? && (user.encrypted_password.blank? || user.valid_password?(user_params[:password]))
-      # If encrypted_password is blank, we got the user from LDAP or PAM,
-      # so credentials are already valid
-
-      prompt_for_two_factor(user)
-    end
-  end
-
-  def authenticate_with_two_factor_via_otp(user)
-    if valid_otp_attempt?(user)
-      session.delete(:otp_user_id)
-      remember_me(user)
-      sign_in(user)
-    else
-      flash.now[:alert] = I18n.t('users.invalid_otp_token')
-      prompt_for_two_factor(user)
-    end
-  end
-
-  def prompt_for_two_factor(user)
-    session[:otp_user_id] = user.id
-    use_pack 'auth'
-    @body_classes = 'lighter'
-    render :two_factor
-  end
-
   def require_no_authentication
     super
     # Delete flash message that isn't entirely useful and may be confusing in
diff --git a/app/controllers/concerns/sign_in_token_authentication_concern.rb b/app/controllers/concerns/sign_in_token_authentication_concern.rb
new file mode 100644
index 000000000..88c009b19
--- /dev/null
+++ b/app/controllers/concerns/sign_in_token_authentication_concern.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module SignInTokenAuthenticationConcern
+  extend ActiveSupport::Concern
+
+  included do
+    prepend_before_action :authenticate_with_sign_in_token, if: :sign_in_token_required?, only: [:create]
+  end
+
+  def sign_in_token_required?
+    find_user&.suspicious_sign_in?(request.remote_ip)
+  end
+
+  def valid_sign_in_token_attempt?(user)
+    Devise.secure_compare(user.sign_in_token, user_params[:sign_in_token_attempt])
+  end
+
+  def authenticate_with_sign_in_token
+    user = self.resource = find_user
+
+    if user_params[:sign_in_token_attempt].present? && session[:attempt_user_id]
+      authenticate_with_sign_in_token_attempt(user)
+    elsif user.present? && user.external_or_valid_password?(user_params[:password])
+      prompt_for_sign_in_token(user)
+    end
+  end
+
+  def authenticate_with_sign_in_token_attempt(user)
+    if valid_sign_in_token_attempt?(user)
+      session.delete(:attempt_user_id)
+      remember_me(user)
+      sign_in(user)
+    else
+      flash.now[:alert] = I18n.t('users.invalid_sign_in_token')
+      prompt_for_sign_in_token(user)
+    end
+  end
+
+  def prompt_for_sign_in_token(user)
+    if user.sign_in_token_expired?
+      user.generate_sign_in_token && user.save
+      UserMailer.sign_in_token(user, request.remote_ip, request.user_agent, Time.now.utc.to_s).deliver_later!
+    end
+
+    session[:attempt_user_id] = user.id
+    use_pack 'auth'
+    @body_classes = 'lighter'
+    render :sign_in_token
+  end
+end
diff --git a/app/controllers/concerns/two_factor_authentication_concern.rb b/app/controllers/concerns/two_factor_authentication_concern.rb
new file mode 100644
index 000000000..0d9f87455
--- /dev/null
+++ b/app/controllers/concerns/two_factor_authentication_concern.rb
@@ -0,0 +1,48 @@
+# frozen_string_literal: true
+
+module TwoFactorAuthenticationConcern
+  extend ActiveSupport::Concern
+
+  included do
+    prepend_before_action :authenticate_with_two_factor, if: :two_factor_enabled?, only: [:create]
+  end
+
+  def two_factor_enabled?
+    find_user&.otp_required_for_login?
+  end
+
+  def valid_otp_attempt?(user)
+    user.validate_and_consume_otp!(user_params[:otp_attempt]) ||
+      user.invalidate_otp_backup_code!(user_params[:otp_attempt])
+  rescue OpenSSL::Cipher::CipherError
+    false
+  end
+
+  def authenticate_with_two_factor
+    user = self.resource = find_user
+
+    if user_params[:otp_attempt].present? && session[:attempt_user_id]
+      authenticate_with_two_factor_attempt(user)
+    elsif user.present? && user.external_or_valid_password?(user_params[:password])
+      prompt_for_two_factor(user)
+    end
+  end
+
+  def authenticate_with_two_factor_attempt(user)
+    if valid_otp_attempt?(user)
+      session.delete(:attempt_user_id)
+      remember_me(user)
+      sign_in(user)
+    else
+      flash.now[:alert] = I18n.t('users.invalid_otp_token')
+      prompt_for_two_factor(user)
+    end
+  end
+
+  def prompt_for_two_factor(user)
+    session[:attempt_user_id] = user.id
+    use_pack 'auth'
+    @body_classes = 'lighter'
+    render :two_factor
+  end
+end
diff --git a/app/controllers/settings/migration/redirects_controller.rb b/app/controllers/settings/migration/redirects_controller.rb
index 6e5b72ffb..97193ade0 100644
--- a/app/controllers/settings/migration/redirects_controller.rb
+++ b/app/controllers/settings/migration/redirects_controller.rb
@@ -18,7 +18,7 @@ class Settings::Migration::RedirectsController < Settings::BaseController
     if @redirect.valid_with_challenge?(current_user)
       current_account.update!(moved_to_account: @redirect.target_account)
       ActivityPub::UpdateDistributionWorker.perform_async(current_account.id)
-      redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct)
+      redirect_to settings_migration_path, notice: I18n.t('migrations.redirected_msg', acct: current_account.moved_to_account.acct)
     else
       render :new
     end
diff --git a/app/controllers/statuses_controller.rb b/app/controllers/statuses_controller.rb
index a1b7f4320..b0abad984 100644
--- a/app/controllers/statuses_controller.rb
+++ b/app/controllers/statuses_controller.rb
@@ -44,7 +44,7 @@ class StatusesController < ApplicationController
 
   def activity
     expires_in 3.minutes, public: @status.distributable? && public_fetch_mode?
-    render_with_cache json: @status, content_type: 'application/activity+json', serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter
+    render_with_cache json: ActivityPub::ActivityPresenter.from_status(@status), content_type: 'application/activity+json', serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter
   end
 
   def embed
diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb
index 3d12c9eaf..2363cb31b 100644
--- a/app/controllers/tags_controller.rb
+++ b/app/controllers/tags_controller.rb
@@ -3,7 +3,8 @@
 class TagsController < ApplicationController
   include SignatureVerification
 
-  PAGE_SIZE = 20
+  PAGE_SIZE     = 20
+  PAGE_SIZE_MAX = 200
 
   layout 'public'
 
@@ -26,6 +27,7 @@ class TagsController < ApplicationController
       format.rss do
         expires_in 0, public: true
 
+        limit     = params[:limit].present? ? [params[:limit].to_i, PAGE_SIZE_MAX].min : PAGE_SIZE
         @statuses = HashtagQueryService.new.call(@tag, filter_params, nil, @local).limit(PAGE_SIZE)
         @statuses = cache_collection(@statuses, Status)
 
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 40f914f1e..2f11ccb6f 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -137,6 +137,11 @@ module ApplicationHelper
       text: [params[:title], params[:text], params[:url]].compact.join(' '),
     }
 
+    permit_visibilities = %w(public unlisted private direct)
+    default_privacy     = current_account&.user&.setting_default_privacy
+    permit_visibilities.shift(permit_visibilities.index(default_privacy) + 1) if default_privacy.present?
+    state_params[:visibility] = params[:visibility] if permit_visibilities.include? params[:visibility]
+
     if user_signed_in?
       state_params[:settings]          = state_params[:settings].merge(Web::Setting.find_by(user: current_user)&.data || {})
       state_params[:push_subscription] = current_account.user.web_push_subscription(current_session)
diff --git a/app/helpers/webfinger_helper.rb b/app/helpers/webfinger_helper.rb
index 70c493210..ab7ca4698 100644
--- a/app/helpers/webfinger_helper.rb
+++ b/app/helpers/webfinger_helper.rb
@@ -1,5 +1,16 @@
 # frozen_string_literal: true
 
+# Monkey-patch on monkey-patch.
+# Because it conflicts with the request.rb patch.
+class HTTP::Timeout::PerOperationOriginal < HTTP::Timeout::PerOperation
+  def connect(socket_class, host, port, nodelay = false)
+    ::Timeout.timeout(@connect_timeout, HTTP::TimeoutError) do
+      @socket = socket_class.open(host, port)
+      @socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
+    end
+  end
+end
+
 module WebfingerHelper
   def webfinger!(uri)
     hidden_service_uri = /\.(onion|i2p)(:\d+)?$/.match(uri)
@@ -12,6 +23,14 @@ module WebfingerHelper
       headers: {
         'User-Agent': Mastodon::Version.user_agent,
       },
+
+      timeout_class: HTTP::Timeout::PerOperationOriginal,
+
+      timeout_options: {
+        write_timeout: 10,
+        connect_timeout: 5,
+        read_timeout: 10,
+      },
     }
 
     Goldfinger::Client.new(uri, opts.merge(Rails.configuration.x.http_client_proxy)).finger
diff --git a/app/javascript/flavours/glitch/actions/importer/normalizer.js b/app/javascript/flavours/glitch/actions/importer/normalizer.js
index 52ad17779..05955963c 100644
--- a/app/javascript/flavours/glitch/actions/importer/normalizer.js
+++ b/app/javascript/flavours/glitch/actions/importer/normalizer.js
@@ -12,7 +12,7 @@ const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
 
 export function searchTextFromRawStatus (status) {
   const spoilerText   = status.spoiler_text || '';
-  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
+  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
   return domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 }
 
diff --git a/app/javascript/flavours/glitch/components/autosuggest_textarea.js b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
index ec2fbbe4b..1ce2f42b4 100644
--- a/app/javascript/flavours/glitch/components/autosuggest_textarea.js
+++ b/app/javascript/flavours/glitch/components/autosuggest_textarea.js
@@ -208,7 +208,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
             <span style={{ display: 'none' }}>{placeholder}</span>
 
             <Textarea
-              inputRef={this.setTextarea}
+              ref={this.setTextarea}
               className='autosuggest-textarea__textarea'
               disabled={disabled}
               placeholder={placeholder}
diff --git a/app/javascript/flavours/glitch/components/scrollable_list.js b/app/javascript/flavours/glitch/components/scrollable_list.js
index c022290a4..fae0a7393 100644
--- a/app/javascript/flavours/glitch/components/scrollable_list.js
+++ b/app/javascript/flavours/glitch/components/scrollable_list.js
@@ -32,6 +32,7 @@ export default class ScrollableList extends PureComponent {
     hasMore: PropTypes.bool,
     numPending: PropTypes.number,
     prepend: PropTypes.node,
+    append: PropTypes.node,
     alwaysPrepend: PropTypes.bool,
     emptyMessage: PropTypes.node,
     children: PropTypes.node,
@@ -272,7 +273,7 @@ export default class ScrollableList extends PureComponent {
   }
 
   render () {
-    const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, emptyMessage, onLoadMore } = this.props;
+    const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props;
     const { fullscreen } = this.state;
     const childrenCount = React.Children.count(children);
 
@@ -319,6 +320,8 @@ export default class ScrollableList extends PureComponent {
             ))}
 
             {loadMore}
+
+            {!hasMore && append}
           </div>
         </div>
       );
diff --git a/app/javascript/flavours/glitch/components/status.js b/app/javascript/flavours/glitch/components/status.js
index 91bc06b3c..e036c0da7 100644
--- a/app/javascript/flavours/glitch/components/status.js
+++ b/app/javascript/flavours/glitch/components/status.js
@@ -656,6 +656,7 @@ class Status extends ImmutablePureComponent {
           compact
           cacheWidth={this.props.cacheMediaWidth}
           defaultWidth={this.props.cachedMediaWidth}
+          sensitive={status.get('sensitive')}
         />
       );
       mediaIcon = 'link';
diff --git a/app/javascript/flavours/glitch/components/timeline_hint.js b/app/javascript/flavours/glitch/components/timeline_hint.js
new file mode 100644
index 000000000..fb55a62cc
--- /dev/null
+++ b/app/javascript/flavours/glitch/components/timeline_hint.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+
+const TimelineHint = ({ resource, url }) => (
+  <div className='timeline-hint'>
+    <strong><FormattedMessage id='timeline_hint.remote_resource_not_displayed' defaultMessage='{resource} from other servers are not displayed.' values={{ resource }} /></strong>
+    <br />
+    <a href={url} target='_blank'><FormattedMessage id='account.browse_more_on_origin_server' defaultMessage='Browse more on the original profile' /></a>
+  </div>
+);
+
+TimelineHint.propTypes = {
+  resource: PropTypes.node.isRequired,
+  url: PropTypes.string.isRequired,
+};
+
+export default TimelineHint;
diff --git a/app/javascript/flavours/glitch/features/account_timeline/index.js b/app/javascript/flavours/glitch/features/account_timeline/index.js
index f25c82a00..a8e8aa7a8 100644
--- a/app/javascript/flavours/glitch/features/account_timeline/index.js
+++ b/app/javascript/flavours/glitch/features/account_timeline/index.js
@@ -15,11 +15,14 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
 import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
+import TimelineHint from 'flavours/glitch/components/timeline_hint';
 
 const mapStateToProps = (state, { params: { accountId }, withReplies = false }) => {
   const path = withReplies ? `${accountId}:with_replies` : accountId;
 
   return {
+    remote: !!state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username']),
+    remoteUrl: state.getIn(['accounts', accountId, 'url']),
     isAccount: !!state.getIn(['accounts', accountId]),
     statusIds: state.getIn(['timelines', `account:${path}`, 'items'], ImmutableList()),
     featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], ImmutableList()),
@@ -28,6 +31,14 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
   };
 };
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.statuses' defaultMessage='Older toots' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class AccountTimeline extends ImmutablePureComponent {
 
@@ -40,6 +51,8 @@ class AccountTimeline extends ImmutablePureComponent {
     hasMore: PropTypes.bool,
     withReplies: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -78,7 +91,7 @@ class AccountTimeline extends ImmutablePureComponent {
   }
 
   render () {
-    const { statusIds, featuredStatusIds, isLoading, hasMore, isAccount, multiColumn } = this.props;
+    const { statusIds, featuredStatusIds, isLoading, hasMore, isAccount, multiColumn, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -97,6 +110,16 @@ class AccountTimeline extends ImmutablePureComponent {
       );
     }
 
+    let emptyMessage;
+
+    if (remote && statusIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
+
     return (
       <Column ref={this.setRef} name='account'>
         <ProfileColumnHeader onClick={this.handleHeaderClick} multiColumn={multiColumn} />
@@ -104,13 +127,14 @@ class AccountTimeline extends ImmutablePureComponent {
         <StatusList
           prepend={<HeaderContainer accountId={this.props.params.accountId} />}
           alwaysPrepend
+          append={remoteMessage}
           scrollKey='account_timeline'
           statusIds={statusIds}
           featuredStatusIds={featuredStatusIds}
           isLoading={isLoading}
           hasMore={hasMore}
           onLoadMore={this.handleLoadMore}
-          emptyMessage={<FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />}
+          emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
           timelineId='account'
         />
diff --git a/app/javascript/flavours/glitch/features/audio/index.js b/app/javascript/flavours/glitch/features/audio/index.js
index 49e91227f..ba3534492 100644
--- a/app/javascript/flavours/glitch/features/audio/index.js
+++ b/app/javascript/flavours/glitch/features/audio/index.js
@@ -125,6 +125,7 @@ class Audio extends React.PureComponent {
         this.wavesurfer.createPeakCache();
         this.wavesurfer.load(this.props.src);
         this.wavesurfer.toggleInteraction();
+        this.wavesurfer.setVolume(this.state.volume);
         this.loaded = true;
       }
 
diff --git a/app/javascript/flavours/glitch/features/emoji_picker/index.js b/app/javascript/flavours/glitch/features/emoji_picker/index.js
index 3717fcd82..14e5cb94a 100644
--- a/app/javascript/flavours/glitch/features/emoji_picker/index.js
+++ b/app/javascript/flavours/glitch/features/emoji_picker/index.js
@@ -279,12 +279,13 @@ class EmojiPickerMenu extends React.PureComponent {
     };
   }
 
-  handleClick = emoji => {
+  handleClick = (emoji, event) => {
     if (!emoji.native) {
       emoji.native = emoji.colons;
     }
-
-    this.props.onClose();
+    if (!event.ctrlKey) {
+      this.props.onClose();
+    }
     this.props.onPick(emoji);
   }
 
diff --git a/app/javascript/flavours/glitch/features/followers/index.js b/app/javascript/flavours/glitch/features/followers/index.js
index bf41f3b98..8ae46be94 100644
--- a/app/javascript/flavours/glitch/features/followers/index.js
+++ b/app/javascript/flavours/glitch/features/followers/index.js
@@ -17,14 +17,25 @@ import HeaderContainer from 'flavours/glitch/features/account_timeline/container
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import ScrollableList from 'flavours/glitch/components/scrollable_list';
+import TimelineHint from 'flavours/glitch/components/timeline_hint';
 
 const mapStateToProps = (state, props) => ({
+  remote: !!state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username']),
+  remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
   isAccount: !!state.getIn(['accounts', props.params.accountId]),
   accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
   isLoading: state.getIn(['user_lists', 'followers', props.params.accountId, 'isLoading'], true),
 });
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class Followers extends ImmutablePureComponent {
 
@@ -35,6 +46,8 @@ class Followers extends ImmutablePureComponent {
     hasMore: PropTypes.bool,
     isLoading: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -65,7 +78,7 @@ class Followers extends ImmutablePureComponent {
   }
 
   render () {
-    const { accountIds, hasMore, isAccount, multiColumn, isLoading } = this.props;
+    const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -83,7 +96,15 @@ class Followers extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
+    let emptyMessage;
+
+    if (remote && accountIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
 
     return (
       <Column ref={this.setRef}>
@@ -96,6 +117,7 @@ class Followers extends ImmutablePureComponent {
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
           alwaysPrepend
+          append={remoteMessage}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
diff --git a/app/javascript/flavours/glitch/features/following/index.js b/app/javascript/flavours/glitch/features/following/index.js
index f090900cc..e06eaa8a6 100644
--- a/app/javascript/flavours/glitch/features/following/index.js
+++ b/app/javascript/flavours/glitch/features/following/index.js
@@ -17,14 +17,25 @@ import HeaderContainer from 'flavours/glitch/features/account_timeline/container
 import ImmutablePureComponent from 'react-immutable-pure-component';
 import MissingIndicator from 'flavours/glitch/components/missing_indicator';
 import ScrollableList from 'flavours/glitch/components/scrollable_list';
+import TimelineHint from 'flavours/glitch/components/timeline_hint';
 
 const mapStateToProps = (state, props) => ({
+  remote: !!state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username']),
+  remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
   isAccount: !!state.getIn(['accounts', props.params.accountId]),
   accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
   isLoading: state.getIn(['user_lists', 'following', props.params.accountId, 'isLoading'], true),
 });
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class Following extends ImmutablePureComponent {
 
@@ -35,6 +46,8 @@ class Following extends ImmutablePureComponent {
     hasMore: PropTypes.bool,
     isLoading: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -65,7 +78,7 @@ class Following extends ImmutablePureComponent {
   }
 
   render () {
-    const { accountIds, hasMore, isAccount, multiColumn, isLoading } = this.props;
+    const { accountIds, hasMore, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -83,7 +96,15 @@ class Following extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
+    let emptyMessage;
+
+    if (remote && accountIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
 
     return (
       <Column ref={this.setRef}>
@@ -96,6 +117,7 @@ class Following extends ImmutablePureComponent {
           onLoadMore={this.handleLoadMore}
           prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
           alwaysPrepend
+          append={remoteMessage}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
diff --git a/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js b/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js
index 0bb71e872..abc3f468f 100644
--- a/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js
+++ b/app/javascript/flavours/glitch/features/keyboard_shortcuts/index.js
@@ -106,6 +106,10 @@ class KeyboardShortcuts extends ImmutablePureComponent {
                 <td><FormattedMessage id='keyboard_shortcuts.toot' defaultMessage='to start a brand new toot' /></td>
               </tr>
               <tr>
+                <td><kbd>alt</kbd>+<kbd>x</kbd></td>
+                <td><FormattedMessage id='keyboard_shortcuts.spoilers' defaultMessage='to show/hide CW field' /></td>
+              </tr>
+              <tr>
                 <td><kbd>backspace</kbd></td>
                 <td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
               </tr>
diff --git a/app/javascript/flavours/glitch/features/status/components/card.js b/app/javascript/flavours/glitch/features/status/components/card.js
index e3ee7dada..03867e03a 100644
--- a/app/javascript/flavours/glitch/features/status/components/card.js
+++ b/app/javascript/flavours/glitch/features/status/components/card.js
@@ -2,10 +2,14 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import Immutable from 'immutable';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
 import punycode from 'punycode';
 import classnames from 'classnames';
 import { decode as decodeIDNA } from 'flavours/glitch/util/idna';
 import Icon from 'flavours/glitch/components/icon';
+import classNames from 'classnames';
+import { useBlurhash } from 'flavours/glitch/util/initial_state';
+import { decode } from 'blurhash';
 
 const getHostname = url => {
   const parser = document.createElement('a');
@@ -55,6 +59,7 @@ export default class Card extends React.PureComponent {
     compact: PropTypes.bool,
     defaultWidth: PropTypes.number,
     cacheWidth: PropTypes.func,
+    sensitive: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -64,12 +69,44 @@ export default class Card extends React.PureComponent {
 
   state = {
     width: this.props.defaultWidth || 280,
+    previewLoaded: false,
     embedded: false,
+    revealed: !this.props.sensitive,
   };
 
   componentWillReceiveProps (nextProps) {
     if (!Immutable.is(this.props.card, nextProps.card)) {
-      this.setState({ embedded: false });
+      this.setState({ embedded: false, previewLoaded: false });
+    }
+    if (this.props.sensitive !== nextProps.sensitive) {
+      this.setState({ revealed: !nextProps.sensitive });
+    }
+  }
+
+  componentDidMount () {
+    if (this.props.card && this.props.card.get('blurhash')) {
+      this._decode();
+    }
+  }
+
+  componentDidUpdate (prevProps) {
+    const { card } = this.props;
+    if (card.get('blurhash') && (!prevProps.card || prevProps.card.get('blurhash') !== card.get('blurhash'))) {
+      this._decode();
+    }
+  }
+
+  _decode () {
+    if (!useBlurhash) return;
+
+    const hash   = this.props.card.get('blurhash');
+    const pixels = decode(hash, 32, 32);
+
+    if (pixels) {
+      const ctx       = this.canvas.getContext('2d');
+      const imageData = new ImageData(pixels, 32, 32);
+
+      ctx.putImageData(imageData, 0, 0);
     }
   }
 
@@ -111,6 +148,18 @@ export default class Card extends React.PureComponent {
     }
   }
 
+  setCanvasRef = c => {
+    this.canvas = c;
+  }
+
+  handleImageLoad = () => {
+    this.setState({ previewLoaded: true });
+  }
+
+  handleReveal = () => {
+    this.setState({ revealed: true });
+  }
+
   renderVideo () {
     const { card }  = this.props;
     const content   = { __html: addAutoPlay(card.get('html')) };
@@ -130,7 +179,7 @@ export default class Card extends React.PureComponent {
 
   render () {
     const { card, maxDescription, compact, defaultWidth } = this.props;
-    const { width, embedded } = this.state;
+    const { width, embedded, revealed } = this.state;
 
     if (card === null) {
       return null;
@@ -145,7 +194,7 @@ export default class Card extends React.PureComponent {
     const height      = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio);
 
     const description = (
-      <div className='status-card__content'>
+      <div className={classNames('status-card__content', { 'status-card__content--blurred': !revealed })}>
         {title}
         {!(horizontal || compact) && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>}
         <span className='status-card__host'>{provider}</span>
@@ -153,7 +202,18 @@ export default class Card extends React.PureComponent {
     );
 
     let embed     = '';
-    let thumbnail = <div style={{ backgroundImage: `url(${card.get('image')})`, width: horizontal ? width : null, height: horizontal ? height : null }} className='status-card__image-image' />;
+    let canvas = <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('status-card__image-preview', { 'status-card__image-preview--hidden' : revealed && this.state.previewLoaded })} />;
+    let thumbnail = <img src={card.get('image')} alt='' style={{ width: horizontal ? width : null, height: horizontal ? height : null, visibility: revealed ? null : 'hidden' }} onLoad={this.handleImageLoad} className='status-card__image-image' />;
+    let spoilerButton = (
+      <button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
+        <span className='spoiler-button__overlay__label'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span>
+      </button>
+    );
+    spoilerButton = (
+      <div className={classNames('spoiler-button', { 'spoiler-button--minified': revealed })}>
+        {spoilerButton}
+      </div>
+    );
 
     if (interactive) {
       if (embedded) {
@@ -167,14 +227,18 @@ export default class Card extends React.PureComponent {
 
         embed = (
           <div className='status-card__image'>
+            {canvas}
             {thumbnail}
 
-            <div className='status-card__actions'>
-              <div>
-                <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
-                {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+            {revealed && (
+              <div className='status-card__actions'>
+                <div>
+                  <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
+                  {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+                </div>
               </div>
-            </div>
+            )}
+            {!revealed && spoilerButton}
           </div>
         );
       }
@@ -188,13 +252,16 @@ export default class Card extends React.PureComponent {
     } else if (card.get('image')) {
       embed = (
         <div className='status-card__image'>
+          {canvas}
           {thumbnail}
+          {!revealed && spoilerButton}
         </div>
       );
     } else {
       embed = (
         <div className='status-card__image'>
           <Icon id='file-text' />
+          {!revealed && spoilerButton}
         </div>
       );
     }
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 17f22a8a2..4fbd65517 100644
--- a/app/javascript/flavours/glitch/features/status/components/detailed_status.js
+++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.js
@@ -184,7 +184,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         mediaIcon = 'picture-o';
       }
     } else if (status.get('card')) {
-      media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card')} />;
+      media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card')} />;
       mediaIcon = 'link';
     }
 
diff --git a/app/javascript/flavours/glitch/features/ui/index.js b/app/javascript/flavours/glitch/features/ui/index.js
index f8f6cff88..bf76c0e57 100644
--- a/app/javascript/flavours/glitch/features/ui/index.js
+++ b/app/javascript/flavours/glitch/features/ui/index.js
@@ -7,7 +7,7 @@ import { connect } from 'react-redux';
 import { Redirect, withRouter } from 'react-router-dom';
 import { isMobile } from 'flavours/glitch/util/is_mobile';
 import { debounce } from 'lodash';
-import { uploadCompose, resetCompose } from 'flavours/glitch/actions/compose';
+import { uploadCompose, resetCompose, changeComposeSpoilerness } from 'flavours/glitch/actions/compose';
 import { expandHomeTimeline } from 'flavours/glitch/actions/timelines';
 import { expandNotifications, notificationsSetVisibility } from 'flavours/glitch/actions/notifications';
 import { fetchFilters } from 'flavours/glitch/actions/filters';
@@ -81,6 +81,7 @@ const keyMap = {
   new: 'n',
   search: 's',
   forceNew: 'option+n',
+  toggleComposeSpoilers: 'option+x',
   focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
   reply: 'r',
   favourite: 'f',
@@ -396,7 +397,7 @@ class UI extends React.Component {
 
   componentDidMount () {
     this.hotkeys.__mousetrap__.stopCallback = (e, element) => {
-      return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName);
+      return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName) && !e.altKey;
     };
   }
 
@@ -455,6 +456,11 @@ class UI extends React.Component {
     this.props.dispatch(resetCompose());
   }
 
+  handleHotkeyToggleComposeSpoilers = e => {
+    e.preventDefault();
+    this.props.dispatch(changeComposeSpoilerness());
+  }
+
   handleHotkeyFocusColumn = e => {
     const index  = (e.key * 1) + 1; // First child is drawer, skip that
     const column = this.node.querySelector(`.column:nth-child(${index})`);
@@ -569,6 +575,7 @@ class UI extends React.Component {
       new: this.handleHotkeyNew,
       search: this.handleHotkeySearch,
       forceNew: this.handleHotkeyForceNew,
+      toggleComposeSpoilers: this.handleHotkeyToggleComposeSpoilers,
       focusColumn: this.handleHotkeyFocusColumn,
       back: this.handleHotkeyBack,
       goToHome: this.handleHotkeyGoToHome,
diff --git a/app/javascript/flavours/glitch/styles/accessibility.scss b/app/javascript/flavours/glitch/styles/accessibility.scss
index 35e91da80..1a2de2f06 100644
--- a/app/javascript/flavours/glitch/styles/accessibility.scss
+++ b/app/javascript/flavours/glitch/styles/accessibility.scss
@@ -1,13 +1,13 @@
-$emojis-requiring-outlines: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash' !default;
+$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
 
-%emoji-outline {
-  filter: drop-shadow(1px 1px 0 $primary-text-color) drop-shadow(-1px 1px 0 $primary-text-color) drop-shadow(1px -1px 0 $primary-text-color) drop-shadow(-1px -1px 0 $primary-text-color);
+%emoji-color-inversion {
+  filter: invert(1);
 }
 
 .emojione {
-  @each $emoji in $emojis-requiring-outlines {
+  @each $emoji in $emojis-requiring-inversion {
     &[title=':#{$emoji}:'] {
-      @extend %emoji-outline;
+      @extend %emoji-color-inversion;
     }
   }
 }
diff --git a/app/javascript/flavours/glitch/styles/components/columns.scss b/app/javascript/flavours/glitch/styles/components/columns.scss
index 3269638eb..6b657660a 100644
--- a/app/javascript/flavours/glitch/styles/components/columns.scss
+++ b/app/javascript/flavours/glitch/styles/components/columns.scss
@@ -363,8 +363,8 @@
     @extend .column-header__button;
     background: transparent;
     text-align: center;
-    padding: 10px 0;
-    white-space: pre-wrap;
+    padding: 10px 5px;
+    font-size: 14px;
   }
 
   b {
@@ -372,6 +372,23 @@
   }
 }
 
+
+.layout-single-column .column-header__notif-cleaning-buttons {
+  @media screen and (min-width: $no-gap-breakpoint) {
+    b, i {
+      margin-right: 5px;
+    }
+
+    br {
+      display: none;
+    }
+
+    button {
+      padding: 15px 5px;
+    }
+  }
+}
+
 // The notifs drawer with no padding to have more space for the buttons
 .column-header__collapsible-inner.nopad-drawer {
   padding: 0;
diff --git a/app/javascript/flavours/glitch/styles/components/index.scss b/app/javascript/flavours/glitch/styles/components/index.scss
index 50cea8b26..a37cef795 100644
--- a/app/javascript/flavours/glitch/styles/components/index.scss
+++ b/app/javascript/flavours/glitch/styles/components/index.scss
@@ -1093,6 +1093,31 @@
   border-bottom: 1px solid lighten($ui-base-color, 8%);
 }
 
+.timeline-hint {
+  text-align: center;
+  color: $darker-text-color;
+  padding: 15px;
+  box-sizing: border-box;
+  width: 100%;
+  cursor: default;
+
+  strong {
+    font-weight: 500;
+  }
+
+  a {
+    color: lighten($ui-highlight-color, 8%);
+    text-decoration: none;
+
+    &:hover,
+    &:focus,
+    &:active {
+      text-decoration: underline;
+      color: lighten($ui-highlight-color, 12%);
+    }
+  }
+}
+
 .missing-indicator {
   padding-top: 20px + 48px;
 
diff --git a/app/javascript/flavours/glitch/styles/components/status.scss b/app/javascript/flavours/glitch/styles/components/status.scss
index 50b7f2a72..28a4ce0ce 100644
--- a/app/javascript/flavours/glitch/styles/components/status.scss
+++ b/app/javascript/flavours/glitch/styles/components/status.scss
@@ -874,6 +874,11 @@ a.status-card {
   flex: 1 1 auto;
   overflow: hidden;
   padding: 14px 14px 14px 8px;
+
+  &--blurred {
+    filter: blur(2px);
+    pointer-events: none;
+  }
 }
 
 .status-card__description {
@@ -911,7 +916,8 @@ a.status-card {
     width: 100%;
   }
 
-  .status-card__image-image {
+  .status-card__image-image,
+  .status-card__image-preview {
     border-radius: 4px 4px 0 0;
   }
 
@@ -956,6 +962,24 @@ a.status-card.compact:hover {
   background-position: center center;
 }
 
+.status-card__image-preview {
+  border-radius: 4px 0 0 4px;
+  display: block;
+  margin: 0;
+  width: 100%;
+  height: 100%;
+  object-fit: fill;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 0;
+  background: $base-overlay-background;
+
+  &--hidden {
+    display: none;
+  }
+}
+
 .attachment-list {
   display: flex;
   font-size: 14px;
diff --git a/app/javascript/flavours/glitch/styles/forms.scss b/app/javascript/flavours/glitch/styles/forms.scss
index 5de650f0a..6767c15f1 100644
--- a/app/javascript/flavours/glitch/styles/forms.scss
+++ b/app/javascript/flavours/glitch/styles/forms.scss
@@ -578,7 +578,7 @@ code {
 
   &.alert {
     border: 1px solid rgba($error-value-color, 0.5);
-    background: rgba($error-value-color, 0.25);
+    background: rgba($error-value-color, 0.1);
     color: $error-value-color;
   }
 
diff --git a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
index 312f5e314..7709d4535 100644
--- a/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
+++ b/app/javascript/flavours/glitch/styles/mastodon-light/variables.scss
@@ -37,4 +37,4 @@ $account-background-color: $white !default;
   @return hsl(hue($color), saturation($color), lightness($color) - $amount);
 }
 
-$emojis-requiring-outlines: 'alien' 'baseball' 'chains' 'chicken' 'cloud' 'crescent_moon' 'dash' 'dove_of_peace' 'eyes' 'first_quarter_moon' 'first_quarter_moon_with_face' 'fish_cake' 'full_moon' 'full_moon_with_face' 'ghost' 'goat' 'grey_exclamation' 'grey_question' 'ice_skate' 'last_quarter_moon' 'last_quarter_moon_with_face' 'lightning' 'loud_sound' 'moon' 'mute' 'page_with_curl' 'rain_cloud' 'ram' 'rice' 'rice_ball' 'rooster' 'sheep' 'skull' 'skull_and_crossbones' 'snow_cloud' 'sound' 'speaker' 'speech_balloon' 'thought_balloon' 'volleyball' 'waning_crescent_moon' 'waning_gibbous_moon' 'waving_white_flag' 'waxing_crescent_moon' 'white_circle' 'white_large_square' 'white_medium_small_square' 'white_medium_square' 'white_small_square' 'wind_blowing_face';
+$emojis-requiring-inversion: 'chains';
diff --git a/app/javascript/flavours/glitch/util/emoji/index.js b/app/javascript/flavours/glitch/util/emoji/index.js
index e1a244127..61f211c92 100644
--- a/app/javascript/flavours/glitch/util/emoji/index.js
+++ b/app/javascript/flavours/glitch/util/emoji/index.js
@@ -6,6 +6,20 @@ const trie = new Trie(Object.keys(unicodeMapping));
 
 const assetHost = process.env.CDN_HOST || '';
 
+// Convert to file names from emojis. (For different variation selector emojis)
+const emojiFilenames = (emojis) => {
+  return emojis.map(v => unicodeMapping[v].filename);
+};
+
+// Emoji requiring extra borders depending on theme
+const darkEmoji = emojiFilenames(['🎱', '🐜', '⚫', '🖤', '⬛', '◼️', '◾', '◼️', '✒️', '▪️', '💣', '🎳', '📷', '📸', '♣️', '🕶️', '✴️', '🔌', '💂‍♀️', '📽️', '🍳', '🦍', '💂', '🔪', '🕳️', '🕹️', '🕋', '🖊️', '🖋️', '💂‍♂️', '🎤', '🎓', '🎥', '🎼', '♠️', '🎩', '🦃', '📼', '📹', '🎮', '🐃', '🏴']);
+const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', '🕊️', '👀', '🍥', '👻', '🐐', '❕', '❔', '⛸️', '🌩️', '🔊', '🔇', '📃', '🌧️', '🐏', '🍚', '🍙', '🐓', '🐑', '💀', '☠️', '🌨️', '🔉', '🔈', '💬', '💭', '🏐', '🏳️', '⚪', '⬜', '◽', '◻️', '▫️']);
+
+const emojiFilename = (filename) => {
+  const borderedEmoji = (document.body && document.body.classList.contains('skin-mastodon-light')) ? lightEmoji : darkEmoji;
+  return borderedEmoji.includes(filename) ? (filename + '_border') : filename;
+};
+
 const emojify = (str, customEmojis = {}) => {
   const tagCharsWithoutEmojis = '<&';
   const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&';
@@ -60,7 +74,7 @@ const emojify = (str, customEmojis = {}) => {
     } else if (!useSystemEmojiFont) { // matched to unicode emoji
       const { filename, shortCode } = unicodeMapping[match];
       const title = shortCode ? `:${shortCode}:` : '';
-      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${filename}.svg" />`;
+      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${emojiFilename(filename)}.svg" />`;
       rend = i + match.length;
       // If the matched character was followed by VS15 (for selecting text presentation), skip it.
       if (str.codePointAt(rend) === 65038) {
diff --git a/app/javascript/mastodon/actions/importer/normalizer.js b/app/javascript/mastodon/actions/importer/normalizer.js
index f7cbe4c1c..dca44917a 100644
--- a/app/javascript/mastodon/actions/importer/normalizer.js
+++ b/app/javascript/mastodon/actions/importer/normalizer.js
@@ -12,7 +12,7 @@ const makeEmojiMap = record => record.emojis.reduce((obj, emoji) => {
 
 export function searchTextFromRawStatus (status) {
   const spoilerText   = status.spoiler_text || '';
-  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
+  const searchContent = ([spoilerText, status.content].concat((status.poll && status.poll.options) ? status.poll.options.map(option => option.title) : [])).concat(status.media_attachments.map(att => att.description)).join('\n\n').replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n');
   return domParser.parseFromString(searchContent, 'text/html').documentElement.textContent;
 }
 
diff --git a/app/javascript/mastodon/components/autosuggest_textarea.js b/app/javascript/mastodon/components/autosuggest_textarea.js
index ac2a6366a..58ec4f6eb 100644
--- a/app/javascript/mastodon/components/autosuggest_textarea.js
+++ b/app/javascript/mastodon/components/autosuggest_textarea.js
@@ -208,7 +208,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
             <span style={{ display: 'none' }}>{placeholder}</span>
 
             <Textarea
-              inputRef={this.setTextarea}
+              ref={this.setTextarea}
               className='autosuggest-textarea__textarea'
               disabled={disabled}
               placeholder={placeholder}
diff --git a/app/javascript/mastodon/components/modal_root.js b/app/javascript/mastodon/components/modal_root.js
index fa4e59192..6297b5e29 100644
--- a/app/javascript/mastodon/components/modal_root.js
+++ b/app/javascript/mastodon/components/modal_root.js
@@ -66,7 +66,7 @@ export default class ModalRoot extends React.PureComponent {
       // immediately selectable, we have to wait for observers to run, as
       // described in https://github.com/WICG/inert#performance-and-gotchas
       Promise.resolve().then(() => {
-        this.activeElement.focus();
+        this.activeElement.focus({ preventScroll: true });
         this.activeElement = null;
       }).catch((error) => {
         console.error(error);
diff --git a/app/javascript/mastodon/components/scrollable_list.js b/app/javascript/mastodon/components/scrollable_list.js
index 65ca43911..7eb0910c9 100644
--- a/app/javascript/mastodon/components/scrollable_list.js
+++ b/app/javascript/mastodon/components/scrollable_list.js
@@ -32,6 +32,7 @@ export default class ScrollableList extends PureComponent {
     hasMore: PropTypes.bool,
     numPending: PropTypes.number,
     prepend: PropTypes.node,
+    append: PropTypes.node,
     alwaysPrepend: PropTypes.bool,
     emptyMessage: PropTypes.node,
     children: PropTypes.node,
@@ -280,7 +281,7 @@ export default class ScrollableList extends PureComponent {
   }
 
   render () {
-    const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, emptyMessage, onLoadMore } = this.props;
+    const { children, scrollKey, trackScroll, shouldUpdateScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props;
     const { fullscreen } = this.state;
     const childrenCount = React.Children.count(children);
 
@@ -327,6 +328,8 @@ export default class ScrollableList extends PureComponent {
             ))}
 
             {loadMore}
+
+            {!hasMore && append}
           </div>
         </div>
       );
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index 9e4442cef..f99ccd39a 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -401,6 +401,7 @@ class Status extends ImmutablePureComponent {
           compact
           cacheWidth={this.props.cacheMediaWidth}
           defaultWidth={this.props.cachedMediaWidth}
+          sensitive={status.get('sensitive')}
         />
       );
     }
diff --git a/app/javascript/mastodon/components/timeline_hint.js b/app/javascript/mastodon/components/timeline_hint.js
new file mode 100644
index 000000000..fb55a62cc
--- /dev/null
+++ b/app/javascript/mastodon/components/timeline_hint.js
@@ -0,0 +1,18 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { FormattedMessage } from 'react-intl';
+
+const TimelineHint = ({ resource, url }) => (
+  <div className='timeline-hint'>
+    <strong><FormattedMessage id='timeline_hint.remote_resource_not_displayed' defaultMessage='{resource} from other servers are not displayed.' values={{ resource }} /></strong>
+    <br />
+    <a href={url} target='_blank'><FormattedMessage id='account.browse_more_on_origin_server' defaultMessage='Browse more on the original profile' /></a>
+  </div>
+);
+
+TimelineHint.propTypes = {
+  resource: PropTypes.node.isRequired,
+  url: PropTypes.string.isRequired,
+};
+
+export default TimelineHint;
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index 37622d4c0..6740e8adb 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -14,6 +14,7 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 import { FormattedMessage } from 'react-intl';
 import { fetchAccountIdentityProofs } from '../../actions/identity_proofs';
 import MissingIndicator from 'mastodon/components/missing_indicator';
+import TimelineHint from 'mastodon/components/timeline_hint';
 
 const emptyList = ImmutableList();
 
@@ -21,6 +22,8 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
   const path = withReplies ? `${accountId}:with_replies` : accountId;
 
   return {
+    remote: !!state.getIn(['accounts', accountId, 'acct']) !== state.getIn(['accounts', accountId, 'username']),
+    remoteUrl: state.getIn(['accounts', accountId, 'url']),
     isAccount: !!state.getIn(['accounts', accountId]),
     statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
     featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),
@@ -30,6 +33,14 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
   };
 };
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.statuses' defaultMessage='Older toots' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class AccountTimeline extends ImmutablePureComponent {
 
@@ -44,6 +55,8 @@ class AccountTimeline extends ImmutablePureComponent {
     withReplies: PropTypes.bool,
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -78,7 +91,7 @@ class AccountTimeline extends ImmutablePureComponent {
   }
 
   render () {
-    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn } = this.props;
+    const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -97,7 +110,17 @@ class AccountTimeline extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
+    let emptyMessage;
+
+    if (blockedBy) {
+      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
+    } else if (remote && statusIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='empty_column.account_timeline' defaultMessage='No toots here!' />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
 
     return (
       <Column>
@@ -106,6 +129,7 @@ class AccountTimeline extends ImmutablePureComponent {
         <StatusList
           prepend={<HeaderContainer accountId={this.props.params.accountId} />}
           alwaysPrepend
+          append={remoteMessage}
           scrollKey='account_timeline'
           statusIds={blockedBy ? emptyList : statusIds}
           featuredStatusIds={featuredStatusIds}
diff --git a/app/javascript/mastodon/features/audio/index.js b/app/javascript/mastodon/features/audio/index.js
index 95c9c7751..baad1c0e5 100644
--- a/app/javascript/mastodon/features/audio/index.js
+++ b/app/javascript/mastodon/features/audio/index.js
@@ -128,6 +128,7 @@ class Audio extends React.PureComponent {
         this.wavesurfer.createPeakCache();
         this.wavesurfer.load(this.props.src);
         this.wavesurfer.toggleInteraction();
+        this.wavesurfer.setVolume(this.state.volume);
         this.loaded = true;
       }
 
diff --git a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
index 582bb0d39..a6186010b 100644
--- a/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
+++ b/app/javascript/mastodon/features/compose/components/emoji_picker_dropdown.js
@@ -199,12 +199,13 @@ class EmojiPickerMenu extends React.PureComponent {
     };
   }
 
-  handleClick = emoji => {
+  handleClick = (emoji, event) => {
     if (!emoji.native) {
       emoji.native = emoji.colons;
     }
-
-    this.props.onClose();
+    if (!event.ctrlKey) {
+      this.props.onClose();
+    }
     this.props.onPick(emoji);
   }
 
diff --git a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
index c8425c4c6..07b3d8c53 100644
--- a/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
+++ b/app/javascript/mastodon/features/emoji/__tests__/emoji-test.js
@@ -76,7 +76,17 @@ describe('emoji', () => {
 
     it('skips the textual presentation VS15 character', () => {
       expect(emojify('✴︎')) // This is U+2734 EIGHT POINTED BLACK STAR then U+FE0E VARIATION SELECTOR-15
-        .toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734.svg" />');
+        .toEqual('<img draggable="false" class="emojione" alt="✴" title=":eight_pointed_black_star:" src="/emoji/2734_border.svg" />');
+    });
+
+    it('does an simple emoji properly', () => {
+      expect(emojify('♀♂'))
+        .toEqual('<img draggable="false" class="emojione" alt="♀" title=":female_sign:" src="/emoji/2640.svg" /><img draggable="false" class="emojione" alt="♂" title=":male_sign:" src="/emoji/2642.svg" />');
+    });
+
+    it('does an emoji containing ZWJ properly', () => {
+      expect(emojify('💂‍♀️💂‍♂️'))
+        .toEqual('<img draggable="false" class="emojione" alt="💂\u200D♀️" title=":female-guard:" src="/emoji/1f482-200d-2640-fe0f_border.svg" /><img draggable="false" class="emojione" alt="💂\u200D♂️" title=":male-guard:" src="/emoji/1f482-200d-2642-fe0f_border.svg" />');
     });
   });
 });
diff --git a/app/javascript/mastodon/features/emoji/emoji.js b/app/javascript/mastodon/features/emoji/emoji.js
index cd10e20b7..f7d3cfd08 100644
--- a/app/javascript/mastodon/features/emoji/emoji.js
+++ b/app/javascript/mastodon/features/emoji/emoji.js
@@ -6,6 +6,20 @@ const trie = new Trie(Object.keys(unicodeMapping));
 
 const assetHost = process.env.CDN_HOST || '';
 
+// Convert to file names from emojis. (For different variation selector emojis)
+const emojiFilenames = (emojis) => {
+  return emojis.map(v => unicodeMapping[v].filename);
+};
+
+// Emoji requiring extra borders depending on theme
+const darkEmoji = emojiFilenames(['🎱', '🐜', '⚫', '🖤', '⬛', '◼️', '◾', '◼️', '✒️', '▪️', '💣', '🎳', '📷', '📸', '♣️', '🕶️', '✴️', '🔌', '💂‍♀️', '📽️', '🍳', '🦍', '💂', '🔪', '🕳️', '🕹️', '🕋', '🖊️', '🖋️', '💂‍♂️', '🎤', '🎓', '🎥', '🎼', '♠️', '🎩', '🦃', '📼', '📹', '🎮', '🐃', '🏴']);
+const lightEmoji = emojiFilenames(['👽', '⚾', '🐔', '☁️', '💨', '🕊️', '👀', '🍥', '👻', '🐐', '❕', '❔', '⛸️', '🌩️', '🔊', '🔇', '📃', '🌧️', '🐏', '🍚', '🍙', '🐓', '🐑', '💀', '☠️', '🌨️', '🔉', '🔈', '💬', '💭', '🏐', '🏳️', '⚪', '⬜', '◽', '◻️', '▫️']);
+
+const emojiFilename = (filename) => {
+  const borderedEmoji = (document.body && document.body.classList.contains('theme-mastodon-light')) ? lightEmoji : darkEmoji;
+  return borderedEmoji.includes(filename) ? (filename + '_border') : filename;
+};
+
 const emojify = (str, customEmojis = {}) => {
   const tagCharsWithoutEmojis = '<&';
   const tagCharsWithEmojis = Object.keys(customEmojis).length ? '<&:' : '<&';
@@ -60,7 +74,7 @@ const emojify = (str, customEmojis = {}) => {
     } else { // matched to unicode emoji
       const { filename, shortCode } = unicodeMapping[match];
       const title = shortCode ? `:${shortCode}:` : '';
-      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${filename}.svg" />`;
+      replacement = `<img draggable="false" class="emojione" alt="${match}" title="${title}" src="${assetHost}/emoji/${emojiFilename(filename)}.svg" />`;
       rend = i + match.length;
       // If the matched character was followed by VS15 (for selecting text presentation), skip it.
       if (str.codePointAt(rend) === 65038) {
diff --git a/app/javascript/mastodon/features/followers/index.js b/app/javascript/mastodon/features/followers/index.js
index 302ccffdd..439161118 100644
--- a/app/javascript/mastodon/features/followers/index.js
+++ b/app/javascript/mastodon/features/followers/index.js
@@ -17,8 +17,11 @@ import HeaderContainer from '../account_timeline/containers/header_container';
 import ColumnBackButton from '../../components/column_back_button';
 import ScrollableList from '../../components/scrollable_list';
 import MissingIndicator from 'mastodon/components/missing_indicator';
+import TimelineHint from 'mastodon/components/timeline_hint';
 
 const mapStateToProps = (state, props) => ({
+  remote: !!state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username']),
+  remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
   isAccount: !!state.getIn(['accounts', props.params.accountId]),
   accountIds: state.getIn(['user_lists', 'followers', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'followers', props.params.accountId, 'next']),
@@ -26,6 +29,14 @@ const mapStateToProps = (state, props) => ({
   blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 });
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.followers' defaultMessage='Followers' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class Followers extends ImmutablePureComponent {
 
@@ -38,6 +49,8 @@ class Followers extends ImmutablePureComponent {
     isLoading: PropTypes.bool,
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -60,7 +73,7 @@ class Followers extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
+    const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -78,7 +91,17 @@ class Followers extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
+    let emptyMessage;
+
+    if (blockedBy) {
+      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
+    } else if (remote && accountIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='account.followers.empty' defaultMessage='No one follows this user yet.' />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
 
     return (
       <Column>
@@ -92,6 +115,7 @@ class Followers extends ImmutablePureComponent {
           shouldUpdateScroll={shouldUpdateScroll}
           prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
           alwaysPrepend
+          append={remoteMessage}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js
index 06311bbdc..2d2ed7be4 100644
--- a/app/javascript/mastodon/features/following/index.js
+++ b/app/javascript/mastodon/features/following/index.js
@@ -17,8 +17,11 @@ import HeaderContainer from '../account_timeline/containers/header_container';
 import ColumnBackButton from '../../components/column_back_button';
 import ScrollableList from '../../components/scrollable_list';
 import MissingIndicator from 'mastodon/components/missing_indicator';
+import TimelineHint from 'mastodon/components/timeline_hint';
 
 const mapStateToProps = (state, props) => ({
+  remote: !!state.getIn(['accounts', props.params.accountId, 'acct']) !== state.getIn(['accounts', props.params.accountId, 'username']),
+  remoteUrl: state.getIn(['accounts', props.params.accountId, 'url']),
   isAccount: !!state.getIn(['accounts', props.params.accountId]),
   accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
   hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
@@ -26,6 +29,14 @@ const mapStateToProps = (state, props) => ({
   blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
 });
 
+const RemoteHint = ({ url }) => (
+  <TimelineHint url={url} resource={<FormattedMessage id='timeline_hint.resources.follows' defaultMessage='Follows' />} />
+);
+
+RemoteHint.propTypes = {
+  url: PropTypes.string.isRequired,
+};
+
 export default @connect(mapStateToProps)
 class Following extends ImmutablePureComponent {
 
@@ -38,6 +49,8 @@ class Following extends ImmutablePureComponent {
     isLoading: PropTypes.bool,
     blockedBy: PropTypes.bool,
     isAccount: PropTypes.bool,
+    remote: PropTypes.bool,
+    remoteUrl: PropTypes.string,
     multiColumn: PropTypes.bool,
   };
 
@@ -60,7 +73,7 @@ class Following extends ImmutablePureComponent {
   }, 300, { leading: true });
 
   render () {
-    const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading } = this.props;
+    const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn, isLoading, remote, remoteUrl } = this.props;
 
     if (!isAccount) {
       return (
@@ -78,7 +91,17 @@ class Following extends ImmutablePureComponent {
       );
     }
 
-    const emptyMessage = blockedBy ? <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' /> : <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
+    let emptyMessage;
+
+    if (blockedBy) {
+      emptyMessage = <FormattedMessage id='empty_column.account_unavailable' defaultMessage='Profile unavailable' />;
+    } else if (remote && accountIds.isEmpty()) {
+      emptyMessage = <RemoteHint url={remoteUrl} />;
+    } else {
+      emptyMessage = <FormattedMessage id='account.follows.empty' defaultMessage="This user doesn't follow anyone yet." />;
+    }
+
+    const remoteMessage = remote ? <RemoteHint url={remoteUrl} /> : null;
 
     return (
       <Column>
@@ -92,6 +115,7 @@ class Following extends ImmutablePureComponent {
           shouldUpdateScroll={shouldUpdateScroll}
           prepend={<HeaderContainer accountId={this.props.params.accountId} hideTabs />}
           alwaysPrepend
+          append={remoteMessage}
           emptyMessage={emptyMessage}
           bindToDocument={!multiColumn}
         >
diff --git a/app/javascript/mastodon/features/keyboard_shortcuts/index.js b/app/javascript/mastodon/features/keyboard_shortcuts/index.js
index 666baf621..d278d2b26 100644
--- a/app/javascript/mastodon/features/keyboard_shortcuts/index.js
+++ b/app/javascript/mastodon/features/keyboard_shortcuts/index.js
@@ -89,6 +89,10 @@ class KeyboardShortcuts extends ImmutablePureComponent {
                 <td><FormattedMessage id='keyboard_shortcuts.toot' defaultMessage='to start a brand new toot' /></td>
               </tr>
               <tr>
+                <td><kbd>alt</kbd>+<kbd>x</kbd></td>
+                <td><FormattedMessage id='keyboard_shortcuts.spoilers' defaultMessage='to show/hide CW field' /></td>
+              </tr>
+              <tr>
                 <td><kbd>backspace</kbd></td>
                 <td><FormattedMessage id='keyboard_shortcuts.back' defaultMessage='to navigate back' /></td>
               </tr>
diff --git a/app/javascript/mastodon/features/status/components/card.js b/app/javascript/mastodon/features/status/components/card.js
index b8344a667..630e99f2c 100644
--- a/app/javascript/mastodon/features/status/components/card.js
+++ b/app/javascript/mastodon/features/status/components/card.js
@@ -2,9 +2,13 @@ import React from 'react';
 import PropTypes from 'prop-types';
 import Immutable from 'immutable';
 import ImmutablePropTypes from 'react-immutable-proptypes';
+import { FormattedMessage } from 'react-intl';
 import punycode from 'punycode';
 import classnames from 'classnames';
 import Icon from 'mastodon/components/icon';
+import classNames from 'classnames';
+import { useBlurhash } from 'mastodon/initial_state';
+import { decode } from 'blurhash';
 
 const IDNA_PREFIX = 'xn--';
 
@@ -63,6 +67,7 @@ export default class Card extends React.PureComponent {
     compact: PropTypes.bool,
     defaultWidth: PropTypes.number,
     cacheWidth: PropTypes.func,
+    sensitive: PropTypes.bool,
   };
 
   static defaultProps = {
@@ -72,12 +77,44 @@ export default class Card extends React.PureComponent {
 
   state = {
     width: this.props.defaultWidth || 280,
+    previewLoaded: false,
     embedded: false,
+    revealed: !this.props.sensitive,
   };
 
   componentWillReceiveProps (nextProps) {
     if (!Immutable.is(this.props.card, nextProps.card)) {
-      this.setState({ embedded: false });
+      this.setState({ embedded: false, previewLoaded: false });
+    }
+    if (this.props.sensitive !== nextProps.sensitive) {
+      this.setState({ revealed: !nextProps.sensitive });
+    }
+  }
+
+  componentDidMount () {
+    if (this.props.card && this.props.card.get('blurhash')) {
+      this._decode();
+    }
+  }
+
+  componentDidUpdate (prevProps) {
+    const { card } = this.props;
+    if (card.get('blurhash') && (!prevProps.card || prevProps.card.get('blurhash') !== card.get('blurhash'))) {
+      this._decode();
+    }
+  }
+
+  _decode () {
+    if (!useBlurhash) return;
+
+    const hash   = this.props.card.get('blurhash');
+    const pixels = decode(hash, 32, 32);
+
+    if (pixels) {
+      const ctx       = this.canvas.getContext('2d');
+      const imageData = new ImageData(pixels, 32, 32);
+
+      ctx.putImageData(imageData, 0, 0);
     }
   }
 
@@ -119,6 +156,18 @@ export default class Card extends React.PureComponent {
     }
   }
 
+  setCanvasRef = c => {
+    this.canvas = c;
+  }
+
+  handleImageLoad = () => {
+    this.setState({ previewLoaded: true });
+  }
+
+  handleReveal = () => {
+    this.setState({ revealed: true });
+  }
+
   renderVideo () {
     const { card }  = this.props;
     const content   = { __html: addAutoPlay(card.get('html')) };
@@ -138,7 +187,7 @@ export default class Card extends React.PureComponent {
 
   render () {
     const { card, maxDescription, compact } = this.props;
-    const { width, embedded } = this.state;
+    const { width, embedded, revealed } = this.state;
 
     if (card === null) {
       return null;
@@ -153,7 +202,7 @@ export default class Card extends React.PureComponent {
     const height      = (compact && !embedded) ? (width / (16 / 9)) : (width / ratio);
 
     const description = (
-      <div className='status-card__content'>
+      <div className={classNames('status-card__content', { 'status-card__content--blurred': !revealed })}>
         {title}
         {!(horizontal || compact) && <p className='status-card__description'>{trim(card.get('description') || '', maxDescription)}</p>}
         <span className='status-card__host'>{provider}</span>
@@ -161,7 +210,18 @@ export default class Card extends React.PureComponent {
     );
 
     let embed     = '';
-    let thumbnail = <div style={{ backgroundImage: `url(${card.get('image')})`, width: horizontal ? width : null, height: horizontal ? height : null }} className='status-card__image-image' />;
+    let canvas = <canvas width={32} height={32} ref={this.setCanvasRef} className={classNames('status-card__image-preview', { 'status-card__image-preview--hidden' : revealed && this.state.previewLoaded })} />;
+    let thumbnail = <img src={card.get('image')} alt='' style={{ width: horizontal ? width : null, height: horizontal ? height : null, visibility: revealed ? null : 'hidden' }} onLoad={this.handleImageLoad} className='status-card__image-image' />;
+    let spoilerButton = (
+      <button type='button' onClick={this.handleReveal} className='spoiler-button__overlay'>
+        <span className='spoiler-button__overlay__label'><FormattedMessage id='status.sensitive_warning' defaultMessage='Sensitive content' /></span>
+      </button>
+    );
+    spoilerButton = (
+      <div className={classNames('spoiler-button', { 'spoiler-button--minified': revealed })}>
+        {spoilerButton}
+      </div>
+    );
 
     if (interactive) {
       if (embedded) {
@@ -175,14 +235,18 @@ export default class Card extends React.PureComponent {
 
         embed = (
           <div className='status-card__image'>
+            {canvas}
             {thumbnail}
 
-            <div className='status-card__actions'>
-              <div>
-                <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
-                {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+            {revealed && (
+              <div className='status-card__actions'>
+                <div>
+                  <button onClick={this.handleEmbedClick}><Icon id={iconVariant} /></button>
+                  {horizontal && <a href={card.get('url')} target='_blank' rel='noopener noreferrer'><Icon id='external-link' /></a>}
+                </div>
               </div>
-            </div>
+            )}
+            {!revealed && spoilerButton}
           </div>
         );
       }
@@ -196,13 +260,16 @@ export default class Card extends React.PureComponent {
     } else if (card.get('image')) {
       embed = (
         <div className='status-card__image'>
+          {canvas}
           {thumbnail}
+          {!revealed && spoilerButton}
         </div>
       );
     } else {
       embed = (
         <div className='status-card__image'>
           <Icon id='file-text' />
+          {!revealed && spoilerButton}
         </div>
       );
     }
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index 4201b237e..2ac47677e 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -153,7 +153,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
         );
       }
     } else if (status.get('spoiler_text').length === 0) {
-      media = <Card onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
+      media = <Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card', null)} />;
     }
 
     if (status.get('application')) {
diff --git a/app/javascript/mastodon/features/ui/components/compose_panel.js b/app/javascript/mastodon/features/ui/components/compose_panel.js
index c7821f473..3d0c48c7a 100644
--- a/app/javascript/mastodon/features/ui/components/compose_panel.js
+++ b/app/javascript/mastodon/features/ui/components/compose_panel.js
@@ -1,16 +1,36 @@
 import React from 'react';
+import { connect } from 'react-redux';
+import PropTypes from 'prop-types';
 import SearchContainer from 'mastodon/features/compose/containers/search_container';
 import ComposeFormContainer from 'mastodon/features/compose/containers/compose_form_container';
 import NavigationContainer from 'mastodon/features/compose/containers/navigation_container';
 import LinkFooter from './link_footer';
+import { changeComposing } from 'mastodon/actions/compose';
 
-const ComposePanel = () => (
-  <div className='compose-panel'>
-    <SearchContainer openInRoute />
-    <NavigationContainer />
-    <ComposeFormContainer singleColumn />
-    <LinkFooter withHotkeys />
-  </div>
-);
+export default @connect()
+class ComposePanel extends React.PureComponent {
 
-export default ComposePanel;
+  static propTypes = {
+    dispatch: PropTypes.func.isRequired,
+  };
+
+  onFocus = () => {
+    this.props.dispatch(changeComposing(true));
+  }
+
+  onBlur = () => {
+    this.props.dispatch(changeComposing(false));
+  }
+
+  render() {
+    return (
+      <div className='compose-panel' onFocus={this.onFocus}>
+        <SearchContainer openInRoute />
+        <NavigationContainer onClose={this.onBlur} />
+        <ComposeFormContainer singleColumn />
+        <LinkFooter withHotkeys />
+      </div>
+    );
+  }
+
+}
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 81ffad22e..553cb3365 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -10,7 +10,7 @@ import LoadingBarContainer from './containers/loading_bar_container';
 import ModalContainer from './containers/modal_container';
 import { isMobile } from '../../is_mobile';
 import { debounce } from 'lodash';
-import { uploadCompose, resetCompose } from '../../actions/compose';
+import { uploadCompose, resetCompose, changeComposeSpoilerness } from '../../actions/compose';
 import { expandHomeTimeline } from '../../actions/timelines';
 import { expandNotifications } from '../../actions/notifications';
 import { fetchFilters } from '../../actions/filters';
@@ -76,6 +76,7 @@ const keyMap = {
   new: 'n',
   search: 's',
   forceNew: 'option+n',
+  toggleComposeSpoilers: 'option+x',
   focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
   reply: 'r',
   favourite: 'f',
@@ -254,6 +255,7 @@ class UI extends React.PureComponent {
     dispatch(synchronouslySubmitMarkers());
 
     if (isComposing && (hasComposingText || hasMediaAttachments)) {
+      e.preventDefault();
       // Setting returnValue to any string causes confirmation dialog.
       // Many browsers no longer display this text to users,
       // but we set user-friendly message for other browsers, e.g. Edge.
@@ -374,7 +376,7 @@ class UI extends React.PureComponent {
 
   componentDidMount () {
     this.hotkeys.__mousetrap__.stopCallback = (e, element) => {
-      return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName);
+      return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName) && !e.altKey;
     };
   }
 
@@ -419,6 +421,11 @@ class UI extends React.PureComponent {
     this.props.dispatch(resetCompose());
   }
 
+  handleHotkeyToggleComposeSpoilers = e => {
+    e.preventDefault();
+    this.props.dispatch(changeComposeSpoilerness());
+  }
+
   handleHotkeyFocusColumn = e => {
     const index  = (e.key * 1) + 1; // First child is drawer, skip that
     const column = this.node.querySelector(`.column:nth-child(${index})`);
@@ -514,6 +521,7 @@ class UI extends React.PureComponent {
       new: this.handleHotkeyNew,
       search: this.handleHotkeySearch,
       forceNew: this.handleHotkeyForceNew,
+      toggleComposeSpoilers: this.handleHotkeyToggleComposeSpoilers,
       focusColumn: this.handleHotkeyFocusColumn,
       back: this.handleHotkeyBack,
       goToHome: this.handleHotkeyGoToHome,
diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json
index 70868e397..e1871b31a 100644
--- a/app/javascript/mastodon/locales/ar.json
+++ b/app/javascript/mastodon/locales/ar.json
@@ -5,6 +5,7 @@
   "account.block": "حظر @{name}",
   "account.block_domain": "إخفاء كل شيء قادم من اسم النطاق {domain}",
   "account.blocked": "محظور",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "إلغاء طلب المتابَعة",
   "account.direct": "رسالة خاصة إلى @{name}",
   "account.domain_blocked": "النطاق مخفي",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "للردّ",
   "keyboard_shortcuts.requests": "لفتح قائمة طلبات المتابعة",
   "keyboard_shortcuts.search": "للتركيز على البحث",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "لفتح عمود \"هيا نبدأ\"",
   "keyboard_shortcuts.toggle_hidden": "لعرض أو إخفاء النص مِن وراء التحذير",
   "keyboard_shortcuts.toggle_sensitivity": "لعرض/إخفاء الوسائط",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# دقيقة} other {# دقائق}} متبقية",
   "time_remaining.moments": "لحظات متبقية",
   "time_remaining.seconds": "{number, plural, one {# ثانية} other {# ثوانٍ}} متبقية",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, zero {} one {شخص واحد} two {شخصين} few {أشخاص} many {أشخاص} other {أشخاص}} تتحدّث",
   "trends.trending_now": "المتداولة الآن",
   "ui.beforeunload": "سوف تفقد مسودتك إن تركت ماستدون.",
diff --git a/app/javascript/mastodon/locales/ast.json b/app/javascript/mastodon/locales/ast.json
index 6c53e33db..3989978a0 100644
--- a/app/javascript/mastodon/locales/ast.json
+++ b/app/javascript/mastodon/locales/ast.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquiar a @{name}",
   "account.block_domain": "Anubrir tolo de {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Encaboxar la solicitú de siguimientu",
   "account.direct": "Unviar un mensaxe direutu a @{name}",
   "account.domain_blocked": "Dominiu anubríu",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "pa responder",
   "keyboard_shortcuts.requests": "p'abrir la llista de solicitúes de siguimientu",
   "keyboard_shortcuts.search": "pa enfocar la gueta",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "p'abrir la columna «entamar»",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minutu restante} other {# minutos restantes}}",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# segundu restante} other {# segundos restantes}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {persones}} falando",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "El borrador va perdese si coles de Mastodon.",
diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json
index b571d8c0e..e8bf05b13 100644
--- a/app/javascript/mastodon/locales/bg.json
+++ b/app/javascript/mastodon/locales/bg.json
@@ -5,6 +5,7 @@
   "account.block": "Блокирай",
   "account.block_domain": "скрий всичко от (домейн)",
   "account.blocked": "Блокирани",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Откажи искането за следване",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Скрит домейн",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/bn.json b/app/javascript/mastodon/locales/bn.json
index 20a64b7e3..7f27f58f2 100644
--- a/app/javascript/mastodon/locales/bn.json
+++ b/app/javascript/mastodon/locales/bn.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} কে ব্লক করুন",
   "account.block_domain": "{domain} থেকে সব আড়াল করুন",
   "account.blocked": "অবরুদ্ধ",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "অনুসরণ অনুরোধ বাতিল করুন",
   "account.direct": "@{name} কে সরাসরি বার্তা",
   "account.domain_blocked": "ডোমেন গোপন করুন",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "মতামত দিতে",
   "keyboard_shortcuts.requests": "অনুসরণ অনুরোধের তালিকা দেখতে",
   "keyboard_shortcuts.search": "খোঁজার অংশে ফোকাস করতে",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"প্রথম শুরুর\" কলাম বের করতে",
   "keyboard_shortcuts.toggle_hidden": "CW লেখা দেখতে বা লুকাতে",
   "keyboard_shortcuts.toggle_sensitivity": "ভিডিও/ছবি দেখতে বা বন্ধ করতে",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# মিনিট} other {# মিনিট}} বাকি আছে",
   "time_remaining.moments": "সময় বাকি আছে",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} বাকি আছে",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} কথা বলছে",
   "trends.trending_now": "বর্তমানে জনপ্রিয়",
   "ui.beforeunload": "যে পর্যন্ত এটা লেখা হয়েছে, মাস্টাডন থেকে চলে গেলে এটা মুছে যাবে।",
diff --git a/app/javascript/mastodon/locales/br.json b/app/javascript/mastodon/locales/br.json
index 5bf8cdb1c..ae7283573 100644
--- a/app/javascript/mastodon/locales/br.json
+++ b/app/javascript/mastodon/locales/br.json
@@ -5,6 +5,7 @@
   "account.block": "Berzañ @{name}",
   "account.block_domain": "Berzañ pep tra eus {domain}",
   "account.blocked": "Stanket",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Nullañ ar bedadenn heuliañ",
   "account.direct": "Kas ur gemennadenn da @{name}",
   "account.domain_blocked": "Domani berzet",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "da respont",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Luskad ar mare",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json
index 00965f153..d5e5ce565 100644
--- a/app/javascript/mastodon/locales/ca.json
+++ b/app/javascript/mastodon/locales/ca.json
@@ -5,6 +5,7 @@
   "account.block": "Bloqueja @{name}",
   "account.block_domain": "Amaga-ho tot de {domain}",
   "account.blocked": "Bloquejat",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Anul·la la sol·licitud de seguiment",
   "account.direct": "Missatge directe @{name}",
   "account.domain_blocked": "Domini ocult",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "respondre",
   "keyboard_shortcuts.requests": "per a obrir la llista de sol·licituds de seguiment",
   "keyboard_shortcuts.search": "per a centrar la cerca",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "per a obrir la columna \"Començar\"",
   "keyboard_shortcuts.toggle_hidden": "per a mostrar o amagar text sota CW",
   "keyboard_shortcuts.toggle_sensitivity": "per a mostrar o amagar contingut multimèdia",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minut} other {# minuts}} restants",
   "time_remaining.moments": "Moments restants",
   "time_remaining.seconds": "{number, plural, one {# segon} other {# segons}} restants",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {persones}} parlant-hi",
   "trends.trending_now": "Ara en tendència",
   "ui.beforeunload": "El teu esborrany es perdrà si surts de Mastodon.",
diff --git a/app/javascript/mastodon/locales/co.json b/app/javascript/mastodon/locales/co.json
index 2e8b8e1a4..76b4abd50 100644
--- a/app/javascript/mastodon/locales/co.json
+++ b/app/javascript/mastodon/locales/co.json
@@ -5,6 +5,7 @@
   "account.block": "Bluccà @{name}",
   "account.block_domain": "Piattà u duminiu {domain}",
   "account.blocked": "Bluccatu",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annullà a dumanda d'abbunamentu",
   "account.direct": "Missaghju direttu @{name}",
   "account.domain_blocked": "Duminiu piattatu",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "risponde",
   "keyboard_shortcuts.requests": "per apre a lista di dumande d'abbunamentu",
   "keyboard_shortcuts.search": "fucalizà nant'à l'area di circata",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "per apre a culonna \"per principià\"",
   "keyboard_shortcuts.toggle_hidden": "vede/piattà u testu daretu à l'avertimentu CW",
   "keyboard_shortcuts.toggle_sensitivity": "vede/piattà i media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuta ferma} other {# minute fermanu}} left",
   "time_remaining.moments": "Ci fermanu qualchi mumentu",
   "time_remaining.seconds": "{number, plural, one {# siconda ferma} other {# siconde fermanu}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} parlanu",
   "trends.trending_now": "Tindenze d'avà",
   "ui.beforeunload": "A bruttacopia sarà persa s'ellu hè chjosu Mastodon.",
diff --git a/app/javascript/mastodon/locales/cs.json b/app/javascript/mastodon/locales/cs.json
index 3c51b7f9c..0b092a9c7 100644
--- a/app/javascript/mastodon/locales/cs.json
+++ b/app/javascript/mastodon/locales/cs.json
@@ -5,6 +5,7 @@
   "account.block": "Zablokovat uživatele @{name}",
   "account.block_domain": "Skrýt vše ze serveru {domain}",
   "account.blocked": "Blokováno",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Zrušit žádost o sledování",
   "account.direct": "Poslat uživateli @{name} přímou zprávu",
   "account.domain_blocked": "Doména skryta",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "odpovědět",
   "keyboard_shortcuts.requests": "otevření seznamu požadavků o sledování",
   "keyboard_shortcuts.search": "zaměření na hledání",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "otevření sloupce „začínáme“",
   "keyboard_shortcuts.toggle_hidden": "zobrazení/skrytí textu za varováním o obsahu",
   "keyboard_shortcuts.toggle_sensitivity": "zobrazení/skrytí médií",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {Zbývá # minuta} few {Zbývají # minuty} many {Zbývá # minut} other {Zbývá # minut}}",
   "time_remaining.moments": "Zbývá několik sekund",
   "time_remaining.seconds": "{number, plural, one {Zbývá # sekunda} few {Zbývají # sekundy} many {Zbývá # sekund} other {Zbývá # sekund}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {člověk} few {lidé} many {lidí} other {lidí}} hovoří",
   "trends.trending_now": "Aktuální trendy",
   "ui.beforeunload": "Pokud Mastodon opustíte, váš koncept se ztratí.",
diff --git a/app/javascript/mastodon/locales/cy.json b/app/javascript/mastodon/locales/cy.json
index d8b8b56f4..0dbc91b8d 100644
--- a/app/javascript/mastodon/locales/cy.json
+++ b/app/javascript/mastodon/locales/cy.json
@@ -5,6 +5,7 @@
   "account.block": "Blocio @{name}",
   "account.block_domain": "Cuddio popeth rhag {domain}",
   "account.blocked": "Blociwyd",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Canslo cais dilyn",
   "account.direct": "Neges breifat @{name}",
   "account.domain_blocked": "Parth wedi ei guddio",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "i ateb",
   "keyboard_shortcuts.requests": "i agor rhestr ceisiadau dilyn",
   "keyboard_shortcuts.search": "i ffocysu chwilio",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "i agor colofn \"dechrau arni\"",
   "keyboard_shortcuts.toggle_hidden": "i ddangos/cuddio testun tu ôl i CW",
   "keyboard_shortcuts.toggle_sensitivity": "i ddangos/gyddio cyfryngau",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# funud} other {# o funudau}} ar ôl",
   "time_remaining.moments": "Munudau ar ôl",
   "time_remaining.seconds": "{number, plural, one {# eiliad} other {# o eiliadau}} ar ôl",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} yn siarad",
   "trends.trending_now": "Yn tueddu nawr",
   "ui.beforeunload": "Mi fyddwch yn colli eich drafft os gadewch Mastodon.",
diff --git a/app/javascript/mastodon/locales/da.json b/app/javascript/mastodon/locales/da.json
index d93a73dee..5fb6ea4d7 100644
--- a/app/javascript/mastodon/locales/da.json
+++ b/app/javascript/mastodon/locales/da.json
@@ -5,6 +5,7 @@
   "account.block": "Bloker @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokeret",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annullér følgeranmodning",
   "account.direct": "Send en direkte besked til @{name}",
   "account.domain_blocked": "Domænet er blevet skjult",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "for at svare",
   "keyboard_shortcuts.requests": "for at åbne listen over følgeranmodninger",
   "keyboard_shortcuts.search": "for at fokusere søgningen",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "for at åbne \"kom igen\" kolonnen",
   "keyboard_shortcuts.toggle_hidden": "for at vise/skjule tekst bag CW",
   "keyboard_shortcuts.toggle_sensitivity": "for at vise/skjule medier",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minut} other {# minutter}} tilbage",
   "time_remaining.moments": "Få øjeblikke tilbage",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} tilbage",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {personer}} snakker",
   "trends.trending_now": "Hot lige nu",
   "ui.beforeunload": "Din kladde vil gå tabt hvis du forlader Mastodon.",
diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json
index 35bc3025b..5220772cd 100644
--- a/app/javascript/mastodon/locales/de.json
+++ b/app/javascript/mastodon/locales/de.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} blockieren",
   "account.block_domain": "Alles von {domain} blockieren",
   "account.blocked": "Blockiert",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Folgeanfrage abbrechen",
   "account.direct": "Direktnachricht an @{name}",
   "account.domain_blocked": "Domain versteckt",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "antworten",
   "keyboard_shortcuts.requests": "Liste der Folge-Anfragen öffnen",
   "keyboard_shortcuts.search": "Suche fokussieren",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"Erste Schritte\"-Spalte öffnen",
   "keyboard_shortcuts.toggle_hidden": "Text hinter einer Inhaltswarnung verstecken/anzeigen",
   "keyboard_shortcuts.toggle_sensitivity": "Medien hinter einer Inhaltswarnung verstecken/anzeigen",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# Minute} other {# Minuten}} verbleibend",
   "time_remaining.moments": "Schließt in Kürze",
   "time_remaining.seconds": "{number, plural, one {# Sekunde} other {# Sekunden}} verbleibend",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, eine {Person} other {Personen}} reden darüber",
   "trends.trending_now": "In den Trends",
   "ui.beforeunload": "Dein Entwurf geht verloren, wenn du Mastodon verlässt.",
diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json
index 7bd4a274c..1d280d710 100644
--- a/app/javascript/mastodon/locales/defaultMessages.json
+++ b/app/javascript/mastodon/locales/defaultMessages.json
@@ -510,6 +510,19 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "{resource} from other servers are not displayed.",
+        "id": "timeline_hint.remote_resource_not_displayed"
+      },
+      {
+        "defaultMessage": "Browse more on the original profile",
+        "id": "account.browse_more_on_origin_server"
+      }
+    ],
+    "path": "app/javascript/mastodon/components/timeline_hint.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Unfollow",
         "id": "confirmations.unfollow.confirm"
       },
@@ -620,6 +633,10 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Older toots",
+        "id": "timeline_hint.resources.statuses"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -1543,6 +1560,10 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Followers",
+        "id": "timeline_hint.resources.followers"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -1556,6 +1577,10 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Follows",
+        "id": "timeline_hint.resources.follows"
+      },
+      {
         "defaultMessage": "Profile unavailable",
         "id": "empty_column.account_unavailable"
       },
@@ -1921,6 +1946,10 @@
         "id": "keyboard_shortcuts.toot"
       },
       {
+        "defaultMessage": "to show/hide CW field",
+        "id": "keyboard_shortcuts.spoilers"
+      },
+      {
         "defaultMessage": "to navigate back",
         "id": "keyboard_shortcuts.back"
       },
@@ -2430,6 +2459,15 @@
   {
     "descriptors": [
       {
+        "defaultMessage": "Sensitive content",
+        "id": "status.sensitive_warning"
+      }
+    ],
+    "path": "app/javascript/mastodon/features/status/components/card.json"
+  },
+  {
+    "descriptors": [
+      {
         "defaultMessage": "Delete",
         "id": "confirmations.delete.confirm"
       },
@@ -2982,4 +3020,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 202c91f90..31d289207 100644
--- a/app/javascript/mastodon/locales/el.json
+++ b/app/javascript/mastodon/locales/el.json
@@ -5,6 +5,7 @@
   "account.block": "Αποκλεισμός @{name}",
   "account.block_domain": "Απόκρυψη όλων από {domain}",
   "account.blocked": "Αποκλεισμένος/η",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Ακύρωση αιτήματος παρακολούθησης",
   "account.direct": "Προσωπικό μήνυμα προς @{name}",
   "account.domain_blocked": "Κρυμμένος τομέας",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "απάντηση",
   "keyboard_shortcuts.requests": "άνοιγμα λίστας αιτημάτων παρακολούθησης",
   "keyboard_shortcuts.search": "εστίαση αναζήτησης",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "άνοιγμα κολώνας \"Ξεκινώντας\"",
   "keyboard_shortcuts.toggle_hidden": "εμφάνιση/απόκρυψη κειμένου πίσω από την προειδοποίηση",
   "keyboard_shortcuts.toggle_sensitivity": "εμφάνιση/απόκρυψη πολυμέσων",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "απομένουν {number, plural, one {# λεπτό} other {# λεπτά}}",
   "time_remaining.moments": "Απομένουν στιγμές",
   "time_remaining.seconds": "απομένουν {number, plural, one {# δευτερόλεπτο} other {# δευτερόλεπτα}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {άτομο μιλάει} other {άτομα μιλάνε}}",
   "trends.trending_now": "Δημοφιλή τώρα",
   "ui.beforeunload": "Το προσχέδιό σου θα χαθεί αν φύγεις από το Mastodon.",
diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json
index 225126e6f..1779f4713 100644
--- a/app/javascript/mastodon/locales/en.json
+++ b/app/javascript/mastodon/locales/en.json
@@ -5,6 +5,7 @@
   "account.block": "Block @{name}",
   "account.block_domain": "Block domain {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
   "account.domain_blocked": "Domain blocked",
@@ -106,7 +107,7 @@
   "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.message": "Are you sure you want to delete this toot?",
   "confirmations.delete_list.confirm": "Delete",
   "confirmations.delete_list.message": "Are you sure you want to permanently delete this list?",
   "confirmations.domain_block.confirm": "Block entire domain",
@@ -117,7 +118,7 @@
   "confirmations.mute.explanation": "This will hide posts from them and posts mentioning them, but it will still allow them to see your posts and follow you.",
   "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.redraft.message": "Are you sure you want to delete this toot 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",
@@ -130,7 +131,7 @@
   "directory.local": "From {domain} only",
   "directory.new_arrivals": "New arrivals",
   "directory.recently_active": "Recently active",
-  "embed.instructions": "Embed this status on your website by copying the code below.",
+  "embed.instructions": "Embed this toot 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",
@@ -159,7 +160,7 @@
   "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.list": "There is nothing in this list yet. When members of this list post new toots, 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.",
@@ -216,12 +217,12 @@
   "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.column": "to focus a toot 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.enter": "to open toot",
   "keyboard_shortcuts.favourite": "to favourite",
   "keyboard_shortcuts.favourites": "to open favourites list",
   "keyboard_shortcuts.federated": "to open federated timeline",
@@ -240,6 +241,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -289,13 +291,13 @@
   "navigation_bar.preferences": "Preferences",
   "navigation_bar.public_timeline": "Federated timeline",
   "navigation_bar.security": "Security",
-  "notification.favourite": "{name} favourited your status",
+  "notification.favourite": "{name} favourited your toot",
   "notification.follow": "{name} followed you",
   "notification.follow_request": "{name} has requested to follow you",
   "notification.mention": "{name} mentioned you",
   "notification.own_poll": "Your poll has ended",
   "notification.poll": "A poll you have voted in has ended",
-  "notification.reblog": "{name} boosted your status",
+  "notification.reblog": "{name} boosted your toot",
   "notifications.clear": "Clear notifications",
   "notifications.clear_confirmation": "Are you sure you want to permanently clear all your notifications?",
   "notifications.column_settings.alert": "Desktop notifications",
@@ -326,7 +328,7 @@
   "poll.voted": "You voted for this answer",
   "poll_button.add_poll": "Add a poll",
   "poll_button.remove_poll": "Remove poll",
-  "privacy.change": "Adjust status privacy",
+  "privacy.change": "Adjust toot privacy",
   "privacy.direct.long": "Visible for mentioned users only",
   "privacy.direct.short": "Direct",
   "privacy.private.long": "Visible for followers only",
@@ -353,9 +355,9 @@
   "report.target": "Reporting {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.full_text": "Simple text returns toots 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.status": "toot",
   "search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
   "search_popout.tips.user": "user",
   "search_results.accounts": "People",
@@ -364,12 +366,12 @@
   "search_results.statuses_fts_disabled": "Searching toots by their content is not enabled on this Mastodon server.",
   "search_results.total": "{count, number} {count, plural, one {result} other {results}}",
   "status.admin_account": "Open moderation interface for @{name}",
-  "status.admin_status": "Open this status in the moderation interface",
+  "status.admin_status": "Open this toot in the moderation interface",
   "status.block": "Block @{name}",
   "status.bookmark": "Bookmark",
   "status.cancel_reblog_private": "Unboost",
   "status.cannot_reblog": "This post cannot be boosted",
-  "status.copy": "Copy link to status",
+  "status.copy": "Copy link to toot",
   "status.delete": "Delete",
   "status.detailed_status": "Detailed conversation view",
   "status.direct": "Direct message @{name}",
@@ -382,7 +384,7 @@
   "status.more": "More",
   "status.mute": "Mute @{name}",
   "status.mute_conversation": "Mute conversation",
-  "status.open": "Expand this status",
+  "status.open": "Expand this toot",
   "status.pin": "Pin on profile",
   "status.pinned": "Pinned toot",
   "status.read_more": "Read more",
@@ -417,6 +419,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json
index e476538be..fff7508ae 100644
--- a/app/javascript/mastodon/locales/eo.json
+++ b/app/javascript/mastodon/locales/eo.json
@@ -5,6 +5,7 @@
   "account.block": "Bloki @{name}",
   "account.block_domain": "Kaŝi ĉion de {domain}",
   "account.blocked": "Blokita",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Nuligi peton de sekvado",
   "account.direct": "Rekte mesaĝi @{name}",
   "account.domain_blocked": "Domajno kaŝita",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "respondi",
   "keyboard_shortcuts.requests": "malfermi la liston de petoj de sekvado",
   "keyboard_shortcuts.search": "enfokusigi la serĉilon",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "malfermi la kolumnon «por komenci»",
   "keyboard_shortcuts.toggle_hidden": "montri/kaŝi tekston malantaŭ enhava averto",
   "keyboard_shortcuts.toggle_sensitivity": "montri/kaŝi aŭdovidaĵojn",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutoj}} restas",
   "time_remaining.moments": "Momenteto restas",
   "time_remaining.seconds": "{number, plural, one {# sekundo} other {# sekundoj}} restas",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persono} other {personoj}} parolas",
   "trends.trending_now": "Nunaj furoraĵoj",
   "ui.beforeunload": "Via malneto perdiĝos se vi eliras de Mastodon.",
diff --git a/app/javascript/mastodon/locales/es-AR.json b/app/javascript/mastodon/locales/es-AR.json
index 15ef9afa9..a5ccea076 100644
--- a/app/javascript/mastodon/locales/es-AR.json
+++ b/app/javascript/mastodon/locales/es-AR.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquear a @{name}",
   "account.block_domain": "Ocultar todo de {domain}",
   "account.blocked": "Bloqueado",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
   "account.direct": "Mensaje directo a @{name}",
   "account.domain_blocked": "Dominio oculto",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir la lista de solicitudes de seguimiento",
   "keyboard_shortcuts.search": "para enfocar la búsqueda",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "para abrir la columna \"Introducción\"",
   "keyboard_shortcuts.toggle_hidden": "para mostrar/ocultar el texto detrás de la advertencia de contenido",
   "keyboard_shortcuts.toggle_sensitivity": "para mostrar/ocultar los medios",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural,one {queda # minuto} other {quedan # minutos}}",
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{number, plural,one {queda # segundo} other {quedan # segundos}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
   "trends.trending_now": "Tendencia ahora",
   "ui.beforeunload": "Tu borrador se perderá si abandonás Mastodon.",
diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json
index e8767cd35..a3a7a110d 100644
--- a/app/javascript/mastodon/locales/es.json
+++ b/app/javascript/mastodon/locales/es.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquear a @{name}",
   "account.block_domain": "Ocultar todo de {domain}",
   "account.blocked": "Bloqueado",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancelar la solicitud de seguimiento",
   "account.direct": "Mensaje directo a @{name}",
   "account.domain_blocked": "Dominio oculto",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "abrir la lista de peticiones de seguidores",
   "keyboard_shortcuts.search": "para poner el foco en la búsqueda",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "abrir la columna \"comenzar\"",
   "keyboard_shortcuts.toggle_hidden": "mostrar/ocultar texto tras aviso de contenido (CW)",
   "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar medios",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}",
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona} other {personas}} hablando",
   "trends.trending_now": "Tendencia ahora",
   "ui.beforeunload": "Tu borrador se perderá si sales de Mastodon.",
diff --git a/app/javascript/mastodon/locales/et.json b/app/javascript/mastodon/locales/et.json
index be3ee148b..bedba181d 100644
--- a/app/javascript/mastodon/locales/et.json
+++ b/app/javascript/mastodon/locales/et.json
@@ -5,6 +5,7 @@
   "account.block": "Blokeeri @{name}",
   "account.block_domain": "Peida kõik domeenist {domain}",
   "account.blocked": "Blokeeritud",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Tühista jälgimistaotlus",
   "account.direct": "Otsesõnum @{name}",
   "account.domain_blocked": "Domeen peidetud",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "vastamiseks",
   "keyboard_shortcuts.requests": "avamaks jälgimistaotluste nimistut",
   "keyboard_shortcuts.search": "otsingu fokuseerimiseks",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "avamaks \"Alusta\" tulpa",
   "keyboard_shortcuts.toggle_hidden": "näitamaks/peitmaks teksti CW taga",
   "keyboard_shortcuts.toggle_sensitivity": "et peita/näidata meediat",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minut} other {# minutit}} left",
   "time_remaining.moments": "Hetked jäänud",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekundit}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {inimene} other {inimesed}} talking",
   "trends.trending_now": "Praegu populaarne",
   "ui.beforeunload": "Teie mustand läheb kaotsi, kui lahkute Mastodonist.",
diff --git a/app/javascript/mastodon/locales/eu.json b/app/javascript/mastodon/locales/eu.json
index 7f777eeaf..f9bd3e090 100644
--- a/app/javascript/mastodon/locales/eu.json
+++ b/app/javascript/mastodon/locales/eu.json
@@ -5,6 +5,7 @@
   "account.block": "Blokeatu @{name}",
   "account.block_domain": "Ezkutatu {domain} domeinuko guztia",
   "account.blocked": "Blokeatuta",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Ezeztatu jarraitzeko eskaria",
   "account.direct": "Mezu zuzena @{name}(r)i",
   "account.domain_blocked": "Ezkutatutako domeinua",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "erantzutea",
   "keyboard_shortcuts.requests": "jarraitzeko eskarien zerrenda irekitzeko",
   "keyboard_shortcuts.search": "bilaketan fokua jartzea",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"Menua\" zutabea irekitzeko",
   "keyboard_shortcuts.toggle_hidden": "testua erakustea/ezkutatzea abisu baten atzean",
   "keyboard_shortcuts.toggle_sensitivity": "multimedia erakutsi/ezkutatzeko",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {minutu #} other {# minutu}} amaitzeko",
   "time_remaining.moments": "Amaitzekotan",
   "time_remaining.seconds": "{number, plural, one {segundo #} other {# segundo}} amaitzeko",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {pertsona} other {pertsona}} hitz egiten",
   "trends.trending_now": "Joera orain",
   "ui.beforeunload": "Zure zirriborroa galduko da Mastodon uzten baduzu.",
diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json
index 7eca45e42..714e8a30d 100644
--- a/app/javascript/mastodon/locales/fa.json
+++ b/app/javascript/mastodon/locales/fa.json
@@ -5,6 +5,7 @@
   "account.block": "مسدودسازی @{name}",
   "account.block_domain": "نهفتن همه چیز از {domain}",
   "account.blocked": "مسدود",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "لغو درخواست پیگیری",
   "account.direct": "پیام خصوصی به @{name}",
   "account.domain_blocked": "دامنهٔ نهفته",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "برای پاسخ",
   "keyboard_shortcuts.requests": "برای گشودن فهرست درخواست‌های پیگیری",
   "keyboard_shortcuts.search": "برای تمرکز روی جستجو",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "برای گشودن ستون «آغاز کنید»",
   "keyboard_shortcuts.toggle_hidden": "برای نمایش/نهفتن نوشتهٔ پشت هشدار محتوا",
   "keyboard_shortcuts.toggle_sensitivity": "برای نمایش/نهفتن رسانه",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# دقیقه} other {# دقیقه}} باقی مانده",
   "time_remaining.moments": "زمان باقی‌مانده",
   "time_remaining.seconds": "{number, plural, one {# ثانیه} other {# ثانیه}} باقی مانده",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {نفر نوشته است} other {نفر نوشته‌اند}}",
   "trends.trending_now": "پرطرفدار",
   "ui.beforeunload": "اگر از ماستودون خارج شوید پیش‌نویس شما از دست خواهد رفت.",
diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json
index 3b7b4e909..3ff7a3cb1 100644
--- a/app/javascript/mastodon/locales/fi.json
+++ b/app/javascript/mastodon/locales/fi.json
@@ -5,6 +5,7 @@
   "account.block": "Estä @{name}",
   "account.block_domain": "Piilota kaikki sisältö verkkotunnuksesta {domain}",
   "account.blocked": "Estetty",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Peruuta seurauspyyntö",
   "account.direct": "Viesti käyttäjälle @{name}",
   "account.domain_blocked": "Verkko-osoite piilotettu",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "vastaa",
   "keyboard_shortcuts.requests": "avaa lista seurauspyynnöistä",
   "keyboard_shortcuts.search": "siirry hakukenttään",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "avaa \"Aloitus\" -sarake",
   "keyboard_shortcuts.toggle_hidden": "näytä/piilota sisältövaroituksella merkitty teksti",
   "keyboard_shortcuts.toggle_sensitivity": "näytä/piilota media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuutti} other {# minuuttia}} jäljellä",
   "time_remaining.moments": "Hetki jäljellä",
   "time_remaining.seconds": "{number, plural, one {# sekunti} other {# sekuntia}} jäljellä",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {henkilö} other {henkilöä}} keskustelee",
   "trends.trending_now": "Suosittua nyt",
   "ui.beforeunload": "Luonnos häviää, jos poistut Mastodonista.",
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index 5e03386f6..fe98a8e97 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquer @{name}",
   "account.block_domain": "Bloquer le domaine {domain}",
   "account.blocked": "Bloqué·e",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annuler la demande de suivi",
   "account.direct": "Envoyer un message direct à @{name}",
   "account.domain_blocked": "Domaine bloqué",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "répondre",
   "keyboard_shortcuts.requests": "ouvrir la liste de demandes d’abonnement",
   "keyboard_shortcuts.search": "cibler la zone de recherche",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "ouvrir la colonne « Pour commencer »",
   "keyboard_shortcuts.toggle_hidden": "déplier/replier le texte derrière un CW",
   "keyboard_shortcuts.toggle_sensitivity": "afficher/cacher les médias",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} restantes",
   "time_remaining.moments": "Encore quelques instants",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} restantes",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {personne discute} other {personnes discutent}}",
   "trends.trending_now": "Tendance en ce moment",
   "ui.beforeunload": "Votre brouillon sera perdu si vous quittez Mastodon.",
diff --git a/app/javascript/mastodon/locales/ga.json b/app/javascript/mastodon/locales/ga.json
index 81a1fbae0..19054f716 100644
--- a/app/javascript/mastodon/locales/ga.json
+++ b/app/javascript/mastodon/locales/ga.json
@@ -5,6 +5,7 @@
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json
index 73a3b744e..c3140182c 100644
--- a/app/javascript/mastodon/locales/gl.json
+++ b/app/javascript/mastodon/locales/gl.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Agochar todo de {domain}",
   "account.blocked": "Bloqueada",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Desbotar solicitude de seguimento",
   "account.direct": "Mensaxe directa @{name}",
   "account.domain_blocked": "Dominio agochado",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir a listaxe das peticións de seguimento",
   "keyboard_shortcuts.search": "para destacar a procura",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "para abrir a columna dos \"primeiros pasos\"",
   "keyboard_shortcuts.toggle_hidden": "para amosar/agochar texto detrás do aviso de contido (AC)",
   "keyboard_shortcuts.toggle_sensitivity": "para amosar/agochar contido multimedia",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuto} other {# minutos}} restantes",
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{number, plural, one {# segundo} other {# segundos}} restantes",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persoa} other {persoas}} falando",
   "trends.trending_now": "Tendencias actuais",
   "ui.beforeunload": "O borrador perderase se saes de Mastodon.",
diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json
index 02fddcc72..4b65cd967 100644
--- a/app/javascript/mastodon/locales/he.json
+++ b/app/javascript/mastodon/locales/he.json
@@ -5,6 +5,7 @@
   "account.block": "חסימת @{name}",
   "account.block_domain": "להסתיר הכל מהקהילה {domain}",
   "account.blocked": "חסום",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "בטל בקשת מעקב",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "הדומיין חסוי",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "לענות",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "להתמקד בחלון החיפוש",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "הטיוטא תאבד אם תעזבו את מסטודון.",
diff --git a/app/javascript/mastodon/locales/hi.json b/app/javascript/mastodon/locales/hi.json
index 438c84610..e26b607bb 100644
--- a/app/javascript/mastodon/locales/hi.json
+++ b/app/javascript/mastodon/locales/hi.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} को ब्लॉक करें",
   "account.block_domain": "{domain} के सारी चीज़े छुपाएं",
   "account.blocked": "ब्लॉक",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "फ़ॉलो रिक्वेस्ट रद्द करें",
   "account.direct": "प्रत्यक्ष संदेश @{name}",
   "account.domain_blocked": "छिपा हुआ डोमेन",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "जवाब के लिए",
   "keyboard_shortcuts.requests": "फॉलो रिक्वेस्ट लिस्ट खोलने के लिए",
   "keyboard_shortcuts.search": "गहरी खोज के लिए",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json
index 10daf96f3..f12450d7b 100644
--- a/app/javascript/mastodon/locales/hr.json
+++ b/app/javascript/mastodon/locales/hr.json
@@ -5,6 +5,7 @@
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Sakrij sve sa {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json
index 241f074a6..eb824f4ae 100644
--- a/app/javascript/mastodon/locales/hu.json
+++ b/app/javascript/mastodon/locales/hu.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} letiltása",
   "account.block_domain": "Minden elrejtése innen: {domain}",
   "account.blocked": "Letiltva",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Követési kérelem törlése",
   "account.direct": "Közvetlen üzenet @{name} számára",
   "account.domain_blocked": "Rejtett domain",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "válasz",
   "keyboard_shortcuts.requests": "követési kérések listájának megnyitása",
   "keyboard_shortcuts.search": "fókuszálás a keresőre",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"Első lépések\" megnyitása",
   "keyboard_shortcuts.toggle_hidden": "tartalmi figyelmeztetéssel ellátott szöveg mutatása/elrejtése",
   "keyboard_shortcuts.toggle_sensitivity": "média mutatása/elrejtése",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# perc} other {# perc}} van hátra",
   "time_remaining.moments": "Pillanatok vannak hátra",
   "time_remaining.seconds": "{number, plural, one {# másodperc} other {# másodperc}} van hátra",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {résztvevő} other {résztvevő}} beszélget",
   "trends.trending_now": "Most felkapott",
   "ui.beforeunload": "A piszkozatod el fog veszni, ha elhagyod a Mastodont.",
diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json
index 1cdccd601..5520f7041 100644
--- a/app/javascript/mastodon/locales/hy.json
+++ b/app/javascript/mastodon/locales/hy.json
@@ -5,6 +5,7 @@
   "account.block": "Արգելափակել @{name}֊ին",
   "account.block_domain": "Թաքցնել ամէնը հետեւեալ տիրոյթից՝ {domain}",
   "account.blocked": "Արգելափակուած է",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "չեղարկել հետեւելու հայցը",
   "account.direct": "Նամակ գրել @{name} -ին",
   "account.domain_blocked": "Տիրոյթը արգելափակուած է",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "պատասխանելու համար",
   "keyboard_shortcuts.requests": "հետեւելու հայցերի ցանկը դիտելու համար",
   "keyboard_shortcuts.search": "որոնման դաշտին սեւեռվելու համար",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "«սկսել» սիւնակը բացելու համար",
   "keyboard_shortcuts.toggle_hidden": "CW֊ի ետեւի տեքստը ցուցադրել֊թաքցնելու համար",
   "keyboard_shortcuts.toggle_sensitivity": "մեդիան ցուցադրել֊թաքցնելու համար",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# րոպե} other {# րոպե}} անց",
   "time_remaining.moments": "Մնացել է մի քանի վարկյան",
   "time_remaining.seconds": "{number, plural, one {# վայրկյան} other {# վայրկյան}} անց",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {հոգի} other {հոգի}} խոսում է սրա մասին",
   "trends.trending_now": "Այժմ արդիական",
   "ui.beforeunload": "Քո սեւագիրը կկորի, եթե լքես Մաստոդոնը։",
diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json
index 09f5fdee7..df3775cf9 100644
--- a/app/javascript/mastodon/locales/id.json
+++ b/app/javascript/mastodon/locales/id.json
@@ -5,6 +5,7 @@
   "account.block": "Blokir @{name}",
   "account.block_domain": "Sembunyikan segalanya dari {domain}",
   "account.blocked": "Terblokir",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Batalkan permintaan ikuti",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domain disembunyikan",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "balas",
   "keyboard_shortcuts.requests": "buka daftar permintaan ikuti",
   "keyboard_shortcuts.search": "untuk fokus mencari",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "buka kolom \"memulai\"",
   "keyboard_shortcuts.toggle_hidden": "tampilkan/sembunyikan teks di belakang CW",
   "keyboard_shortcuts.toggle_sensitivity": "tampilkan/sembunyikan media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, other {# menit}} tersisa",
   "time_remaining.moments": "Momen tersisa",
   "time_remaining.seconds": "{number, plural, other {# detik}} tersisa",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, other {orang}} berbicara",
   "trends.trending_now": "Sedang tren sekarang",
   "ui.beforeunload": "Naskah anda akan hilang jika anda keluar dari Mastodon.",
diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json
index 696ef694f..a7bc54e85 100644
--- a/app/javascript/mastodon/locales/io.json
+++ b/app/javascript/mastodon/locales/io.json
@@ -5,6 +5,7 @@
   "account.block": "Blokusar @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/is.json b/app/javascript/mastodon/locales/is.json
index 5c5c9edad..ada0a37af 100644
--- a/app/javascript/mastodon/locales/is.json
+++ b/app/javascript/mastodon/locales/is.json
@@ -5,6 +5,7 @@
   "account.block": "Útiloka @{name}",
   "account.block_domain": "Fela allt frá {domain}",
   "account.blocked": "Útilokaður",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Hætta við beiðni um að fylgjast með",
   "account.direct": "Bein skilaboð til @{name}",
   "account.domain_blocked": "Lén falið",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "að svara",
   "keyboard_shortcuts.requests": "að opna lista yfir fylgjendabeiðnir",
   "keyboard_shortcuts.search": "að setja virkni í leit",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "að opna \"komast í gang\" dálk",
   "keyboard_shortcuts.toggle_hidden": "að birta/fela texta á bak við aðvörun vegna efnis",
   "keyboard_shortcuts.toggle_sensitivity": "að birta/fela myndir",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# mínúta} other {# mínútur}} eftir",
   "time_remaining.moments": "Tími eftir",
   "time_remaining.seconds": "{number, plural, one {# sekúnda} other {# sekúndur}} eftir",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {aðili} other {aðilar}} að tala",
   "trends.trending_now": "Í umræðunni núna",
   "ui.beforeunload": "Drögin tapast ef þú ferð út úr Mastodon.",
diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json
index 5ae34551d..1fab8f17c 100644
--- a/app/javascript/mastodon/locales/it.json
+++ b/app/javascript/mastodon/locales/it.json
@@ -5,6 +5,7 @@
   "account.block": "Blocca @{name}",
   "account.block_domain": "Nascondi tutto da {domain}",
   "account.blocked": "Bloccato",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annulla richiesta di seguire",
   "account.direct": "Invia messaggio privato a @{name}",
   "account.domain_blocked": "Dominio nascosto",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "per rispondere",
   "keyboard_shortcuts.requests": "per aprire l'elenco delle richieste di seguirti",
   "keyboard_shortcuts.search": "per spostare il focus sulla ricerca",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "per aprire la colonna \"Come iniziare\"",
   "keyboard_shortcuts.toggle_hidden": "per mostrare/nascondere il testo dei CW",
   "keyboard_shortcuts.toggle_sensitivity": "mostrare/nascondere media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuto} other {# minuti}} left",
   "time_remaining.moments": "Restano pochi istanti",
   "time_remaining.seconds": "{number, plural, one {# secondo} other {# secondi}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persona ne sta} other {persone ne stanno}} parlando",
   "trends.trending_now": "Di tendenza ora",
   "ui.beforeunload": "La bozza andrà persa se esci da Mastodon.",
diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json
index 75a215145..a519b819b 100644
--- a/app/javascript/mastodon/locales/ja.json
+++ b/app/javascript/mastodon/locales/ja.json
@@ -5,6 +5,7 @@
   "account.block": "@{name}さんをブロック",
   "account.block_domain": "{domain}全体をブロック",
   "account.blocked": "ブロック済み",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "フォローリクエストを取り消す",
   "account.direct": "@{name}さんにダイレクトメッセージ",
   "account.domain_blocked": "ドメインブロック中",
@@ -240,6 +241,7 @@
   "keyboard_shortcuts.reply": "返信",
   "keyboard_shortcuts.requests": "フォローリクエストのリストを開く",
   "keyboard_shortcuts.search": "検索欄に移動",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"スタート\" カラムを開く",
   "keyboard_shortcuts.toggle_hidden": "CWで隠れた文を見る/隠す",
   "keyboard_shortcuts.toggle_sensitivity": "非表示のメディアを見る/隠す",
@@ -417,6 +419,10 @@
   "time_remaining.minutes": "残り{number}分",
   "time_remaining.moments": "まもなく終了",
   "time_remaining.seconds": "残り{number}秒",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count}人がトゥート",
   "trends.trending_now": "トレンドタグ",
   "ui.beforeunload": "Mastodonから離れると送信前の投稿は失われます。",
diff --git a/app/javascript/mastodon/locales/ka.json b/app/javascript/mastodon/locales/ka.json
index 2c487a9b6..d7913dd2a 100644
--- a/app/javascript/mastodon/locales/ka.json
+++ b/app/javascript/mastodon/locales/ka.json
@@ -5,6 +5,7 @@
   "account.block": "დაბლოკე @{name}",
   "account.block_domain": "დაიმალოს ყველაფერი დომენიდან {domain}",
   "account.blocked": "დაიბლოკა",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "პირდაპირი წერილი @{name}-ს",
   "account.domain_blocked": "დომენი დამალულია",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "პასუხისთვის",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "ძიებაზე ფოკუსირებისთვის",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "გაფრთხილების უკან ტექსტის გამოსაჩენად/დასამალვად",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} საუბრობს",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "თქვენი დრაფტი გაუქმდება თუ დატოვებთ მასტოდონს.",
diff --git a/app/javascript/mastodon/locales/kab.json b/app/javascript/mastodon/locales/kab.json
index abf6cbbca..9237f486b 100644
--- a/app/javascript/mastodon/locales/kab.json
+++ b/app/javascript/mastodon/locales/kab.json
@@ -5,6 +5,7 @@
   "account.block": "Seḥbes @{name}",
   "account.block_domain": "Ffer kra i d-yekkan seg {domain}",
   "account.blocked": "Yettuseḥbes",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Sefsex asuter n uḍfaṛ",
   "account.direct": "Izen usrid i @{name}",
   "account.domain_blocked": "Taɣult yeffren",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "i tririt",
   "keyboard_shortcuts.requests": "akken ad d-teldiḍ umuγ n yisuturen n teḍfeṛt",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "akken ad d-teldiḍ ajgu n \"bdu\"",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "i teskent/tuffra n yimidyaten",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "Mazal {number, plural, one {# n tesdat} other {# n tesdatin}}",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "Mazal {number, plural, one {# n tasint} other {# n tsinin}} id yugran",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {n umdan} other {n yemdanen}} i yettmeslayen",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Arewway-ik·im ad iruḥ ma yella tefeɣ-d deg Maṣṭudun.",
diff --git a/app/javascript/mastodon/locales/kk.json b/app/javascript/mastodon/locales/kk.json
index f1782424c..48e6e414d 100644
--- a/app/javascript/mastodon/locales/kk.json
+++ b/app/javascript/mastodon/locales/kk.json
@@ -5,6 +5,7 @@
   "account.block": "Бұғаттау @{name}",
   "account.block_domain": "Домендегі барлығын бұғатта {domain}",
   "account.blocked": "Бұғатталды",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Жазылуға сұранымды қайтару",
   "account.direct": "Жеке хат @{name}",
   "account.domain_blocked": "Домен жабық",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "жауап жазу",
   "keyboard_shortcuts.requests": "жазылу сұранымдарын қарау",
   "keyboard_shortcuts.search": "іздеу",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "бастапқы бағанға бару",
   "keyboard_shortcuts.toggle_hidden": "жабық мәтінді CW ашу/жабу",
   "keyboard_shortcuts.toggle_sensitivity": "көрсет/жап",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# минут} other {# минут}}",
   "time_remaining.moments": "Қалған уақыт",
   "time_remaining.seconds": "{number, plural, one {# секунд} other {# секунд}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} жазған екен",
   "trends.trending_now": "Тренд тақырыптар",
   "ui.beforeunload": "Mastodon желісінен шықсаңыз, нобайыңыз сақталмайды.",
diff --git a/app/javascript/mastodon/locales/kn.json b/app/javascript/mastodon/locales/kn.json
index d0757efbf..33fec4a4c 100644
--- a/app/javascript/mastodon/locales/kn.json
+++ b/app/javascript/mastodon/locales/kn.json
@@ -5,6 +5,7 @@
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json
index 54a24376c..c8e470b38 100644
--- a/app/javascript/mastodon/locales/ko.json
+++ b/app/javascript/mastodon/locales/ko.json
@@ -5,6 +5,7 @@
   "account.block": "@{name}을 차단",
   "account.block_domain": "{domain} 전체를 숨김",
   "account.blocked": "차단됨",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "팔로우 요청 취소",
   "account.direct": "@{name}의 다이렉트 메시지",
   "account.domain_blocked": "도메인 숨겨짐",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "답장",
   "keyboard_shortcuts.requests": "팔로우 요청 리스트 열기",
   "keyboard_shortcuts.search": "검색창에 포커스",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"시작하기\" 컬럼 열기",
   "keyboard_shortcuts.toggle_hidden": "CW로 가려진 텍스트를 표시/비표시",
   "keyboard_shortcuts.toggle_sensitivity": "이미지 보이기/숨기기",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number} 분 남음",
   "time_remaining.moments": "남은 시간",
   "time_remaining.seconds": "{number} 초 남음",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} 명의 사람들이 말하고 있습니다",
   "trends.trending_now": "지금 유행중",
   "ui.beforeunload": "지금 나가면 저장되지 않은 항목을 잃게 됩니다.",
diff --git a/app/javascript/mastodon/locales/lt.json b/app/javascript/mastodon/locales/lt.json
index d0757efbf..33fec4a4c 100644
--- a/app/javascript/mastodon/locales/lt.json
+++ b/app/javascript/mastodon/locales/lt.json
@@ -5,6 +5,7 @@
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/lv.json b/app/javascript/mastodon/locales/lv.json
index 241d7c080..d4288f96b 100644
--- a/app/javascript/mastodon/locales/lv.json
+++ b/app/javascript/mastodon/locales/lv.json
@@ -5,6 +5,7 @@
   "account.block": "Bloķēt @{name}",
   "account.block_domain": "Slēpt visu no {domain}",
   "account.blocked": "Bloķēts",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Privātā ziņa @{name}",
   "account.domain_blocked": "Domēns ir paslēpts",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/mk.json b/app/javascript/mastodon/locales/mk.json
index bc5f91264..61202ec19 100644
--- a/app/javascript/mastodon/locales/mk.json
+++ b/app/javascript/mastodon/locales/mk.json
@@ -5,6 +5,7 @@
   "account.block": "Блокирај @{name}",
   "account.block_domain": "Сокријај се од {domain}",
   "account.blocked": "Блокиран",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Одкажи барање за следење",
   "account.direct": "Директна порана @{name}",
   "account.domain_blocked": "Скриен домен",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "одговори",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# минута} other {# минути}} {number, plural, one {остана} other {останаа}}",
   "time_remaining.moments": "Уште некои мига",
   "time_remaining.seconds": "{number, plural, one {# секунда} other {# секунди}} {number, plural, one {остана} other {останаа}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/ml.json b/app/javascript/mastodon/locales/ml.json
index 788200c87..7b74c10ee 100644
--- a/app/javascript/mastodon/locales/ml.json
+++ b/app/javascript/mastodon/locales/ml.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} നെ ബ്ലോക്ക് ചെയ്യുക",
   "account.block_domain": "{domain} ൽ നിന്നുള്ള എല്ലാം മറയ്കുക",
   "account.blocked": "തടഞ്ഞു",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "പിന്തുടരാനുള്ള അപേക്ഷ നിരസിക്കുക",
   "account.direct": "@{name} ന് നേരിട്ട് മെസേജ് അയക്കുക",
   "account.domain_blocked": "മേഖല മറയ്ക്കപ്പെട്ടിരിക്കുന്നു",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/mr.json b/app/javascript/mastodon/locales/mr.json
index f213c2942..46fd5acc5 100644
--- a/app/javascript/mastodon/locales/mr.json
+++ b/app/javascript/mastodon/locales/mr.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} यांना ब्लॉक करा",
   "account.block_domain": "{domain} पासून सर्व लपवा",
   "account.blocked": "ब्लॉक केले आहे",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "अनुयायी होण्याची विनंती रद्द करा",
   "account.direct": "थेट संदेश @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/ms.json b/app/javascript/mastodon/locales/ms.json
index a5b4d199a..9a9fc975a 100644
--- a/app/javascript/mastodon/locales/ms.json
+++ b/app/javascript/mastodon/locales/ms.json
@@ -5,6 +5,7 @@
   "account.block": "Block @{name}",
   "account.block_domain": "Hide everything from {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json
index 6cdd02c02..ca5be5164 100644
--- a/app/javascript/mastodon/locales/nl.json
+++ b/app/javascript/mastodon/locales/nl.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} blokkeren",
   "account.block_domain": "Alles van {domain} verbergen",
   "account.blocked": "Geblokkeerd",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Volgverzoek annuleren",
   "account.direct": "@{name} een direct bericht sturen",
   "account.domain_blocked": "Domein verborgen",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "om te reageren",
   "keyboard_shortcuts.requests": "om jouw volgverzoeken te tonen",
   "keyboard_shortcuts.search": "om het zoekvak te focussen",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "om de \"Aan de slag\"-kolom te tonen",
   "keyboard_shortcuts.toggle_hidden": "om tekst achter een waarschuwing (CW) te tonen/verbergen",
   "keyboard_shortcuts.toggle_sensitivity": "om media te tonen/verbergen",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuut} other {# minuten}} te gaan",
   "time_remaining.moments": "Nog enkele ogenblikken resterend",
   "time_remaining.seconds": "{number, plural, one {# seconde} other {# seconden}} te gaan",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persoon praat} other {mensen praten}} hierover",
   "trends.trending_now": "Trends",
   "ui.beforeunload": "Je concept zal verloren gaan als je Mastodon verlaat.",
diff --git a/app/javascript/mastodon/locales/nn.json b/app/javascript/mastodon/locales/nn.json
index 0c1fd8bbf..dee0cd836 100644
--- a/app/javascript/mastodon/locales/nn.json
+++ b/app/javascript/mastodon/locales/nn.json
@@ -5,6 +5,7 @@
   "account.block": "Blokker @{name}",
   "account.block_domain": "Skjul alt frå {domain}",
   "account.blocked": "Blokkert",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Fjern fylgjeførespurnad",
   "account.direct": "Send melding til @{name}",
   "account.domain_blocked": "Domenet er gøymt",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "for å svara",
   "keyboard_shortcuts.requests": "for å opna lista med fylgjeførespurnader",
   "keyboard_shortcuts.search": "for å fokusera søket",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "for å opna \"kom i gang\"-feltet",
   "keyboard_shortcuts.toggle_hidden": "for å visa/gøyma tekst bak innhaldsvarsel",
   "keyboard_shortcuts.toggle_sensitivity": "for å visa/gøyma media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minutt} other {# minutt}} igjen",
   "time_remaining.moments": "Kort tid igjen",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekund}} igjen",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {folk}} snakkar",
   "trends.trending_now": "Populært no",
   "ui.beforeunload": "Kladden din forsvinn om du forlèt Mastodon no.",
diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json
index f7d47f7f7..71cfdfe14 100644
--- a/app/javascript/mastodon/locales/no.json
+++ b/app/javascript/mastodon/locales/no.json
@@ -5,6 +5,7 @@
   "account.block": "Blokkér @{name}",
   "account.block_domain": "Skjul alt fra {domain}",
   "account.blocked": "Blokkert",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Avbryt følge forespørsel",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domenet skjult",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "for å svare",
   "keyboard_shortcuts.requests": "åpne følgingsforespørselslisten",
   "keyboard_shortcuts.search": "å fokusere søk",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "åpne «Sett i gang»-kolonnen",
   "keyboard_shortcuts.toggle_hidden": "å vise/skjule tekst bak en innholdsadvarsel",
   "keyboard_shortcuts.toggle_sensitivity": "å vise/skjule media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minutt} other {# minutter}} igjen",
   "time_remaining.moments": "Gjenværende øyeblikk",
   "time_remaining.seconds": "{number, plural, one {# sekund} other {# sekunder}} igjen",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {personer}} snakker om det",
   "trends.trending_now": "Trender nå",
   "ui.beforeunload": "Din kladd vil bli forkastet om du forlater Mastodon.",
diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json
index 5dc7bf61c..370a73475 100644
--- a/app/javascript/mastodon/locales/oc.json
+++ b/app/javascript/mastodon/locales/oc.json
@@ -5,6 +5,7 @@
   "account.block": "Blocar @{name}",
   "account.block_domain": "Tot amagar del domeni {domain}",
   "account.blocked": "Blocat",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Anullar la demanda de seguiment",
   "account.direct": "Escriure un MP a @{name}",
   "account.domain_blocked": "Domeni amagat",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "respondre",
   "keyboard_shortcuts.requests": "dorbir la lista de demanda d’abonament",
   "keyboard_shortcuts.search": "anar a la recèrca",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "dobrir la colomna « Per començar »",
   "keyboard_shortcuts.toggle_hidden": "mostrar/amagar lo tèxte dels avertiments",
   "keyboard_shortcuts.toggle_sensitivity": "mostrar/rescondre los mèdias",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "demòra{number, plural, one { # minuta} other {n # minutas}}",
   "time_remaining.moments": "Moments restants",
   "time_remaining.seconds": "demòra{number, plural, one { # segonda} other {n # segondas}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} ne charra other {people}} ne charran",
   "trends.trending_now": "Tendéncia del moment",
   "ui.beforeunload": "Vòstre brolhon serà perdut se quitatz Mastodon.",
diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json
index afb4e29e6..bbfe4cce3 100644
--- a/app/javascript/mastodon/locales/pl.json
+++ b/app/javascript/mastodon/locales/pl.json
@@ -5,6 +5,7 @@
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Blokuj wszystko z {domain}",
   "account.blocked": "Zablokowany(-a)",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Zrezygnuj z prośby o możliwość śledzenia",
   "account.direct": "Wyślij wiadomość bezpośrednią do @{name}",
   "account.domain_blocked": "Ukryto domenę",
@@ -240,6 +241,7 @@
   "keyboard_shortcuts.reply": "aby odpowiedzieć",
   "keyboard_shortcuts.requests": "aby przejść do listy próśb o możliwość śledzenia",
   "keyboard_shortcuts.search": "aby przejść do pola wyszukiwania",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "aby otworzyć kolumnę „Rozpocznij”",
   "keyboard_shortcuts.toggle_hidden": "aby wyświetlić lub ukryć wpis spod CW",
   "keyboard_shortcuts.toggle_sensitivity": "by pokazać/ukryć multimedia",
@@ -417,6 +419,10 @@
   "time_remaining.minutes": "{number, plural, one {Pozostała # minuta} few {Pozostały # minuty} many {Pozostało # minut} other {Pozostało # minut}}",
   "time_remaining.moments": "Pozostała chwila",
   "time_remaining.seconds": "{number, plural, one {Pozostała # sekunda} few {Pozostały # sekundy} many {Pozostało # sekund} other {Pozostało # sekund}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {osoba rozmawia} few {osoby rozmawiają} other {osób rozmawia}} o tym",
   "trends.trending_now": "Popularne teraz",
   "ui.beforeunload": "Utracisz tworzony wpis, jeżeli opuścisz Mastodona.",
diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json
index 4eb61279a..334e0e8c6 100644
--- a/app/javascript/mastodon/locales/pt-BR.json
+++ b/app/javascript/mastodon/locales/pt-BR.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Bloquear domínio {domain}",
   "account.blocked": "Bloqueado",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancelar solicitação para seguir",
   "account.direct": "Enviar toot direto para @{name}",
   "account.domain_blocked": "Domínio bloqueado",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir lista de pedidos para seguir",
   "keyboard_shortcuts.search": "para focar pesquisa",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "para abrir coluna \"primeiros passos\"",
   "keyboard_shortcuts.toggle_hidden": "mostrar/ocultar o toot com Aviso de Conteúdo",
   "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar mídia",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}",
   "time_remaining.moments": "Momentos faltantes",
   "time_remaining.seconds": "{number, plural, one {# segundo restante} other {# segundos restantes}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {pessoa} other {pessoas}} falando",
   "trends.trending_now": "Em alta no momento",
   "ui.beforeunload": "Seu rascunho vai ser perdido se você sair do Mastodon.",
diff --git a/app/javascript/mastodon/locales/pt-PT.json b/app/javascript/mastodon/locales/pt-PT.json
index 41433a43f..a888f7a58 100644
--- a/app/javascript/mastodon/locales/pt-PT.json
+++ b/app/javascript/mastodon/locales/pt-PT.json
@@ -5,6 +5,7 @@
   "account.block": "Bloquear @{name}",
   "account.block_domain": "Esconder tudo do domínio {domain}",
   "account.blocked": "Bloqueado",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancelar pedido de seguidor",
   "account.direct": "Mensagem directa @{name}",
   "account.domain_blocked": "Domínio escondido",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "para responder",
   "keyboard_shortcuts.requests": "para abrir a lista dos pedidos de seguidor",
   "keyboard_shortcuts.search": "para focar na pesquisa",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "para abrir a coluna dos \"primeiros passos\"",
   "keyboard_shortcuts.toggle_hidden": "para mostrar/esconder texto atrás de CW",
   "keyboard_shortcuts.toggle_sensitivity": "mostrar/ocultar media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{número, plural, um {# minute} outro {# minutes}} faltam",
   "time_remaining.moments": "Momentos restantes",
   "time_remaining.seconds": "{número, plural, um {# second} outro {# seconds}} faltam",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, uma {person} outra {people}} a falar",
   "trends.trending_now": "Tendências atuais",
   "ui.beforeunload": "O teu rascunho será perdido se abandonares o Mastodon.",
diff --git a/app/javascript/mastodon/locales/ro.json b/app/javascript/mastodon/locales/ro.json
index f7143a2e2..1a998e8fb 100644
--- a/app/javascript/mastodon/locales/ro.json
+++ b/app/javascript/mastodon/locales/ro.json
@@ -5,6 +5,7 @@
   "account.block": "Blocați @{name}",
   "account.block_domain": "Blocați domeniul {domain}",
   "account.blocked": "Blocat",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Anulați cererea de urmărire",
   "account.direct": "Mesaj direct @{name}",
   "account.domain_blocked": "Domeniu blocat",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "să răspundă",
   "keyboard_shortcuts.requests": "să deschidă lista cu cereri de urmărire",
   "keyboard_shortcuts.search": "să focalizeze căutarea",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "să deschidă coloana \"Începere\"",
   "keyboard_shortcuts.toggle_hidden": "să arate/ascundă textul în spatele CW",
   "keyboard_shortcuts.toggle_sensitivity": "pentru a afișa/ascunde media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minut} other {# minute}} rămase",
   "time_remaining.moments": "Momente rămase",
   "time_remaining.seconds": "{number, plural, one {# secundă} other {# secunde}} rămase",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persoană} other {persoane}} vorbește/ecs",
   "trends.trending_now": "În tendință acum",
   "ui.beforeunload": "Postarea se va pierde dacă părăsești pagina.",
diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json
index fa81bdc36..ed1518d02 100644
--- a/app/javascript/mastodon/locales/ru.json
+++ b/app/javascript/mastodon/locales/ru.json
@@ -5,6 +5,7 @@
   "account.block": "Заблокировать @{name}",
   "account.block_domain": "Заблокировать {domain}",
   "account.blocked": "Заблокирован(а)",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Отменить запрос",
   "account.direct": "Написать @{name}",
   "account.domain_blocked": "Домен скрыт",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "ответить",
   "keyboard_shortcuts.requests": "перейти к запросам на подписку",
   "keyboard_shortcuts.search": "перейти к поиску",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "перейти к разделу \"добро пожаловать\"",
   "keyboard_shortcuts.toggle_hidden": "показать/скрыть текст за предупреждением",
   "keyboard_shortcuts.toggle_sensitivity": "показать/скрыть медиафайлы",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {осталась # минута} few {осталось # минуты} many {осталось # минут} other {осталось # минут}}",
   "time_remaining.moments": "остались считанные мгновения",
   "time_remaining.seconds": "{number, plural, one {# секунда} many {# секунд} other {# секунды}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {человек говорит} few {человека говорят} other {человек говорят}} про это",
   "trends.trending_now": "Самое актуальное",
   "ui.beforeunload": "Ваш черновик будет утерян, если вы покинете Mastodon.",
diff --git a/app/javascript/mastodon/locales/sc.json b/app/javascript/mastodon/locales/sc.json
index db2bb0dac..dadc34cde 100644
--- a/app/javascript/mastodon/locales/sc.json
+++ b/app/javascript/mastodon/locales/sc.json
@@ -5,6 +5,7 @@
   "account.block": "Bloca @{name}",
   "account.block_domain": "Bloca domìniu{domain}",
   "account.blocked": "Blocadu",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Annulla rechesta de sighidura",
   "account.direct": "Messàgiu deretu a @{name}",
   "account.domain_blocked": "Domìniu blocadu",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "pro rispòndere",
   "keyboard_shortcuts.requests": "pro abèrrere sa lista de rechestas de sighidura",
   "keyboard_shortcuts.search": "pro atzentrare sa chirca",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "pro abèrrere sa colunna \"Cumintza\"",
   "keyboard_shortcuts.toggle_hidden": "pro ammustrare o cuare testu de is CW",
   "keyboard_shortcuts.toggle_sensitivity": "pro ammustrare o cuare mèdias",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {abarrat # minutu} other {abarrant # minutos}}",
   "time_remaining.moments": "Abarrant pagu momentos",
   "time_remaining.seconds": "{number, plural, one {abarrat # segundu} other {abarrant # segundos}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {persone} other {persones}} nde sunt chistionende",
   "trends.trending_now": "Est tendèntzia immoe",
   "ui.beforeunload": "S'abbotzu tuo at a èssere pèrdidu si essis dae Mastodon.",
diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json
index ec34bb29e..d37a7db6f 100644
--- a/app/javascript/mastodon/locales/sk.json
+++ b/app/javascript/mastodon/locales/sk.json
@@ -5,6 +5,7 @@
   "account.block": "Blokuj @{name}",
   "account.block_domain": "Ukry všetko z {domain}",
   "account.blocked": "Blokovaný/á",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Zruš žiadosť o sledovanie",
   "account.direct": "Priama správa pre @{name}",
   "account.domain_blocked": "Doména ukrytá",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "odpovedať",
   "keyboard_shortcuts.requests": "otvor zoznam žiadostí o sledovanie",
   "keyboard_shortcuts.search": "zameraj sa na vyhľadávanie",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "otvor panel ''začíname''",
   "keyboard_shortcuts.toggle_hidden": "ukáž/skry text za CW",
   "keyboard_shortcuts.toggle_sensitivity": "pre zobrazenie/skrytie médií",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "Ostáva {number, plural, one {# minúta} few {# minút} many {# minút} other {# minúty}}",
   "time_remaining.moments": "Ostáva už iba chviľka",
   "time_remaining.seconds": "Ostáva {number, plural, one {# sekunda} few {# sekúnd} many {# sekúnd} other {# sekúnd}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {človek spomína} other {ľudí spomína}}",
   "trends.trending_now": "Teraz populárne",
   "ui.beforeunload": "Čo máš rozpísané sa stratí, ak opustíš Mastodon.",
diff --git a/app/javascript/mastodon/locales/sl.json b/app/javascript/mastodon/locales/sl.json
index 3d8bcc571..e969b9ad2 100644
--- a/app/javascript/mastodon/locales/sl.json
+++ b/app/javascript/mastodon/locales/sl.json
@@ -5,6 +5,7 @@
   "account.block": "Blokiraj @{name}",
   "account.block_domain": "Skrij vse iz {domain}",
   "account.blocked": "Blokirano",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Neposredno sporočilo @{name}",
   "account.domain_blocked": "Skrita domena",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "odgovori",
   "keyboard_shortcuts.requests": "odpri seznam s prošnjami za sledenje",
   "keyboard_shortcuts.search": "fokusiraj na iskanje",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "odpri stolpec \"začni\"",
   "keyboard_shortcuts.toggle_hidden": "prikaži/skrij besedilo za CW",
   "keyboard_shortcuts.toggle_sensitivity": "prikaži/skrij medije",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minuta} other {# minut}} je ostalo",
   "time_remaining.moments": "Preostali trenutki",
   "time_remaining.seconds": "{number, plural, one {# sekunda} other {# sekund}} je ostalo",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {oseba} other {ljudi}} govori",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Vaš osnutek bo izgubljen, če zapustite Mastodona.",
diff --git a/app/javascript/mastodon/locales/sq.json b/app/javascript/mastodon/locales/sq.json
index 8626b9ce7..2729c0266 100644
--- a/app/javascript/mastodon/locales/sq.json
+++ b/app/javascript/mastodon/locales/sq.json
@@ -5,6 +5,7 @@
   "account.block": "Blloko @{name}",
   "account.block_domain": "Fshih gjithçka prej {domain}",
   "account.blocked": "E bllokuar",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Anulo kërkesën e ndjekjes",
   "account.direct": "Mesazh i drejtpërdrejt për @{name}",
   "account.domain_blocked": "Përkatësi e fshehur",
@@ -236,6 +237,7 @@
   "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.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "për hapjen e shtyllës \"fillojani\"",
   "keyboard_shortcuts.toggle_hidden": "për shfaqje/fshehje teksti pas CW",
   "keyboard_shortcuts.toggle_sensitivity": "për të shfaqur/të fshehur media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural,one {# minutë}other {# minuta}} mbetur",
   "time_remaining.moments": "Momente të mbetura",
   "time_remaining.seconds": "{number, plural,one {# sekond}other {# sekonda}} mbetur",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, një {person} {people} të tjerë} po flasin",
   "trends.trending_now": "Në trend",
   "ui.beforeunload": "Skica juaj do të humbë nëse dilni nga Mastodon-i.",
diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json
index d1b4ee7ec..6e0bd4d1e 100644
--- a/app/javascript/mastodon/locales/sr-Latn.json
+++ b/app/javascript/mastodon/locales/sr-Latn.json
@@ -5,6 +5,7 @@
   "account.block": "Blokiraj korisnika @{name}",
   "account.block_domain": "Sakrij sve sa domena {domain}",
   "account.blocked": "Blocked",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "Direct Message @{name}",
   "account.domain_blocked": "Domain hidden",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "da odgovorite",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "da se prebacite na pretragu",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Ako napustite Mastodont, izgubićete napisani nacrt.",
diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json
index 277ef356f..356ff85bc 100644
--- a/app/javascript/mastodon/locales/sr.json
+++ b/app/javascript/mastodon/locales/sr.json
@@ -5,6 +5,7 @@
   "account.block": "Блокирај @{name}",
   "account.block_domain": "Сакриј све са домена {domain}",
   "account.blocked": "Блокиран",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Поништи захтеве за праћење",
   "account.direct": "Директна порука @{name}",
   "account.domain_blocked": "Домен сакривен",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "да одговорите",
   "keyboard_shortcuts.requests": "да отворите листу примљених захтева за праћење",
   "keyboard_shortcuts.search": "да се пребаците на претрагу",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "да отворите колону \"почнимо\"",
   "keyboard_shortcuts.toggle_hidden": "да прикажете/сакријте текст иза CW-а",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {човек} other {људи}} прича",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Ако напустите Мастодонт, изгубићете написани нацрт.",
diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json
index c83ede5bc..11b72db36 100644
--- a/app/javascript/mastodon/locales/sv.json
+++ b/app/javascript/mastodon/locales/sv.json
@@ -5,6 +5,7 @@
   "account.block": "Blockera @{name}",
   "account.block_domain": "Dölj allt från {domain}",
   "account.blocked": "Blockerad",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Avbryt följarförfrågan",
   "account.direct": "Skicka ett direktmeddelande till @{name}",
   "account.domain_blocked": "Domän dold",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "för att svara",
   "keyboard_shortcuts.requests": "för att öppna Följförfrågningar",
   "keyboard_shortcuts.search": "för att fokusera sökfältet",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "för att öppna \"Kom igång\"-kolumnen",
   "keyboard_shortcuts.toggle_hidden": "för att visa/gömma text bakom CW",
   "keyboard_shortcuts.toggle_sensitivity": "för att visa/gömma media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{minutes, plural, one {1 minut} other {# minuter}} kvar",
   "time_remaining.moments": "Återstående tillfällen",
   "time_remaining.seconds": "{hours, plural, one {# sekund} other {# sekunder}} kvar",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, en {person} andra {people}} pratar",
   "trends.trending_now": "Trendar nu",
   "ui.beforeunload": "Ditt utkast kommer att förloras om du lämnar Mastodon.",
diff --git a/app/javascript/mastodon/locales/ta.json b/app/javascript/mastodon/locales/ta.json
index 22d24639f..117fa0839 100644
--- a/app/javascript/mastodon/locales/ta.json
+++ b/app/javascript/mastodon/locales/ta.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} -ஐத் தடு",
   "account.block_domain": "{domain} யில் இருந்து வரும் எல்லாவற்றையும் மறை",
   "account.blocked": "முடக்கப்பட்டது",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "பின்தொடரும் கோரிக்கையை நிராகரி",
   "account.direct": "நேரடி செய்தி @{name}",
   "account.domain_blocked": "மறைக்கப்பட்டத் தளங்கள்",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "பதிலளிக்க",
   "keyboard_shortcuts.requests": "கோரிக்கைகள் பட்டியலைத் திறக்க",
   "keyboard_shortcuts.search": "தேடல் கவனம் செலுத்த",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "'தொடங்குவதற்கு' நெடுவரிசை திறக்க",
   "keyboard_shortcuts.toggle_hidden": "CW க்கு பின்னால் உரையை மறைக்க / மறைக்க",
   "keyboard_shortcuts.toggle_sensitivity": "படிமங்களைக் காட்ட/மறைக்க",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} மற்ற {# minutes}} left",
   "time_remaining.moments": "தருணங்கள் மீதமுள்ளன",
   "time_remaining.seconds": "{number, plural, one {# second} மற்ற {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} மற்ற {people}} உரையாடு",
   "trends.trending_now": "இப்போது செல்திசையில் இருப்பவை",
   "ui.beforeunload": "நீங்கள் வெளியே சென்றால் உங்கள் வரைவு இழக்கப்படும் மஸ்தோடோன்.",
diff --git a/app/javascript/mastodon/locales/te.json b/app/javascript/mastodon/locales/te.json
index 031d1fad7..bd94f8498 100644
--- a/app/javascript/mastodon/locales/te.json
+++ b/app/javascript/mastodon/locales/te.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} ను బ్లాక్ చేయి",
   "account.block_domain": "{domain} నుంచి అన్నీ దాచిపెట్టు",
   "account.blocked": "బ్లాక్ అయినవి",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Cancel follow request",
   "account.direct": "@{name}కు నేరుగా సందేశం పంపు",
   "account.domain_blocked": "డొమైన్ దాచిపెట్టబడినది",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "ప్రత్యుత్తరం ఇవ్వడానికి",
   "keyboard_shortcuts.requests": "ఫాలో రిక్వెస్ట్ల జాబితాను తెరవడానికి",
   "keyboard_shortcuts.search": "శోధనపై దృష్టి పెట్టండి",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"ఇక్కడ ప్రారంభించండి\" నిలువు వరుసను తెరవడానికి",
   "keyboard_shortcuts.toggle_hidden": "CW వెనుక ఉన్న పాఠ్యాన్ని చూపడానికి / దాచడానికి",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "కొన్ని క్షణాలు మాత్రమే మిగిలి ఉన్నాయి",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} మాట్లాడుతున్నారు",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "మీరు మాస్టొడొన్ను వదిలివేస్తే మీ డ్రాఫ్ట్లు పోతాయి.",
diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json
index 8ba698e4e..a95fc55b9 100644
--- a/app/javascript/mastodon/locales/th.json
+++ b/app/javascript/mastodon/locales/th.json
@@ -5,6 +5,7 @@
   "account.block": "ปิดกั้น @{name}",
   "account.block_domain": "ปิดกั้นโดเมน {domain}",
   "account.blocked": "ปิดกั้นอยู่",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "ยกเลิกคำขอติดตาม",
   "account.direct": "ส่งข้อความโดยตรงถึง @{name}",
   "account.domain_blocked": "ปิดกั้นโดเมนอยู่",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "เพื่อตอบกลับ",
   "keyboard_shortcuts.requests": "เพื่อเปิดรายการคำขอติดตาม",
   "keyboard_shortcuts.search": "เพื่อโฟกัสการค้นหา",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "เพื่อเปิดคอลัมน์ \"เริ่มต้นใช้งาน\"",
   "keyboard_shortcuts.toggle_hidden": "เพื่อแสดง/ซ่อนข้อความที่อยู่หลังคำเตือนเนื้อหา",
   "keyboard_shortcuts.toggle_sensitivity": "เพื่อแสดง/ซ่อนสื่อ",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "เหลืออีก {number, plural, other {# นาที}}",
   "time_remaining.moments": "ช่วงเวลาที่เหลือ",
   "time_remaining.seconds": "เหลืออีก {number, plural, other {# วินาที}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, other {คน}}กำลังพูดคุย",
   "trends.trending_now": "กำลังนิยม",
   "ui.beforeunload": "แบบร่างของคุณจะหายไปหากคุณออกจาก Mastodon",
diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json
index c6c1c8d8c..17d8a54ff 100644
--- a/app/javascript/mastodon/locales/tr.json
+++ b/app/javascript/mastodon/locales/tr.json
@@ -5,6 +5,7 @@
   "account.block": "@{name} adlı kişiyi engelle",
   "account.block_domain": "{domain} alanından her şeyi gizle",
   "account.blocked": "Engellenmiş",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Takip isteğini iptal et",
   "account.direct": "Mesaj gönder @{name}",
   "account.domain_blocked": "Alan adı gizlendi",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "cevaplamak için",
   "keyboard_shortcuts.requests": "takip istekleri listesini açmak için",
   "keyboard_shortcuts.search": "aramaya odaklanmak için",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "\"başlayın\" sütununu açmak için",
   "keyboard_shortcuts.toggle_hidden": "CW'den önceki yazıyı göstermek/gizlemek için",
   "keyboard_shortcuts.toggle_sensitivity": "medyayı göstermek/gizlemek için",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# dakika} other {# dakika}} kaldı",
   "time_remaining.moments": "Sadece birkaç dakika kaldı",
   "time_remaining.seconds": "{number, plural, one {# saniye} other {# saniye}} kaldı",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {kişi} other {kişi}} konuşuyor",
   "trends.trending_now": "Şu an popüler",
   "ui.beforeunload": "Mastodon'dan ayrılırsanız taslağınız kaybolacak.",
diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json
index 2bf264395..9735f2b83 100644
--- a/app/javascript/mastodon/locales/uk.json
+++ b/app/javascript/mastodon/locales/uk.json
@@ -5,6 +5,7 @@
   "account.block": "Заблокувати @{name}",
   "account.block_domain": "Заглушити {domain}",
   "account.blocked": "Заблоковані",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Скасувати запит на підписку",
   "account.direct": "Пряме повідомлення @{name}",
   "account.domain_blocked": "Домен приховано",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "відповісти",
   "keyboard_shortcuts.requests": "відкрити список бажаючих підписатися",
   "keyboard_shortcuts.search": "сфокусуватися на пошуку",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "відкрити колонку \"Початок\"",
   "keyboard_shortcuts.toggle_hidden": "показати/приховати текст під попередженням",
   "keyboard_shortcuts.toggle_sensitivity": "показати/приховати медіа",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# хвилина} few {# хвилини} other {# хвилин}}",
   "time_remaining.moments": "Залишилось секунд",
   "time_remaining.seconds": "{number, plural, one {# секунда} few {# секунди} other {# секунд}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {людина} few {людини} many {людей} other {людей}} обговорюють це",
   "trends.trending_now": "Актуальні",
   "ui.beforeunload": "Вашу чернетку буде втрачено, якщо ви покинете Mastodon.",
diff --git a/app/javascript/mastodon/locales/ur.json b/app/javascript/mastodon/locales/ur.json
index b4989afb7..e3639d477 100644
--- a/app/javascript/mastodon/locales/ur.json
+++ b/app/javascript/mastodon/locales/ur.json
@@ -5,6 +5,7 @@
   "account.block": "مسدود @{name}",
   "account.block_domain": "{domain} سے سب چھپائیں",
   "account.blocked": "مسدود کردہ",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "درخواستِ پیروی منسوخ کریں",
   "account.direct": "راست پیغام @{name}",
   "account.domain_blocked": "پوشیدہ ڈومین",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "to reply",
   "keyboard_shortcuts.requests": "to open follow requests list",
   "keyboard_shortcuts.search": "to focus search",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "to open \"get started\" column",
   "keyboard_shortcuts.toggle_hidden": "to show/hide text behind CW",
   "keyboard_shortcuts.toggle_sensitivity": "to show/hide media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, one {# minute} other {# minutes}} left",
   "time_remaining.moments": "Moments remaining",
   "time_remaining.seconds": "{number, plural, one {# second} other {# seconds}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} {rawCount, plural, one {person} other {people}} talking",
   "trends.trending_now": "Trending now",
   "ui.beforeunload": "Your draft will be lost if you leave Mastodon.",
diff --git a/app/javascript/mastodon/locales/vi.json b/app/javascript/mastodon/locales/vi.json
index 126fbc561..2d16526c4 100644
--- a/app/javascript/mastodon/locales/vi.json
+++ b/app/javascript/mastodon/locales/vi.json
@@ -5,6 +5,7 @@
   "account.block": "Chặn @{name}",
   "account.block_domain": "Ẩn mọi thứ từ {domain}",
   "account.blocked": "Đã chặn",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "Hủy theo yêu cầu",
   "account.direct": "Nhắn riêng @{name}",
   "account.domain_blocked": "Miền đã ẩn",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "để trả lời",
   "keyboard_shortcuts.requests": "để mở danh sách các yêu cầu",
   "keyboard_shortcuts.search": "để vào ô tìm kiếm",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "để mở cột \"Bắt đầu\"",
   "keyboard_shortcuts.toggle_hidden": "để ẩn/hiện đằng sau văn bản CW",
   "keyboard_shortcuts.toggle_sensitivity": "để hiển thị / ẩn media",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "{number, plural, other {}} left",
   "time_remaining.moments": "Còn lại",
   "time_remaining.seconds": "{number, plural, other {}} left",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{Count} {rawCount, số nhiều, một {người} khác {người}} nói chuyện",
   "trends.trending_now": "Đang là xu hướng",
   "ui.beforeunload": "Bản nháp của bạn sẽ bị mất nếu bạn rời của Mastodon.",
diff --git a/app/javascript/mastodon/locales/zh-CN.json b/app/javascript/mastodon/locales/zh-CN.json
index ccd69815d..0069b90ae 100644
--- a/app/javascript/mastodon/locales/zh-CN.json
+++ b/app/javascript/mastodon/locales/zh-CN.json
@@ -5,6 +5,7 @@
   "account.block": "屏蔽 @{name}",
   "account.block_domain": "隐藏来自 {domain} 的内容",
   "account.blocked": "已屏蔽",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "取消关注请求",
   "account.direct": "发送私信给 @{name}",
   "account.domain_blocked": "网站已屏蔽",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "回复嘟文",
   "keyboard_shortcuts.requests": "打开关注请求列表",
   "keyboard_shortcuts.search": "选择搜索框",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "打开“开始使用”栏",
   "keyboard_shortcuts.toggle_hidden": "显示或隐藏被折叠的正文",
   "keyboard_shortcuts.toggle_sensitivity": "显示/隐藏媒体",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "剩余 {number, plural, one {# 分钟} other {# 分钟}}",
   "time_remaining.moments": "即将结束",
   "time_remaining.seconds": "剩余 {number, plural, one {# 秒} other {# 秒}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} 人正在讨论",
   "trends.trending_now": "现在流行",
   "ui.beforeunload": "如果你现在离开 Mastodon,你的草稿内容将会丢失。",
diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json
index 1ae125ba0..f3212049b 100644
--- a/app/javascript/mastodon/locales/zh-HK.json
+++ b/app/javascript/mastodon/locales/zh-HK.json
@@ -5,6 +5,7 @@
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的一切文章",
   "account.blocked": "封鎖",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "取消關注請求",
   "account.direct": "私訊 @{name}",
   "account.domain_blocked": "服務站被隱藏",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "回覆",
   "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "把標示移動到搜索",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "開啟「開始使用」欄位",
   "keyboard_shortcuts.toggle_hidden": "顯示或隱藏被標為敏感的文字",
   "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
   "time_remaining.moments": "剩餘時間",
   "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} 位用戶在討論",
   "trends.trending_now": "目前趨勢",
   "ui.beforeunload": "如果你現在離開 Mastodon,你的草稿內容將會被丟棄。",
diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json
index f4862cf86..62ef113ed 100644
--- a/app/javascript/mastodon/locales/zh-TW.json
+++ b/app/javascript/mastodon/locales/zh-TW.json
@@ -5,6 +5,7 @@
   "account.block": "封鎖 @{name}",
   "account.block_domain": "隱藏來自 {domain} 的所有內容",
   "account.blocked": "已封鎖",
+  "account.browse_more_on_origin_server": "Browse more on the original profile",
   "account.cancel_follow_request": "取消關注請求",
   "account.direct": "傳私訊給 @{name}",
   "account.domain_blocked": "已隱藏網域",
@@ -236,6 +237,7 @@
   "keyboard_shortcuts.reply": "回覆",
   "keyboard_shortcuts.requests": "開啟關注請求名單",
   "keyboard_shortcuts.search": "將焦點移至搜尋框",
+  "keyboard_shortcuts.spoilers": "to show/hide CW field",
   "keyboard_shortcuts.start": "開啟「開始使用」欄位",
   "keyboard_shortcuts.toggle_hidden": "顯示/隱藏在內容警告之後的正文",
   "keyboard_shortcuts.toggle_sensitivity": "顯示 / 隱藏媒體",
@@ -412,6 +414,10 @@
   "time_remaining.minutes": "剩餘{number, plural, one {# 分鐘} other {# 分鐘}}",
   "time_remaining.moments": "剩餘時間",
   "time_remaining.seconds": "剩餘 {number, plural, one {# 秒} other {# 秒}}",
+  "timeline_hint.remote_resource_not_displayed": "{resource} from other servers are not displayed.",
+  "timeline_hint.resources.followers": "Followers",
+  "timeline_hint.resources.follows": "Follows",
+  "timeline_hint.resources.statuses": "Older toots",
   "trends.count_by_accounts": "{count} 位使用者在討論",
   "trends.trending_now": "目前趨勢",
   "ui.beforeunload": "如果離開 Mastodon,你的草稿將會不見。",
diff --git a/app/javascript/styles/mastodon-light/variables.scss b/app/javascript/styles/mastodon-light/variables.scss
index c68944528..bc039ff03 100644
--- a/app/javascript/styles/mastodon-light/variables.scss
+++ b/app/javascript/styles/mastodon-light/variables.scss
@@ -39,3 +39,5 @@ $account-background-color: $white !default;
 @function lighten($color, $amount) {
   @return hsl(hue($color), saturation($color), lightness($color) - $amount);
 }
+
+$emojis-requiring-inversion: 'chains';
diff --git a/app/javascript/styles/mastodon/accessibility.scss b/app/javascript/styles/mastodon/accessibility.scss
index d33806c84..c5bcb5941 100644
--- a/app/javascript/styles/mastodon/accessibility.scss
+++ b/app/javascript/styles/mastodon/accessibility.scss
@@ -1,14 +1,13 @@
-$black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_square' 'black_medium_small_square' 'black_medium_square' 'black_nib' 'black_small_square' 'bomb' 'bowling' 'bust_in_silhouette' 'busts_in_silhouette' 'camera' 'camera_with_flash' 'clubs' 'copyright' 'curly_loop' 'currency_exchange' 'dark_sunglasses' 'eight_pointed_black_star' 'electric_plug' 'end' 'female-guard' 'film_projector' 'fried_egg' 'gorilla' 'guardsman' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'hocho' 'hole' 'joystick' 'kaaba' 'lower_left_ballpoint_pen' 'lower_left_fountain_pen' 'male-guard' 'microphone' 'mortar_board' 'movie_camera' 'musical_score' 'on' 'registered' 'soon' 'spades' 'speaking_head_in_silhouette' 'spider' 'telephone_receiver' 'tm' 'top' 'tophat' 'turkey' 'vhs' 'video_camera' 'video_game' 'water_buffalo' 'waving_black_flag' 'wavy_dash';
+$emojis-requiring-inversion: 'back' 'copyright' 'curly_loop' 'currency_exchange' 'end' 'heavy_check_mark' 'heavy_division_sign' 'heavy_dollar_sign' 'heavy_minus_sign' 'heavy_multiplication_x' 'heavy_plus_sign' 'on' 'registered' 'soon' 'spider' 'telephone_receiver' 'tm' 'top' 'wavy_dash' !default;
 
-%white-emoji-outline {
-  filter: drop-shadow(1px 1px 0 $white) drop-shadow(-1px 1px 0 $white) drop-shadow(1px -1px 0 $white) drop-shadow(-1px -1px 0 $white);
-  transform: scale(.71);
+%emoji-color-inversion {
+  filter: invert(1);
 }
 
 .emojione {
-  @each $emoji in $black-emojis {
+  @each $emoji in $emojis-requiring-inversion {
     &[title=':#{$emoji}:'] {
-      @extend %white-emoji-outline;
+      @extend %emoji-color-inversion;
     }
   }
 }
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 64f97c648..acbd21e8b 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -3097,6 +3097,11 @@ a.status-card {
   flex: 1 1 auto;
   overflow: hidden;
   padding: 14px 14px 14px 8px;
+
+  &--blurred {
+    filter: blur(2px);
+    pointer-events: none;
+  }
 }
 
 .status-card__description {
@@ -3134,7 +3139,8 @@ a.status-card {
     width: 100%;
   }
 
-  .status-card__image-image {
+  .status-card__image-image,
+  .status-card__image-preview {
     border-radius: 4px 4px 0 0;
   }
 
@@ -3179,6 +3185,24 @@ a.status-card.compact:hover {
   background-position: center center;
 }
 
+.status-card__image-preview {
+  border-radius: 4px 0 0 4px;
+  display: block;
+  margin: 0;
+  width: 100%;
+  height: 100%;
+  object-fit: fill;
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 0;
+  background: $base-overlay-background;
+
+  &--hidden {
+    display: none;
+  }
+}
+
 .load-more {
   display: block;
   color: $dark-text-color;
@@ -3203,6 +3227,31 @@ a.status-card.compact:hover {
   border-bottom: 1px solid lighten($ui-base-color, 8%);
 }
 
+.timeline-hint {
+  text-align: center;
+  color: $darker-text-color;
+  padding: 15px;
+  box-sizing: border-box;
+  width: 100%;
+  cursor: default;
+
+  strong {
+    font-weight: 500;
+  }
+
+  a {
+    color: lighten($ui-highlight-color, 8%);
+    text-decoration: none;
+
+    &:hover,
+    &:focus,
+    &:active {
+      text-decoration: underline;
+      color: lighten($ui-highlight-color, 12%);
+    }
+  }
+}
+
 .regeneration-indicator {
   text-align: center;
   font-size: 16px;
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 0e5b00e8f..7a0b2f9a3 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -587,7 +587,7 @@ code {
 
   &.alert {
     border: 1px solid rgba($error-value-color, 0.5);
-    background: rgba($error-value-color, 0.25);
+    background: rgba($error-value-color, 0.1);
     color: $error-value-color;
   }
 
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 572b8087e..3509a6c40 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -2,6 +2,45 @@
 
 class ActivityPub::Activity::Create < ActivityPub::Activity
   def perform
+    case @object['type']
+    when 'EncryptedMessage'
+      create_encrypted_message
+    else
+      create_status
+    end
+  end
+
+  private
+
+  def create_encrypted_message
+    return reject_payload! if invalid_origin?(@object['id']) || @options[:delivered_to_account_id].blank?
+
+    target_account = Account.find(@options[:delivered_to_account_id])
+    target_device  = target_account.devices.find_by(device_id: @object.dig('to', 'deviceId'))
+
+    return if target_device.nil?
+
+    target_device.encrypted_messages.create!(
+      from_account: @account,
+      from_device_id: @object.dig('attributedTo', 'deviceId'),
+      type: @object['messageType'],
+      body: @object['cipherText'],
+      digest: @object.dig('digest', 'digestValue'),
+      message_franking: message_franking.to_token
+    )
+  end
+
+  def message_franking
+    MessageFranking.new(
+      hmac: @object.dig('digest', 'digestValue'),
+      original_franking: @object['messageFranking'],
+      source_account_id: @account.id,
+      target_account_id: @options[:delivered_to_account_id],
+      timestamp: Time.now.utc
+    )
+  end
+
+  def create_status
     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|
@@ -23,8 +62,6 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
     @status
   end
 
-  private
-
   def audience_to
     @object['to'] || @json['to']
   end
@@ -262,6 +299,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   def poll_vote!
     poll = replied_to_status.preloadable_poll
     already_voted = true
+
     RedisLock.acquire(poll_lock_options) do |lock|
       if lock.acquired?
         already_voted = poll.votes.where(account: @account).exists?
@@ -270,20 +308,24 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
         raise Mastodon::RaceConditionError
       end
     end
+
     increment_voters_count! unless already_voted
     ActivityPub::DistributePollUpdateWorker.perform_in(3.minutes, replied_to_status.id) unless replied_to_status.preloadable_poll.hide_totals?
   end
 
   def resolve_thread(status)
     return unless status.reply? && status.thread.nil? && Request.valid_url?(in_reply_to_uri)
+
     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 unless replies.nil?
+
     uri = value_or_id(collection)
     ActivityPub::FetchRepliesWorker.perform_async(status.id, uri) unless uri.nil?
   end
@@ -291,6 +333,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
   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)
+
     begin
       Conversation.find_or_create_by!(uri: uri)
     rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique
@@ -404,6 +447,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   def skip_download?
     return @skip_download if defined?(@skip_download)
+
     @skip_download ||= DomainBlock.reject_media?(@account.domain)
   end
 
@@ -436,11 +480,13 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 
   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])
   end
 
   def increment_voters_count!
     poll = replied_to_status.preloadable_poll
+
     unless poll.voters_count.nil?
       poll.voters_count = poll.voters_count + 1
       poll.save
diff --git a/app/lib/activitypub/adapter.rb b/app/lib/activitypub/adapter.rb
index 78138fb73..634ed29fa 100644
--- a/app/lib/activitypub/adapter.rb
+++ b/app/lib/activitypub/adapter.rb
@@ -22,6 +22,7 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
     blurhash: { 'toot' => 'http://joinmastodon.org/ns#', 'blurhash' => 'toot:blurhash' },
     discoverable: { 'toot' => 'http://joinmastodon.org/ns#', 'discoverable' => 'toot:discoverable' },
     voters_count: { 'toot' => 'http://joinmastodon.org/ns#', 'votersCount' => 'toot:votersCount' },
+    olm: { 'toot' => 'http://joinmastodon.org/ns#', 'Device' => 'toot:Device', 'Ed25519Signature' => 'toot:Ed25519Signature', 'Ed25519Key' => 'toot:Ed25519Key', 'Curve25519Key' => 'toot:Curve25519Key', 'EncryptedMessage' => 'toot:EncryptedMessage', 'publicKeyBase64' => 'toot:publicKeyBase64', 'deviceId' => 'toot:deviceId', 'claim' => { '@type' => '@id', '@id' => 'toot:claim' }, 'fingerprintKey' => { '@type' => '@id', '@id' => 'toot:fingerprintKey' }, 'identityKey' => { '@type' => '@id', '@id' => 'toot:identityKey' }, 'devices' => { '@type' => '@id', '@id' => 'toot:devices' }, 'messageFranking' => 'toot:messageFranking', 'messageType' => 'toot:messageType', 'cipherText' => 'toot:cipherText' },
   }.freeze
 
   def self.default_key_transform
diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb
index 3ce182809..8b3198df7 100644
--- a/app/lib/feed_manager.rb
+++ b/app/lib/feed_manager.rb
@@ -287,9 +287,14 @@ class FeedManager
     combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) }
     status         = status.reblog if status.reblog?
 
-    !combined_regex.match(Formatter.instance.plaintext(status)).nil? ||
-      (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?) ||
-      (status.preloadable_poll && !combined_regex.match(status.preloadable_poll.options.join("\n\n")).nil?)
+    combined_text = [
+      Formatter.instance.plaintext(status),
+      status.spoiler_text,
+      status.preloadable_poll ? status.preloadable_poll.options.join("\n\n") : nil,
+      status.media_attachments.map(&:description).join("\n\n"),
+    ].compact.join("\n\n")
+
+    !combined_regex.match(combined_text).nil?
   end
 
   # Adds a status to an account's feed, returning true if a status was
diff --git a/app/lib/inline_renderer.rb b/app/lib/inline_renderer.rb
index 27e334a4d..b70814748 100644
--- a/app/lib/inline_renderer.rb
+++ b/app/lib/inline_renderer.rb
@@ -19,6 +19,8 @@ class InlineRenderer
       serializer = REST::AnnouncementSerializer
     when :reaction
       serializer = REST::ReactionSerializer
+    when :encrypted_message
+      serializer = REST::EncryptedMessageSerializer
     else
       return
     end
diff --git a/app/mailers/user_mailer.rb b/app/mailers/user_mailer.rb
index 88a11f761..2cd58e60a 100644
--- a/app/mailers/user_mailer.rb
+++ b/app/mailers/user_mailer.rb
@@ -126,4 +126,21 @@ class UserMailer < Devise::Mailer
            reply_to: Setting.site_contact_email
     end
   end
+
+  def sign_in_token(user, remote_ip, user_agent, timestamp)
+    @resource   = user
+    @instance   = Rails.configuration.x.local_domain
+    @remote_ip  = remote_ip
+    @user_agent = user_agent
+    @detection  = Browser.new(user_agent)
+    @timestamp  = timestamp.to_time.utc
+
+    return if @resource.disabled?
+
+    I18n.with_locale(@resource.locale || I18n.default_locale) do
+      mail to: @resource.email,
+           subject: I18n.t('user_mailer.sign_in_token.subject'),
+           reply_to: Setting.site_contact_email
+    end
+  end
 end
diff --git a/app/models/account.rb b/app/models/account.rb
index 5038d4768..0b3c48543 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -49,6 +49,7 @@
 #  hide_collections              :boolean
 #  avatar_storage_schema_version :integer
 #  header_storage_schema_version :integer
+#  devices_url                   :string
 #
 
 class Account < ApplicationRecord
diff --git a/app/models/concerns/account_associations.rb b/app/models/concerns/account_associations.rb
index 499edbf4e..cca3a17fa 100644
--- a/app/models/concerns/account_associations.rb
+++ b/app/models/concerns/account_associations.rb
@@ -9,6 +9,7 @@ module AccountAssociations
 
     # Identity proofs
     has_many :identity_proofs, class_name: 'AccountIdentityProof', dependent: :destroy, inverse_of: :account
+    has_many :devices, dependent: :destroy, inverse_of: :account
 
     # Timelines
     has_many :statuses, inverse_of: :account, dependent: :destroy
diff --git a/app/models/concerns/domain_normalizable.rb b/app/models/concerns/domain_normalizable.rb
index c00b3142f..fb84058fc 100644
--- a/app/models/concerns/domain_normalizable.rb
+++ b/app/models/concerns/domain_normalizable.rb
@@ -4,7 +4,7 @@ module DomainNormalizable
   extend ActiveSupport::Concern
 
   included do
-    before_save :normalize_domain
+    before_validation :normalize_domain
   end
 
   private
diff --git a/app/models/device.rb b/app/models/device.rb
new file mode 100644
index 000000000..97d0d2774
--- /dev/null
+++ b/app/models/device.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: devices
+#
+#  id              :bigint(8)        not null, primary key
+#  access_token_id :bigint(8)
+#  account_id      :bigint(8)
+#  device_id       :string           default(""), not null
+#  name            :string           default(""), not null
+#  fingerprint_key :text             default(""), not null
+#  identity_key    :text             default(""), not null
+#  created_at      :datetime         not null
+#  updated_at      :datetime         not null
+#
+
+class Device < ApplicationRecord
+  belongs_to :access_token, class_name: 'Doorkeeper::AccessToken'
+  belongs_to :account
+
+  has_many :one_time_keys, dependent: :destroy, inverse_of: :device
+  has_many :encrypted_messages, dependent: :destroy, inverse_of: :device
+
+  validates :name, :fingerprint_key, :identity_key, presence: true
+  validates :fingerprint_key, :identity_key, ed25519_key: true
+
+  before_save :invalidate_associations, if: -> { device_id_changed? || fingerprint_key_changed? || identity_key_changed? }
+
+  private
+
+  def invalidate_associations
+    one_time_keys.destroy_all
+    encrypted_messages.destroy_all
+  end
+end
diff --git a/app/models/domain_block.rb b/app/models/domain_block.rb
index f0a5bd296..2b18e01fa 100644
--- a/app/models/domain_block.rb
+++ b/app/models/domain_block.rb
@@ -50,11 +50,13 @@ class DomainBlock < ApplicationRecord
     def rule_for(domain)
       return if domain.blank?
 
-      uri      = Addressable::URI.new.tap { |u| u.host = domain.gsub(/[\/]/, '') }
+      uri      = Addressable::URI.new.tap { |u| u.host = domain.strip.gsub(/[\/]/, '') }
       segments = uri.normalized_host.split('.')
       variants = segments.map.with_index { |_, i| segments[i..-1].join('.') }
 
       where(domain: variants).order(Arel.sql('char_length(domain) desc')).first
+    rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
+      nil
     end
   end
 
diff --git a/app/models/encrypted_message.rb b/app/models/encrypted_message.rb
new file mode 100644
index 000000000..5e0aba434
--- /dev/null
+++ b/app/models/encrypted_message.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: encrypted_messages
+#
+#  id               :bigint(8)        not null, primary key
+#  device_id        :bigint(8)
+#  from_account_id  :bigint(8)
+#  from_device_id   :string           default(""), not null
+#  type             :integer          default(0), not null
+#  body             :text             default(""), not null
+#  digest           :text             default(""), not null
+#  message_franking :text             default(""), not null
+#  created_at       :datetime         not null
+#  updated_at       :datetime         not null
+#
+
+class EncryptedMessage < ApplicationRecord
+  self.inheritance_column = nil
+
+  include Paginable
+
+  scope :up_to, ->(id) { where(arel_table[:id].lteq(id)) }
+
+  belongs_to :device
+  belongs_to :from_account, class_name: 'Account'
+
+  around_create Mastodon::Snowflake::Callbacks
+
+  after_commit :push_to_streaming_api
+
+  private
+
+  def push_to_streaming_api
+    Rails.logger.info(streaming_channel)
+    Rails.logger.info(subscribed_to_timeline?)
+
+    return if destroyed? || !subscribed_to_timeline?
+
+    PushEncryptedMessageWorker.perform_async(id)
+  end
+
+  def subscribed_to_timeline?
+    Redis.current.exists("subscribed:#{streaming_channel}")
+  end
+
+  def streaming_channel
+    "timeline:#{device.account_id}:#{device.device_id}"
+  end
+end
diff --git a/app/models/message_franking.rb b/app/models/message_franking.rb
new file mode 100644
index 000000000..c72bd1cca
--- /dev/null
+++ b/app/models/message_franking.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class MessageFranking
+  attr_reader :hmac, :source_account_id, :target_account_id,
+              :timestamp, :original_franking
+
+  def initialize(attributes = {})
+    @hmac              = attributes[:hmac]
+    @source_account_id = attributes[:source_account_id]
+    @target_account_id = attributes[:target_account_id]
+    @timestamp         = attributes[:timestamp]
+    @original_franking = attributes[:original_franking]
+  end
+
+  def to_token
+    crypt = ActiveSupport::MessageEncryptor.new(SystemKey.current_key, serializer: Oj)
+    crypt.encrypt_and_sign(self)
+  end
+end
diff --git a/app/models/one_time_key.rb b/app/models/one_time_key.rb
new file mode 100644
index 000000000..8ada34824
--- /dev/null
+++ b/app/models/one_time_key.rb
@@ -0,0 +1,21 @@
+# frozen_string_literal: true
+# == Schema Information
+#
+# Table name: one_time_keys
+#
+#  id         :bigint(8)        not null, primary key
+#  device_id  :bigint(8)
+#  key_id     :string           default(""), not null
+#  key        :text             default(""), not null
+#  signature  :text             default(""), not null
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+
+class OneTimeKey < ApplicationRecord
+  belongs_to :device
+
+  validates :key_id, :key, :signature, presence: true
+  validates :key, ed25519_key: true
+  validates :signature, ed25519_signature: { message: :key, verify_key: ->(one_time_key) { one_time_key.device.fingerprint_key } }
+end
diff --git a/app/models/preview_card.rb b/app/models/preview_card.rb
index 2802f4667..235928260 100644
--- a/app/models/preview_card.rb
+++ b/app/models/preview_card.rb
@@ -23,19 +23,25 @@
 #  updated_at                   :datetime         not null
 #  embed_url                    :string           default(""), not null
 #  image_storage_schema_version :integer
+#  blurhash                     :string
 #
 
 class PreviewCard < ApplicationRecord
   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
   LIMIT = 1.megabytes
 
+  BLURHASH_OPTIONS = {
+    x_comp: 4,
+    y_comp: 4,
+  }.freeze
+
   self.inheritance_column = false
 
   enum type: [:link, :photo, :video, :rich]
 
   has_and_belongs_to_many :statuses
 
-  has_attached_file :image, styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 80 -strip' }
+  has_attached_file :image, processors: [:thumbnail, :blurhash_transcoder], styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 80 -strip' }
 
   include Attachmentable
 
@@ -72,6 +78,7 @@ class PreviewCard < ApplicationRecord
           geometry: '400x400>',
           file_geometry_parser: FastGeometryParser,
           convert_options: '-coalesce -strip',
+          blurhash: BLURHASH_OPTIONS,
         },
       }
 
diff --git a/app/models/system_key.rb b/app/models/system_key.rb
new file mode 100644
index 000000000..f17db7c2d
--- /dev/null
+++ b/app/models/system_key.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+# == Schema Information
+#
+# Table name: system_keys
+#
+#  id         :bigint(8)        not null, primary key
+#  key        :binary
+#  created_at :datetime         not null
+#  updated_at :datetime         not null
+#
+class SystemKey < ApplicationRecord
+  ROTATION_PERIOD = 1.week.freeze
+
+  before_validation :set_key
+
+  scope :expired, ->(now = Time.now.utc) { where(arel_table[:created_at].lt(now - ROTATION_PERIOD * 3)) }
+
+  class << self
+    def current_key
+      previous_key = order(id: :asc).last
+
+      if previous_key && previous_key.created_at >= ROTATION_PERIOD.ago
+        previous_key.key
+      else
+        create.key
+      end
+    end
+  end
+
+  private
+
+  def set_key
+    return if key.present?
+
+    cipher = OpenSSL::Cipher.new('AES-256-GCM')
+    cipher.encrypt
+
+    self.key = cipher.random_key
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index c8dbd2fd3..a05d98d88 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -38,6 +38,8 @@
 #  chosen_languages          :string           is an Array
 #  created_by_application_id :bigint(8)
 #  approved                  :boolean          default(TRUE), not null
+#  sign_in_token             :string
+#  sign_in_token_sent_at     :datetime
 #
 
 class User < ApplicationRecord
@@ -114,7 +116,7 @@ class User < ApplicationRecord
            :default_content_type, :system_emoji_font,
            to: :settings, prefix: :setting, allow_nil: false
 
-  attr_reader :invite_code
+  attr_reader :invite_code, :sign_in_token_attempt
   attr_writer :external
 
   def confirmed?
@@ -168,6 +170,10 @@ class User < ApplicationRecord
     true
   end
 
+  def suspicious_sign_in?(ip)
+    !otp_required_for_login? && current_sign_in_at.present? && current_sign_in_at < 2.weeks.ago && !recent_ip?(ip)
+  end
+
   def functional?
     confirmed? && approved? && !disabled? && !account.suspended?
   end
@@ -270,6 +276,13 @@ class User < ApplicationRecord
     super
   end
 
+  def external_or_valid_password?(compare_password)
+    # If encrypted_password is blank, we got the user from LDAP or PAM,
+    # so credentials are already valid
+
+    encrypted_password.blank? || valid_password?(compare_password)
+  end
+
   def send_reset_password_instructions
     return false if encrypted_password.blank?
 
@@ -305,6 +318,15 @@ class User < ApplicationRecord
     end
   end
 
+  def sign_in_token_expired?
+    sign_in_token_sent_at.nil? || sign_in_token_sent_at < 5.minutes.ago
+  end
+
+  def generate_sign_in_token
+    self.sign_in_token         = Devise.friendly_token(6)
+    self.sign_in_token_sent_at = Time.now.utc
+  end
+
   protected
 
   def send_devise_notification(notification, *args)
@@ -321,6 +343,10 @@ class User < ApplicationRecord
 
   private
 
+  def recent_ip?(ip)
+    recent_ips.any? { |(_, recent_ip)| recent_ip == ip }
+  end
+
   def send_pending_devise_notifications
     pending_devise_notifications.each do |notification, args|
       render_and_send_devise_message(notification, *args)
diff --git a/app/presenters/activitypub/activity_presenter.rb b/app/presenters/activitypub/activity_presenter.rb
new file mode 100644
index 000000000..5d174767f
--- /dev/null
+++ b/app/presenters/activitypub/activity_presenter.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+class ActivityPub::ActivityPresenter < ActiveModelSerializers::Model
+  attributes :id, :type, :actor, :published, :to, :cc, :virtual_object
+
+  class << self
+    def from_status(status)
+      new.tap do |presenter|
+        presenter.id        = ActivityPub::TagManager.instance.activity_uri_for(status)
+        presenter.type      = status.reblog? ? 'Announce' : 'Create'
+        presenter.actor     = ActivityPub::TagManager.instance.uri_for(status.account)
+        presenter.published = status.created_at
+        presenter.to        = ActivityPub::TagManager.instance.to(status)
+        presenter.cc        = ActivityPub::TagManager.instance.cc(status)
+
+        presenter.virtual_object = begin
+          if status.reblog?
+            if status.account == status.proper.account && status.proper.private_visibility? && status.local?
+              status.proper
+            else
+              ActivityPub::TagManager.instance.uri_for(status.proper)
+            end
+          else
+            status.proper
+          end
+        end
+      end
+    end
+
+    def from_encrypted_message(encrypted_message)
+      new.tap do |presenter|
+        presenter.id = ActivityPub::TagManager.instance.generate_uri_for(nil)
+        presenter.type = 'Create'
+        presenter.actor = ActivityPub::TagManager.instance.uri_for(encrypted_message.source_account)
+        presenter.published = Time.now.utc
+        presenter.to = ActivityPub::TagManager.instance.uri_for(encrypted_message.target_account)
+        presenter.virtual_object = encrypted_message
+      end
+    end
+  end
+end
diff --git a/app/presenters/initial_state_presenter.rb b/app/presenters/initial_state_presenter.rb
index 70c496be8..06482935c 100644
--- a/app/presenters/initial_state_presenter.rb
+++ b/app/presenters/initial_state_presenter.rb
@@ -2,5 +2,5 @@
 
 class InitialStatePresenter < ActiveModelSerializers::Model
   attributes :settings, :push_subscription, :token,
-             :current_account, :admin, :text
+             :current_account, :admin, :text, :visibility
 end
diff --git a/app/serializers/activitypub/activity_serializer.rb b/app/serializers/activitypub/activity_serializer.rb
index d0edad786..5bdf53f03 100644
--- a/app/serializers/activitypub/activity_serializer.rb
+++ b/app/serializers/activitypub/activity_serializer.rb
@@ -1,52 +1,22 @@
 # frozen_string_literal: true
 
 class ActivityPub::ActivitySerializer < ActivityPub::Serializer
-  attributes :id, :type, :actor, :published, :to, :cc
-
-  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
-    ActivityPub::TagManager.instance.activity_uri_for(object)
+  def self.serializer_for(model, options)
+    case model.class.name
+    when 'Status'
+      ActivityPub::NoteSerializer
+    when 'DeliverToDeviceService::EncryptedMessage'
+      ActivityPub::EncryptedMessageSerializer
+    else
+      super
+    end
   end
 
-  def type
-    announce? ? 'Announce' : 'Create'
-  end
+  attributes :id, :type, :actor, :published, :to, :cc
 
-  def actor
-    ActivityPub::TagManager.instance.uri_for(object.account)
-  end
+  has_one :virtual_object, key: :object
 
   def published
-    object.created_at.iso8601
-  end
-
-  def to
-    ActivityPub::TagManager.instance.to(object)
-  end
-
-  def cc
-    ActivityPub::TagManager.instance.cc(object)
-  end
-
-  def proper_uri
-    ActivityPub::TagManager.instance.uri_for(object.proper)
-  end
-
-  def atom_uri
-    OStatus::TagManager.instance.uri_for(object)
-  end
-
-  def announce?
-    object.reblog?
-  end
-
-  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?
+    object.published.iso8601
   end
 end
diff --git a/app/serializers/activitypub/actor_serializer.rb b/app/serializers/activitypub/actor_serializer.rb
index aa64936a7..627d4446b 100644
--- a/app/serializers/activitypub/actor_serializer.rb
+++ b/app/serializers/activitypub/actor_serializer.rb
@@ -7,7 +7,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
 
   context_extensions :manually_approves_followers, :featured, :also_known_as,
                      :moved_to, :property_value, :identity_proof,
-                     :discoverable
+                     :discoverable, :olm
 
   attributes :id, :type, :following, :followers,
              :inbox, :outbox, :featured,
@@ -20,6 +20,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   has_many :virtual_tags, key: :tag
   has_many :virtual_attachments, key: :attachment
 
+  attribute :devices, unless: :instance_actor?
   attribute :moved_to, if: :moved?
   attribute :also_known_as, if: :also_known_as?
 
@@ -38,7 +39,7 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
   has_one :icon,  serializer: ActivityPub::ImageSerializer, if: :avatar_exists?
   has_one :image, serializer: ActivityPub::ImageSerializer, if: :header_exists?
 
-  delegate :moved?, to: :object
+  delegate :moved?, :instance_actor?, to: :object
 
   def id
     object.instance_actor? ? instance_actor_url : account_url(object)
@@ -68,6 +69,10 @@ class ActivityPub::ActorSerializer < ActivityPub::Serializer
     object.instance_actor? ? instance_actor_inbox_url : account_inbox_url(object)
   end
 
+  def devices
+    account_collection_url(object, :devices)
+  end
+
   def outbox
     account_outbox_url(object)
   end
diff --git a/app/serializers/activitypub/collection_serializer.rb b/app/serializers/activitypub/collection_serializer.rb
index da1ba735f..ea7af5433 100644
--- a/app/serializers/activitypub/collection_serializer.rb
+++ b/app/serializers/activitypub/collection_serializer.rb
@@ -1,10 +1,28 @@
 # frozen_string_literal: true
 
 class ActivityPub::CollectionSerializer < ActivityPub::Serializer
+  class StringSerializer < ActiveModel::Serializer
+    # Despite the name, it does not return a hash, but the same can be said of
+    # the ActiveModel::Serializer::CollectionSerializer class which handles
+    # arrays.
+    def serializable_hash(*_args)
+      object
+    end
+  end
+
   def self.serializer_for(model, options)
-    return ActivityPub::NoteSerializer if model.class.name == 'Status'
-    return ActivityPub::CollectionSerializer if model.class.name == 'ActivityPub::CollectionPresenter'
-    super
+    case model.class.name
+    when 'Status'
+      ActivityPub::NoteSerializer
+    when 'Device'
+      ActivityPub::DeviceSerializer
+    when 'ActivityPub::CollectionPresenter'
+      ActivityPub::CollectionSerializer
+    when 'String'
+      StringSerializer
+    else
+      super
+    end
   end
 
   attribute :id, if: -> { object.id.present? }
diff --git a/app/serializers/activitypub/device_serializer.rb b/app/serializers/activitypub/device_serializer.rb
new file mode 100644
index 000000000..5f0fdc8af
--- /dev/null
+++ b/app/serializers/activitypub/device_serializer.rb
@@ -0,0 +1,52 @@
+# frozen_string_literal: true
+
+class ActivityPub::DeviceSerializer < ActivityPub::Serializer
+  context_extensions :olm
+
+  include RoutingHelper
+
+  class FingerprintKeySerializer < ActivityPub::Serializer
+    attributes :type, :public_key_base64
+
+    def type
+      'Ed25519Key'
+    end
+
+    def public_key_base64
+      object.fingerprint_key
+    end
+  end
+
+  class IdentityKeySerializer < ActivityPub::Serializer
+    attributes :type, :public_key_base64
+
+    def type
+      'Curve25519Key'
+    end
+
+    def public_key_base64
+      object.identity_key
+    end
+  end
+
+  attributes :device_id, :type, :name, :claim
+
+  has_one :fingerprint_key, serializer: FingerprintKeySerializer
+  has_one :identity_key, serializer: IdentityKeySerializer
+
+  def type
+    'Device'
+  end
+
+  def claim
+    account_claim_url(object.account, id: object.device_id)
+  end
+
+  def fingerprint_key
+    object
+  end
+
+  def identity_key
+    object
+  end
+end
diff --git a/app/serializers/activitypub/encrypted_message_serializer.rb b/app/serializers/activitypub/encrypted_message_serializer.rb
new file mode 100644
index 000000000..3c525d23e
--- /dev/null
+++ b/app/serializers/activitypub/encrypted_message_serializer.rb
@@ -0,0 +1,61 @@
+# frozen_string_literal: true
+
+class ActivityPub::EncryptedMessageSerializer < ActivityPub::Serializer
+  context :security
+
+  context_extensions :olm
+
+  class DeviceSerializer < ActivityPub::Serializer
+    attributes :type, :device_id
+
+    def type
+      'Device'
+    end
+
+    def device_id
+      object
+    end
+  end
+
+  class DigestSerializer < ActivityPub::Serializer
+    attributes :type, :digest_algorithm, :digest_value
+
+    def type
+      'Digest'
+    end
+
+    def digest_algorithm
+      'http://www.w3.org/2000/09/xmldsig#hmac-sha256'
+    end
+
+    def digest_value
+      object
+    end
+  end
+
+  attributes :type, :message_type, :cipher_text, :message_franking
+
+  has_one :attributed_to, serializer: DeviceSerializer
+  has_one :to, serializer: DeviceSerializer
+  has_one :digest, serializer: DigestSerializer
+
+  def type
+    'EncryptedMessage'
+  end
+
+  def attributed_to
+    object.source_device.device_id
+  end
+
+  def to
+    object.target_device_id
+  end
+
+  def message_type
+    object.type
+  end
+
+  def cipher_text
+    object.body
+  end
+end
diff --git a/app/serializers/activitypub/one_time_key_serializer.rb b/app/serializers/activitypub/one_time_key_serializer.rb
new file mode 100644
index 000000000..5932eb5b5
--- /dev/null
+++ b/app/serializers/activitypub/one_time_key_serializer.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+class ActivityPub::OneTimeKeySerializer < ActivityPub::Serializer
+  context :security
+
+  context_extensions :olm
+
+  class SignatureSerializer < ActivityPub::Serializer
+    attributes :type, :signature_value
+
+    def type
+      'Ed25519Signature'
+    end
+
+    def signature_value
+      object.signature
+    end
+  end
+
+  attributes :key_id, :type, :public_key_base64
+
+  has_one :signature, serializer: SignatureSerializer
+
+  def type
+    'Curve25519Key'
+  end
+
+  def public_key_base64
+    object.key
+  end
+
+  def signature
+    object
+  end
+end
diff --git a/app/serializers/activitypub/outbox_serializer.rb b/app/serializers/activitypub/outbox_serializer.rb
index 48fbad0fd..4f4f950a5 100644
--- a/app/serializers/activitypub/outbox_serializer.rb
+++ b/app/serializers/activitypub/outbox_serializer.rb
@@ -2,7 +2,14 @@
 
 class ActivityPub::OutboxSerializer < ActivityPub::CollectionSerializer
   def self.serializer_for(model, options)
-    return ActivityPub::ActivitySerializer if model.is_a?(Status)
-    super
+    if model.class.name == 'ActivityPub::ActivityPresenter'
+      ActivityPub::ActivitySerializer
+    else
+      super
+    end
+  end
+
+  def items
+    object.items.map { |status| ActivityPub::ActivityPresenter.from_status(status) }
   end
 end
diff --git a/app/serializers/activitypub/undo_announce_serializer.rb b/app/serializers/activitypub/undo_announce_serializer.rb
index 6758af679..a925efc18 100644
--- a/app/serializers/activitypub/undo_announce_serializer.rb
+++ b/app/serializers/activitypub/undo_announce_serializer.rb
@@ -3,7 +3,7 @@
 class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
   attributes :id, :type, :actor, :to
 
-  has_one :object, serializer: ActivityPub::ActivitySerializer
+  has_one :virtual_object, key: :object, serializer: ActivityPub::ActivitySerializer
 
   def id
     [ActivityPub::TagManager.instance.uri_for(object.account), '#announces/', object.id, '/undo'].join
@@ -20,4 +20,8 @@ class ActivityPub::UndoAnnounceSerializer < ActivityPub::Serializer
   def to
     [ActivityPub::TagManager::COLLECTIONS[:public]]
   end
+
+  def virtual_object
+    ActivityPub::ActivityPresenter.from_status(object)
+  end
 end
diff --git a/app/serializers/initial_state_serializer.rb b/app/serializers/initial_state_serializer.rb
index e5e88c200..c520c9bcb 100644
--- a/app/serializers/initial_state_serializer.rb
+++ b/app/serializers/initial_state_serializer.rb
@@ -72,7 +72,7 @@ class InitialStateSerializer < ActiveModel::Serializer
 
     if object.current_account
       store[:me]                = object.current_account.id.to_s
-      store[:default_privacy]   = object.current_account.user.setting_default_privacy
+      store[:default_privacy]   = object.visibility || object.current_account.user.setting_default_privacy
       store[:default_sensitive] = object.current_account.user.setting_default_sensitive
     end
 
diff --git a/app/serializers/rest/encrypted_message_serializer.rb b/app/serializers/rest/encrypted_message_serializer.rb
new file mode 100644
index 000000000..80c26d060
--- /dev/null
+++ b/app/serializers/rest/encrypted_message_serializer.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class REST::EncryptedMessageSerializer < ActiveModel::Serializer
+  attributes :id, :account_id, :device_id,
+             :type, :body, :digest, :message_franking,
+             :created_at
+
+  def id
+    object.id.to_s
+  end
+
+  def account_id
+    object.from_account_id.to_s
+  end
+
+  def device_id
+    object.from_device_id
+  end
+end
diff --git a/app/serializers/rest/keys/claim_result_serializer.rb b/app/serializers/rest/keys/claim_result_serializer.rb
new file mode 100644
index 000000000..145044f55
--- /dev/null
+++ b/app/serializers/rest/keys/claim_result_serializer.rb
@@ -0,0 +1,9 @@
+# frozen_string_literal: true
+
+class REST::Keys::ClaimResultSerializer < ActiveModel::Serializer
+  attributes :account_id, :device_id, :key_id, :key, :signature
+
+  def account_id
+    object.account.id.to_s
+  end
+end
diff --git a/app/serializers/rest/keys/device_serializer.rb b/app/serializers/rest/keys/device_serializer.rb
new file mode 100644
index 000000000..f9b821b79
--- /dev/null
+++ b/app/serializers/rest/keys/device_serializer.rb
@@ -0,0 +1,6 @@
+# frozen_string_literal: true
+
+class REST::Keys::DeviceSerializer < ActiveModel::Serializer
+  attributes :device_id, :name, :identity_key,
+             :fingerprint_key
+end
diff --git a/app/serializers/rest/keys/query_result_serializer.rb b/app/serializers/rest/keys/query_result_serializer.rb
new file mode 100644
index 000000000..8f8bdde28
--- /dev/null
+++ b/app/serializers/rest/keys/query_result_serializer.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class REST::Keys::QueryResultSerializer < ActiveModel::Serializer
+  attributes :account_id
+
+  has_many :devices, serializer: REST::Keys::DeviceSerializer
+
+  def account_id
+    object.account.id.to_s
+  end
+end
diff --git a/app/serializers/rest/preview_card_serializer.rb b/app/serializers/rest/preview_card_serializer.rb
index 2df9d07a7..66ff47d22 100644
--- a/app/serializers/rest/preview_card_serializer.rb
+++ b/app/serializers/rest/preview_card_serializer.rb
@@ -6,7 +6,7 @@ class REST::PreviewCardSerializer < ActiveModel::Serializer
   attributes :url, :title, :description, :type,
              :author_name, :author_url, :provider_name,
              :provider_url, :html, :width, :height,
-             :image, :embed_url
+             :image, :embed_url, :blurhash
 
   def image
     object.image? ? full_asset_url(object.image.url(:original)) : nil
diff --git a/app/services/activitypub/process_account_service.rb b/app/services/activitypub/process_account_service.rb
index 7b4c53d50..f4276cece 100644
--- a/app/services/activitypub/process_account_service.rb
+++ b/app/services/activitypub/process_account_service.rb
@@ -76,6 +76,7 @@ class ActivityPub::ProcessAccountService < BaseService
     @account.shared_inbox_url        = (@json['endpoints'].is_a?(Hash) ? @json['endpoints']['sharedInbox'] : @json['sharedInbox']) || ''
     @account.followers_url           = @json['followers'] || ''
     @account.featured_collection_url = @json['featured'] || ''
+    @account.devices_url             = @json['devices'] || ''
     @account.url                     = url || @uri
     @account.uri                     = @uri
     @account.display_name            = @json['name'] || ''
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index 989fd6784..749c84736 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -22,7 +22,7 @@ class BackupService < BaseService
 
     account.statuses.with_includes.reorder(nil).find_in_batches do |statuses|
       statuses.each do |status|
-        item = serialize_payload(status, ActivityPub::ActivitySerializer, signer: @account, allow_local_only: true)
+        item = serialize_payload(ActivityPub::ActivityPresenter.from_status(status), ActivityPub::ActivitySerializer, signer: @account, allow_local_only: true)
         item.delete(:'@context')
 
         unless item[:type] == 'Announce' || item[:object][:attachment].blank?
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index 9f0860674..dc23ef8d8 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -26,59 +26,20 @@ class BlockDomainService < BaseService
       suspend_accounts!
     end
 
-    clear_media! if domain_block.reject_media?
-  end
-
-  def invalidate_association_caches!
-    # Normally, associated models of a status are immutable (except for accounts)
-    # so they are aggressively cached. After updating the media attachments to no
-    # longer point to a local file, we need to clear the cache to make those
-    # changes appear in the API and UI
-    @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+    DomainClearMediaWorker.perform_async(domain_block.id) if domain_block.reject_media?
   end
 
   def silence_accounts!
     blocked_domain_accounts.without_silenced.in_batches.update_all(silenced_at: @domain_block.created_at)
   end
 
-  def clear_media!
-    @affected_status_ids = []
-
-    clear_account_images!
-    clear_account_attachments!
-    clear_emojos!
-
-    invalidate_association_caches!
-  end
-
   def suspend_accounts!
-    blocked_domain_accounts.without_suspended.reorder(nil).find_each do |account|
+    blocked_domain_accounts.without_suspended.in_batches.update_all(suspended_at: @domain_block.created_at)
+    blocked_domain_accounts.where(suspended_at: @domain_block.created_at).reorder(nil).find_each do |account|
       SuspendAccountService.new.call(account, reserve_username: true, suspended_at: @domain_block.created_at)
     end
   end
 
-  def clear_account_images!
-    blocked_domain_accounts.reorder(nil).find_each do |account|
-      account.avatar.destroy if account.avatar.exists?
-      account.header.destroy if account.header.exists?
-      account.save
-    end
-  end
-
-  def clear_account_attachments!
-    media_from_blocked_domain.reorder(nil).find_each do |attachment|
-      @affected_status_ids << attachment.status_id if attachment.status_id.present?
-
-      attachment.file.destroy if attachment.file.exists?
-      attachment.type = :unknown
-      attachment.save
-    end
-  end
-
-  def clear_emojos!
-    emojis_from_blocked_domains.destroy_all
-  end
-
   def blocked_domain
     domain_block.domain
   end
@@ -86,12 +47,4 @@ class BlockDomainService < BaseService
   def blocked_domain_accounts
     Account.by_domain_and_subdomains(blocked_domain)
   end
-
-  def media_from_blocked_domain
-    MediaAttachment.joins(:account).merge(blocked_domain_accounts).reorder(nil)
-  end
-
-  def emojis_from_blocked_domains
-    CustomEmoji.by_domain_and_subdomains(blocked_domain)
-  end
 end
diff --git a/app/services/clear_domain_media_service.rb b/app/services/clear_domain_media_service.rb
new file mode 100644
index 000000000..704cfb71a
--- /dev/null
+++ b/app/services/clear_domain_media_service.rb
@@ -0,0 +1,70 @@
+# frozen_string_literal: true
+
+class ClearDomainMediaService < BaseService
+  attr_reader :domain_block
+
+  def call(domain_block)
+    @domain_block = domain_block
+    clear_media! if domain_block.reject_media?
+  end
+
+  private
+
+  def invalidate_association_caches!
+    # Normally, associated models of a status are immutable (except for accounts)
+    # so they are aggressively cached. After updating the media attachments to no
+    # longer point to a local file, we need to clear the cache to make those
+    # changes appear in the API and UI
+    @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+  end
+
+  def clear_media!
+    @affected_status_ids = []
+
+    begin
+      clear_account_images!
+      clear_account_attachments!
+      clear_emojos!
+    ensure
+      invalidate_association_caches!
+    end
+  end
+
+  def clear_account_images!
+    blocked_domain_accounts.reorder(nil).find_each do |account|
+      account.avatar.destroy if account.avatar&.exists?
+      account.header.destroy if account.header&.exists?
+      account.save
+    end
+  end
+
+  def clear_account_attachments!
+    media_from_blocked_domain.reorder(nil).find_each do |attachment|
+      @affected_status_ids << attachment.status_id if attachment.status_id.present?
+
+      attachment.file.destroy if attachment.file&.exists?
+      attachment.type = :unknown
+      attachment.save
+    end
+  end
+
+  def clear_emojos!
+    emojis_from_blocked_domains.destroy_all
+  end
+
+  def blocked_domain
+    domain_block.domain
+  end
+
+  def blocked_domain_accounts
+    Account.by_domain_and_subdomains(blocked_domain)
+  end
+
+  def media_from_blocked_domain
+    MediaAttachment.joins(:account).merge(blocked_domain_accounts).reorder(nil)
+  end
+
+  def emojis_from_blocked_domains
+    CustomEmoji.by_domain_and_subdomains(blocked_domain)
+  end
+end
diff --git a/app/services/concerns/payloadable.rb b/app/services/concerns/payloadable.rb
index 7f9f21c4b..3e45570c3 100644
--- a/app/services/concerns/payloadable.rb
+++ b/app/services/concerns/payloadable.rb
@@ -5,8 +5,9 @@ module Payloadable
     signer    = options.delete(:signer)
     sign_with = options.delete(:sign_with)
     payload   = ActiveModelSerializers::SerializableResource.new(record, options.merge(serializer: serializer, adapter: ActivityPub::Adapter)).as_json
+    object    = record.respond_to?(:virtual_object) ? record.virtual_object : record
 
-    if (record.respond_to?(:sign?) && record.sign?) && signer && signing_enabled?
+    if (object.respond_to?(:sign?) && object.sign?) && signer && signing_enabled?
       ActivityPub::LinkedDataSignature.new(payload).sign!(signer, sign_with: sign_with)
     else
       payload
diff --git a/app/services/deliver_to_device_service.rb b/app/services/deliver_to_device_service.rb
new file mode 100644
index 000000000..71711945c
--- /dev/null
+++ b/app/services/deliver_to_device_service.rb
@@ -0,0 +1,78 @@
+# frozen_string_literal: true
+
+class DeliverToDeviceService < BaseService
+  include Payloadable
+
+  class EncryptedMessage < ActiveModelSerializers::Model
+    attributes :source_account, :target_account, :source_device,
+               :target_device_id, :type, :body, :digest,
+               :message_franking
+  end
+
+  def call(source_account, source_device, options = {})
+    @source_account   = source_account
+    @source_device    = source_device
+    @target_account   = Account.find(options[:account_id])
+    @target_device_id = options[:device_id]
+    @body             = options[:body]
+    @type             = options[:type]
+    @hmac             = options[:hmac]
+
+    set_message_franking!
+
+    if @target_account.local?
+      deliver_to_local!
+    else
+      deliver_to_remote!
+    end
+  end
+
+  private
+
+  def set_message_franking!
+    @message_franking = message_franking.to_token
+  end
+
+  def deliver_to_local!
+    target_device = @target_account.devices.find_by!(device_id: @target_device_id)
+
+    target_device.encrypted_messages.create!(
+      from_account: @source_account,
+      from_device_id: @source_device.device_id,
+      type: @type,
+      body: @body,
+      digest: @hmac,
+      message_franking: @message_franking
+    )
+  end
+
+  def deliver_to_remote!
+    ActivityPub::DeliveryWorker.perform_async(
+      Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_encrypted_message(encrypted_message), ActivityPub::ActivitySerializer)),
+      @source_account.id,
+      @target_account.inbox_url
+    )
+  end
+
+  def message_franking
+    MessageFranking.new(
+      source_account_id: @source_account.id,
+      target_account_id: @target_account.id,
+      hmac: @hmac,
+      timestamp: Time.now.utc
+    )
+  end
+
+  def encrypted_message
+    EncryptedMessage.new(
+      source_account: @source_account,
+      target_account: @target_account,
+      source_device: @source_device,
+      target_device_id: @target_device_id,
+      type: @type,
+      body: @body,
+      digest: @hmac,
+      message_franking: @message_franking
+    )
+  end
+end
diff --git a/app/services/import_service.rb b/app/services/import_service.rb
index c0d741d57..4cad93767 100644
--- a/app/services/import_service.rb
+++ b/app/services/import_service.rb
@@ -81,7 +81,9 @@ class ImportService < BaseService
       end
     end
 
-    Import::RelationshipWorker.push_bulk(items) do |acct, extra|
+    head_items = items.uniq { |acct, _| acct.split('@')[1] }
+    tail_items = items - head_items
+    Import::RelationshipWorker.push_bulk(head_items + tail_items) do |acct, extra|
       [@account.id, acct, action, extra]
     end
   end
diff --git a/app/services/keys/claim_service.rb b/app/services/keys/claim_service.rb
new file mode 100644
index 000000000..672119130
--- /dev/null
+++ b/app/services/keys/claim_service.rb
@@ -0,0 +1,77 @@
+# frozen_string_literal: true
+
+class Keys::ClaimService < BaseService
+  HEADERS = { 'Content-Type' => 'application/activity+json' }.freeze
+
+  class Result < ActiveModelSerializers::Model
+    attributes :account, :device_id, :key_id,
+               :key, :signature
+
+    def initialize(account, device_id, key_attributes = {})
+      @account   = account
+      @device_id = device_id
+      @key_id    = key_attributes[:key_id]
+      @key       = key_attributes[:key]
+      @signature = key_attributes[:signature]
+    end
+  end
+
+  def call(source_account, target_account_id, device_id)
+    @source_account = source_account
+    @target_account = Account.find(target_account_id)
+    @device_id      = device_id
+
+    if @target_account.local?
+      claim_local_key!
+    else
+      claim_remote_key!
+    end
+  rescue ActiveRecord::RecordNotFound
+    nil
+  end
+
+  private
+
+  def claim_local_key!
+    device = @target_account.devices.find_by(device_id: @device_id)
+    key    = nil
+
+    ApplicationRecord.transaction do
+      key = device.one_time_keys.order(Arel.sql('random()')).first!
+      key.destroy!
+    end
+
+    @result = Result.new(@target_account, @device_id, key)
+  end
+
+  def claim_remote_key!
+    query_result = QueryService.new.call(@target_account)
+    device       = query_result.find(@device_id)
+
+    return unless device.present? && device.valid_claim_url?
+
+    json = fetch_resource_with_post(device.claim_url)
+
+    return unless json.present? && json['publicKeyBase64'].present?
+
+    @result = Result.new(@target_account, @device_id, key_id: json['id'], key: json['publicKeyBase64'], signature: json.dig('signature', 'signatureValue'))
+  rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error => e
+    Rails.logger.debug "Claiming one-time key for #{@target_account.acct}:#{@device_id} failed: #{e}"
+    nil
+  end
+
+  def fetch_resource_with_post(uri)
+    build_post_request(uri).perform do |response|
+      raise Mastodon::UnexpectedResponseError, response unless response_successful?(response) || response_error_unsalvageable?(response)
+
+      body_to_json(response.body_with_limit) if response.code == 200
+    end
+  end
+
+  def build_post_request(uri)
+    Request.new(:post, uri).tap do |request|
+      request.on_behalf_of(@source_account, :uri)
+      request.add_headers(HEADERS)
+    end
+  end
+end
diff --git a/app/services/keys/query_service.rb b/app/services/keys/query_service.rb
new file mode 100644
index 000000000..286fbd834
--- /dev/null
+++ b/app/services/keys/query_service.rb
@@ -0,0 +1,75 @@
+# frozen_string_literal: true
+
+class Keys::QueryService < BaseService
+  include JsonLdHelper
+
+  class Result < ActiveModelSerializers::Model
+    attributes :account, :devices
+
+    def initialize(account, devices)
+      @account = account
+      @devices = devices || []
+    end
+
+    def find(device_id)
+      @devices.find { |device| device.device_id == device_id }
+    end
+  end
+
+  class Device < ActiveModelSerializers::Model
+    attributes :device_id, :name, :identity_key, :fingerprint_key
+
+    def initialize(attributes = {})
+      @device_id       = attributes[:device_id]
+      @name            = attributes[:name]
+      @identity_key    = attributes[:identity_key]
+      @fingerprint_key = attributes[:fingerprint_key]
+      @claim_url       = attributes[:claim_url]
+    end
+
+    def valid_claim_url?
+      return false if @claim_url.blank?
+
+      begin
+        parsed_url = Addressable::URI.parse(@claim_url).normalize
+      rescue Addressable::URI::InvalidURIError
+        return false
+      end
+
+      %w(http https).include?(parsed_url.scheme) && parsed_url.host.present?
+    end
+  end
+
+  def call(account)
+    @account = account
+
+    if @account.local?
+      query_local_devices!
+    else
+      query_remote_devices!
+    end
+
+    Result.new(@account, @devices)
+  end
+
+  private
+
+  def query_local_devices!
+    @devices = @account.devices.map { |device| Device.new(device) }
+  end
+
+  def query_remote_devices!
+    return if @account.devices_url.blank?
+
+    json = fetch_resource(@account.devices_url)
+
+    return if json['items'].blank?
+
+    @devices = json['items'].map do |device|
+      Device.new(device_id: device['id'], name: device['name'], identity_key: device.dig('identityKey', 'publicKeyBase64'), fingerprint_key: device.dig('fingerprintKey', 'publicKeyBase64'), claim_url: device['claim'])
+    end
+  rescue HTTP::Error, OpenSSL::SSL::SSLError, Mastodon::Error => e
+    Rails.logger.debug "Querying devices for #{@account.acct} failed: #{e}"
+    nil
+  end
+end
diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb
index 3c257451c..65a3f64b8 100644
--- a/app/services/process_mentions_service.rb
+++ b/app/services/process_mentions_service.rb
@@ -65,7 +65,7 @@ class ProcessMentionsService < BaseService
 
   def activitypub_json
     return @activitypub_json if defined?(@activitypub_json)
-    @activitypub_json = Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
+    @activitypub_json = Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @status.account))
   end
 
   def resolve_account_service
diff --git a/app/services/reblog_service.rb b/app/services/reblog_service.rb
index 0a46509f8..6cecb5ac4 100644
--- a/app/services/reblog_service.rb
+++ b/app/services/reblog_service.rb
@@ -60,6 +60,6 @@ class ReblogService < BaseService
   end
 
   def build_json(reblog)
-    Oj.dump(serialize_payload(reblog, ActivityPub::ActivitySerializer, signer: reblog.account))
+    Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(reblog), ActivityPub::ActivitySerializer, signer: reblog.account))
   end
 end
diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb
index 17ace100c..ba77552c6 100644
--- a/app/services/resolve_account_service.rb
+++ b/app/services/resolve_account_service.rb
@@ -112,6 +112,8 @@ class ResolveAccountService < BaseService
   end
 
   def webfinger_update_due?
+    return false if @options[:check_delivery_availability] && !DeliveryFailureTracker.available?(@domain)
+
     @account.nil? || ((!@options[:skip_webfinger] || @account.ostatus?) && @account.possibly_stale?)
   end
 
diff --git a/app/validators/ed25519_key_validator.rb b/app/validators/ed25519_key_validator.rb
new file mode 100644
index 000000000..00a448d5a
--- /dev/null
+++ b/app/validators/ed25519_key_validator.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+class Ed25519KeyValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+
+    key = Base64.decode64(value)
+
+    record.errors[attribute] << I18n.t('crypto.errors.invalid_key') unless verified?(key)
+  end
+
+  private
+
+  def verified?(key)
+    Ed25519.validate_key_bytes(key)
+  rescue ArgumentError
+    false
+  end
+end
diff --git a/app/validators/ed25519_signature_validator.rb b/app/validators/ed25519_signature_validator.rb
new file mode 100644
index 000000000..77a21b837
--- /dev/null
+++ b/app/validators/ed25519_signature_validator.rb
@@ -0,0 +1,29 @@
+# frozen_string_literal: true
+
+class Ed25519SignatureValidator < ActiveModel::EachValidator
+  def validate_each(record, attribute, value)
+    return if value.blank?
+
+    verify_key = Ed25519::VerifyKey.new(Base64.decode64(option_to_value(record, :verify_key)))
+    signature  = Base64.decode64(value)
+    message    = option_to_value(record, :message)
+
+    record.errors[attribute] << I18n.t('crypto.errors.invalid_signature') unless verified?(verify_key, signature, message)
+  end
+
+  private
+
+  def verified?(verify_key, signature, message)
+    verify_key.verify(signature, message)
+  rescue Ed25519::VerifyError, ArgumentError
+    false
+  end
+
+  def option_to_value(record, key)
+    if options[key].is_a?(Proc)
+      options[key].call(record)
+    else
+      record.public_send(options[key])
+    end
+  end
+end
diff --git a/app/views/about/more.html.haml b/app/views/about/more.html.haml
index 03be3f423..0a12ab8d6 100644
--- a/app/views/about/more.html.haml
+++ b/app/views/about/more.html.haml
@@ -55,12 +55,15 @@
             %p= t('about.unavailable_content_html')
 
             - if (blocks = @blocks.select(&:reject_media?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.rejecting_media_title')
               %p= t('about.unavailable_content_description.rejecting_media')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
             - if (blocks = @blocks.select(&:silence?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.silenced_title')
               %p= t('about.unavailable_content_description.silenced')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
             - if (blocks = @blocks.select(&:suspend?)) && !blocks.empty?
+              %h3= t('about.unavailable_content_description.suspended_title')
               %p= t('about.unavailable_content_description.suspended')
               = render partial: 'domain_blocks', locals: { domain_blocks: blocks }
 
diff --git a/app/views/admin/custom_emojis/index.html.haml b/app/views/admin/custom_emojis/index.html.haml
index d3705a36e..45cb7bee0 100644
--- a/app/views/admin/custom_emojis/index.html.haml
+++ b/app/views/admin/custom_emojis/index.html.haml
@@ -1,8 +1,9 @@
 - content_for :page_title do
   = t('admin.custom_emojis.title')
 
-- content_for :heading_actions do
-  = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
+- if can?(:create, :custom_emoji)
+  - content_for :heading_actions do
+    = link_to t('admin.custom_emojis.upload'), new_admin_custom_emoji_path, class: 'button'
 
 .filters
   .filter-subset
@@ -55,9 +56,10 @@
 
         = f.button safe_join([fa_icon('power-off'), t('admin.custom_emojis.disable')]), name: :disable, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
-        = f.button safe_join([fa_icon('times'), t('admin.custom_emojis.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
+        - if can?(:destroy, :custom_emoji)
+          = f.button safe_join([fa_icon('times'), t('admin.custom_emojis.delete')]), name: :delete, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
-        - unless params[:local] == '1'
+        - if can?(:copy, :custom_emoji) && params[:local] != '1'
           = f.button safe_join([fa_icon('copy'), t('admin.custom_emojis.copy')]), name: :copy, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
 
     - if params[:local] == '1'
diff --git a/app/views/admin/instances/index.html.haml b/app/views/admin/instances/index.html.haml
index bd67eb4fc..a73b8dc92 100644
--- a/app/views/admin/instances/index.html.haml
+++ b/app/views/admin/instances/index.html.haml
@@ -1,6 +1,12 @@
 - content_for :page_title do
   = t('admin.instances.title')
 
+- content_for :heading_actions do
+  - if whitelist_mode?
+    = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button'
+  - else
+    = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
+
 .filters
   .filter-subset
     %strong= t('admin.instances.moderation.title')
@@ -10,12 +16,6 @@
       - unless whitelist_mode?
         %li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
 
-  %div.special-action-button
-    - if whitelist_mode?
-      = link_to t('admin.domain_allows.add_new'), new_admin_domain_allow_path, class: 'button'
-    - else
-      = link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path, class: 'button'
-
 - unless whitelist_mode?
   = form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
     .fields-group
diff --git a/app/views/auth/sessions/sign_in_token.html.haml b/app/views/auth/sessions/sign_in_token.html.haml
new file mode 100644
index 000000000..8923203cd
--- /dev/null
+++ b/app/views/auth/sessions/sign_in_token.html.haml
@@ -0,0 +1,14 @@
+- content_for :page_title do
+  = t('auth.login')
+
+= simple_form_for(resource, as: resource_name, url: session_path(resource_name), method: :post) do |f|
+  %p.hint.otp-hint= t('users.suspicious_sign_in_confirmation')
+
+  .fields-group
+    = f.input :sign_in_token_attempt, type: :number, wrapper: :with_label, label: t('simple_form.labels.defaults.sign_in_token_attempt'), input_html: { 'aria-label' => t('simple_form.labels.defaults.sign_in_token_attempt'), :autocomplete => 'off' }, autofocus: true
+
+  .actions
+    = f.button :button, t('auth.login'), type: :submit
+
+  - if Setting.site_contact_email.present?
+    %p.hint.subtle-hint= t('users.generic_access_help_html', email: mail_to(Setting.site_contact_email, nil))
diff --git a/app/views/statuses/_detailed_status.html.haml b/app/views/statuses/_detailed_status.html.haml
index 33b81c748..8e409846a 100644
--- a/app/views/statuses/_detailed_status.html.haml
+++ b/app/views/statuses/_detailed_status.html.haml
@@ -39,7 +39,7 @@
       = react_component :media_gallery, height: 380, sensitive: status.sensitive?, standalone: true, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
-    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   .detailed-status__meta
     %data.dt-published{ value: status.created_at.to_time.iso8601 }
diff --git a/app/views/statuses/_simple_status.html.haml b/app/views/statuses/_simple_status.html.haml
index b7a2b7116..7a0262c9d 100644
--- a/app/views/statuses/_simple_status.html.haml
+++ b/app/views/statuses/_simple_status.html.haml
@@ -43,7 +43,7 @@
       = react_component :media_gallery, height: 343, sensitive: status.sensitive?, autoplay: autoplay, media: status.media_attachments.map { |a| ActiveModelSerializers::SerializableResource.new(a, serializer: REST::MediaAttachmentSerializer).as_json } do
         = render partial: 'statuses/attachment_list', locals: { attachments: status.media_attachments }
   - elsif status.preview_card
-    = react_component :card, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
+    = react_component :card, sensitive: status.sensitive?, 'maxDescription': 160, card: ActiveModelSerializers::SerializableResource.new(status.preview_card, serializer: REST::PreviewCardSerializer).as_json
 
   - if !status.in_reply_to_id.nil? && status.in_reply_to_account_id == status.account.id
     = link_to ActivityPub::TagManager.instance.url_for(status), class: 'status__content__read-more-button', target: stream_link_target, rel: 'noopener noreferrer' do
diff --git a/app/views/user_mailer/sign_in_token.html.haml b/app/views/user_mailer/sign_in_token.html.haml
new file mode 100644
index 000000000..826b34e7c
--- /dev/null
+++ b/app/views/user_mailer/sign_in_token.html.haml
@@ -0,0 +1,105 @@
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.hero
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center.padded
+                              %table.hero-icon.alert-icon{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                                %tbody
+                                  %tr
+                                    %td
+                                      = image_tag full_pack_url('media/images/mailer/icon_email.png'), alt: ''
+
+                              %h1= t 'user_mailer.sign_in_token.title'
+                              %p.lead= t 'user_mailer.sign_in_token.explanation'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell.content-start
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.input-cell
+                          %table.input{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td= @resource.sign_in_token
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.sign_in_token.details'
+                          %tr
+                            %td.column-cell.text-center
+                              %p
+                                %strong= "#{t('sessions.ip')}:"
+                                = @remote_ip
+                                %br/
+                                %strong= "#{t('sessions.browser')}:"
+                                %span{ title: @user_agent }= t 'sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")
+                                %br/
+                                = l(@timestamp)
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  .email-row
+                    .col-6
+                      %table.column{ cellspacing: 0, cellpadding: 0 }
+                        %tbody
+                          %tr
+                            %td.column-cell.text-center
+                              %p= t 'user_mailer.sign_in_token.further_actions'
+
+%table.email-table{ cellspacing: 0, cellpadding: 0 }
+  %tbody
+    %tr
+      %td.email-body
+        .email-container
+          %table.content-section{ cellspacing: 0, cellpadding: 0 }
+            %tbody
+              %tr
+                %td.content-cell
+                  %table.column{ cellspacing: 0, cellpadding: 0 }
+                    %tbody
+                      %tr
+                        %td.column-cell.button-cell
+                          %table.button{ align: 'center', cellspacing: 0, cellpadding: 0 }
+                            %tbody
+                              %tr
+                                %td.button-primary
+                                  = link_to edit_user_registration_url do
+                                    %span= t 'settings.account_settings'
diff --git a/app/views/user_mailer/sign_in_token.text.erb b/app/views/user_mailer/sign_in_token.text.erb
new file mode 100644
index 000000000..2539ddaf6
--- /dev/null
+++ b/app/views/user_mailer/sign_in_token.text.erb
@@ -0,0 +1,17 @@
+<%= t 'user_mailer.sign_in_token.title' %>
+
+===
+
+<%= t 'user_mailer.sign_in_token.explanation' %>
+
+=> <%= @resource.sign_in_token %>
+
+<%= t 'user_mailer.sign_in_token.details' %>
+
+<%= t('sessions.ip') %>: <%= @remote_ip %>
+<%= t('sessions.browser') %>: <%= t('sessions.description', browser: t("sessions.browsers.#{@detection.id}", default: "#{@detection.id}"), platform: t("sessions.platforms.#{@detection.platform.id}", default: "#{@detection.platform.id}")) %>
+<%= l(@timestamp) %>
+
+<%= t 'user_mailer.sign_in_token.further_actions' %>
+
+=> <%= edit_user_registration_url %>
diff --git a/app/workers/activitypub/distribution_worker.rb b/app/workers/activitypub/distribution_worker.rb
index 11b6a6111..e4997ba0e 100644
--- a/app/workers/activitypub/distribution_worker.rb
+++ b/app/workers/activitypub/distribution_worker.rb
@@ -43,7 +43,7 @@ class ActivityPub::DistributionWorker
   end
 
   def payload
-    @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @account))
+    @payload ||= Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @account))
   end
 
   def relay!
diff --git a/app/workers/activitypub/reply_distribution_worker.rb b/app/workers/activitypub/reply_distribution_worker.rb
index 1ff8a657e..d4d0148ac 100644
--- a/app/workers/activitypub/reply_distribution_worker.rb
+++ b/app/workers/activitypub/reply_distribution_worker.rb
@@ -29,6 +29,6 @@ class ActivityPub::ReplyDistributionWorker
   end
 
   def payload
-    @payload ||= Oj.dump(serialize_payload(@status, ActivityPub::ActivitySerializer, signer: @status.account))
+    @payload ||= Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @status.account))
   end
 end
diff --git a/app/workers/domain_block_worker.rb b/app/workers/domain_block_worker.rb
index 35518d6b5..3c601cd83 100644
--- a/app/workers/domain_block_worker.rb
+++ b/app/workers/domain_block_worker.rb
@@ -4,8 +4,9 @@ class DomainBlockWorker
   include Sidekiq::Worker
 
   def perform(domain_block_id, update = false)
-    BlockDomainService.new.call(DomainBlock.find(domain_block_id), update)
-  rescue ActiveRecord::RecordNotFound
-    true
+    domain_block = DomainBlock.find_by(id: domain_block_id)
+    return true if domain_block.nil?
+
+    BlockDomainService.new.call(domain_block, update)
   end
 end
diff --git a/app/workers/domain_clear_media_worker.rb b/app/workers/domain_clear_media_worker.rb
new file mode 100644
index 000000000..971934a08
--- /dev/null
+++ b/app/workers/domain_clear_media_worker.rb
@@ -0,0 +1,14 @@
+# frozen_string_literal: true
+
+class DomainClearMediaWorker
+  include Sidekiq::Worker
+
+  sidekiq_options queue: 'pull'
+
+  def perform(domain_block_id)
+    domain_block = DomainBlock.find_by(id: domain_block_id)
+    return true if domain_block.nil?
+
+    ClearDomainMediaService.new.call(domain_block)
+  end
+end
diff --git a/app/workers/import/relationship_worker.rb b/app/workers/import/relationship_worker.rb
index 616da6da9..4a455f3ae 100644
--- a/app/workers/import/relationship_worker.rb
+++ b/app/workers/import/relationship_worker.rb
@@ -7,7 +7,8 @@ class Import::RelationshipWorker
 
   def perform(account_id, target_account_uri, relationship, options = {})
     from_account   = Account.find(account_id)
-    target_account = ResolveAccountService.new.call(target_account_uri)
+    target_domain  = domain(target_account_uri)
+    target_account = stoplight_wrap_request(target_domain) { ResolveAccountService.new.call(target_account_uri, { check_delivery_availability: true }) }
     options.symbolize_keys!
 
     return if target_account.nil?
@@ -29,4 +30,22 @@ class Import::RelationshipWorker
   rescue ActiveRecord::RecordNotFound
     true
   end
+
+  def domain(uri)
+    domain = uri.is_a?(Account) ? uri.domain : uri.split('@')[1]
+    TagManager.instance.local_domain?(domain) ? nil : TagManager.instance.normalize_domain(domain)
+  end
+
+  def stoplight_wrap_request(domain, &block)
+    if domain.present?
+      Stoplight("source:#{domain}", &block)
+        .with_fallback { nil }
+        .with_threshold(1)
+        .with_cool_off_time(5.minutes.seconds)
+        .with_error_handler { |error, handle| error.is_a?(HTTP::Error) || error.is_a?(OpenSSL::SSL::SSLError) ? handle.call(error) : raise(error) }
+        .run
+    else
+      block.call
+    end
+  end
 end
diff --git a/app/workers/push_conversation_worker.rb b/app/workers/push_conversation_worker.rb
index 16f538215..aa858f715 100644
--- a/app/workers/push_conversation_worker.rb
+++ b/app/workers/push_conversation_worker.rb
@@ -2,13 +2,14 @@
 
 class PushConversationWorker
   include Sidekiq::Worker
+  include Redisable
 
   def perform(conversation_account_id)
     conversation = AccountConversation.find(conversation_account_id)
     message      = InlineRenderer.render(conversation, conversation.account, :conversation)
     timeline_id  = "timeline:direct:#{conversation.account_id}"
 
-    Redis.current.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
+    redis.publish(timeline_id, Oj.dump(event: :conversation, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
   rescue ActiveRecord::RecordNotFound
     true
   end
diff --git a/app/workers/push_encrypted_message_worker.rb b/app/workers/push_encrypted_message_worker.rb
new file mode 100644
index 000000000..031230172
--- /dev/null
+++ b/app/workers/push_encrypted_message_worker.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class PushEncryptedMessageWorker
+  include Sidekiq::Worker
+  include Redisable
+
+  def perform(encrypted_message_id)
+    encrypted_message = EncryptedMessage.find(encrypted_message_id)
+    message           = InlineRenderer.render(encrypted_message, nil, :encrypted_message)
+    timeline_id       = "timeline:#{encrypted_message.device.account_id}:#{encrypted_message.device.device_id}"
+
+    redis.publish(timeline_id, Oj.dump(event: :encrypted_message, payload: message, queued_at: (Time.now.to_f * 1000.0).to_i))
+  rescue ActiveRecord::RecordNotFound
+    true
+  end
+end
diff --git a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
index 94788a85b..bb9dd49ca 100644
--- a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
+++ b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
@@ -8,5 +8,6 @@ class Scheduler::DoorkeeperCleanupScheduler
   def perform
     Doorkeeper::AccessToken.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
     Doorkeeper::AccessGrant.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
+    SystemKey.expired.delete_all
   end
 end
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
index 7e3828f7e..baa993c78 100644
--- a/config/brakeman.ignore
+++ b/config/brakeman.ignore
@@ -1,33 +1,13 @@
 {
   "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,
       "fingerprint": "04dbbc249b989db2e0119bbb0f59c9818e12889d2b97c529cdc0b1526002ba4b",
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/report.rb",
-      "line": 90,
+      "line": 112,
       "link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
       "code": "Admin::ActionLog.from(\"(#{[Admin::ActionLog.where(:target_type => \"Report\", :target_id => id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Account\", :target_id => target_account_id, :created_at => ((created_at..updated_at))).unscope(:order), Admin::ActionLog.where(:target_type => \"Status\", :target_id => status_ids, :created_at => ((created_at..updated_at))).unscope(:order)].map do\n \"(#{query.to_sql})\"\n end.join(\" UNION ALL \")}) AS admin_action_logs\")",
       "render_path": null,
@@ -47,7 +27,7 @@
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 87,
+      "line": 100,
       "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,
@@ -61,39 +41,62 @@
       "note": ""
     },
     {
-      "warning_type": "Mass Assignment",
-      "warning_code": 105,
-      "fingerprint": "28d81cc22580ef76e912b077b245f353499aa27b3826476667224c00227af2a9",
-      "check_name": "PermitAttributes",
-      "message": "Potentially dangerous key allowed for mass assignment",
-      "file": "app/controllers/admin/reports_controller.rb",
-      "line": 56,
-      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
-      "code": "params.permit(:account_id, :resolved, :target_account_id)",
-      "render_path": null,
+      "warning_type": "Dynamic Render Path",
+      "warning_code": 15,
+      "fingerprint": "20a660939f2bbf8c665e69f2844031c0564524689a9570a0091ed94846212020",
+      "check_name": "Render",
+      "message": "Render path contains parameter value",
+      "file": "app/views/admin/action_logs/index.html.haml",
+      "line": 26,
+      "link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
+      "code": "render(action => Admin::ActionLogFilter.new(filter_params).results.page(params[:page]), {})",
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::ActionLogsController",
+          "method": "index",
+          "line": 8,
+          "file": "app/controllers/admin/action_logs_controller.rb",
+          "rendered": {
+            "name": "admin/action_logs/index",
+            "file": "app/views/admin/action_logs/index.html.haml"
+          }
+        }
+      ],
       "location": {
-        "type": "method",
-        "class": "Admin::ReportsController",
-        "method": "filter_params"
+        "type": "template",
+        "template": "admin/action_logs/index"
       },
-      "user_input": ":account_id",
-      "confidence": "High",
+      "user_input": "params[:page]",
+      "confidence": "Weak",
       "note": ""
     },
     {
       "warning_type": "Dynamic Render Path",
       "warning_code": 15,
-      "fingerprint": "4b6a895e2805578d03ceedbe1d469cc75a0c759eba093722523edb4b8683c873",
+      "fingerprint": "371fe16dc4c9d6ab08a20437d65be4825776107a67c38f6d4780a9c703cd44a5",
       "check_name": "Render",
       "message": "Render path contains parameter value",
-      "file": "app/views/admin/action_logs/index.html.haml",
-      "line": 4,
+      "file": "app/views/admin/email_domain_blocks/index.html.haml",
+      "line": 17,
       "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","rendered":{"name":"admin/action_logs/index","file":"/home/eugr/Projects/mastodon/app/views/admin/action_logs/index.html.haml"}}],
+      "code": "render(action => EmailDomainBlock.where(:parent_id => nil).includes(:children).order(:id => :desc).page(params[:page]), {})",
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::EmailDomainBlocksController",
+          "method": "index",
+          "line": 10,
+          "file": "app/controllers/admin/email_domain_blocks_controller.rb",
+          "rendered": {
+            "name": "admin/email_domain_blocks/index",
+            "file": "app/views/admin/email_domain_blocks/index.html.haml"
+          }
+        }
+      ],
       "location": {
         "type": "template",
-        "template": "admin/action_logs/index"
+        "template": "admin/email_domain_blocks/index"
       },
       "user_input": "params[:page]",
       "confidence": "Weak",
@@ -106,7 +109,7 @@
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
       "file": "app/controllers/remote_interaction_controller.rb",
-      "line": 21,
+      "line": 24,
       "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,
@@ -120,32 +123,13 @@
       "note": ""
     },
     {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "67afc0d5f7775fa5bd91d1912e1b5505aeedef61876347546fa20f92fd6915e6",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/stream_entries/embed.html.haml",
-      "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":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"
-      },
-      "user_input": "params[:id]",
-      "confidence": "Weak",
-      "note": ""
-    },
-    {
       "warning_type": "SQL Injection",
       "warning_code": 0,
       "fingerprint": "6f075c1484908e3ec9bed21ab7cf3c7866be8da3881485d1c82e13093aefcbd7",
       "check_name": "SQL",
       "message": "Possible SQL injection",
       "file": "app/models/status.rb",
-      "line": 92,
+      "line": 105,
       "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,
@@ -159,22 +143,43 @@
       "note": ""
     },
     {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "8d843713d99e8403f7992f3e72251b633817cf9076ffcbbad5613859d2bbc127",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/admin/custom_emojis/index.html.haml",
-      "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","rendered":{"name":"admin/custom_emojis/index","file":"/home/eugr/Projects/mastodon/app/views/admin/custom_emojis/index.html.haml"}}],
+      "warning_type": "Mass Assignment",
+      "warning_code": 105,
+      "fingerprint": "7631e93d0099506e7c3e5c91ba8d88523b00a41a0834ae30031a5a4e8bb3020a",
+      "check_name": "PermitAttributes",
+      "message": "Potentially dangerous key allowed for mass assignment",
+      "file": "app/controllers/api/v2/search_controller.rb",
+      "line": 28,
+      "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": "template",
-        "template": "admin/custom_emojis/index"
+        "type": "method",
+        "class": "Api::V2::SearchController",
+        "method": "search_params"
       },
-      "user_input": "params[:page]",
-      "confidence": "Weak",
+      "user_input": ":account_id",
+      "confidence": "High",
+      "note": ""
+    },
+    {
+      "warning_type": "Mass Assignment",
+      "warning_code": 105,
+      "fingerprint": "8f63dec68951d9bcf7eddb15af9392b2e1333003089c41fb76688dfd3579f394",
+      "check_name": "PermitAttributes",
+      "message": "Potentially dangerous key allowed for mass assignment",
+      "file": "app/controllers/api/v1/crypto/deliveries_controller.rb",
+      "line": 23,
+      "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
+      "code": "params.require(:device).permit(:account_id, :device_id, :type, :body, :hmac)",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "Api::V1::Crypto::DeliveriesController",
+        "method": "resource_params"
+      },
+      "user_input": ":account_id",
+      "confidence": "High",
       "note": ""
     },
     {
@@ -204,10 +209,22 @@
       "check_name": "Render",
       "message": "Render path contains parameter value",
       "file": "app/views/admin/accounts/index.html.haml",
-      "line": 47,
+      "line": 54,
       "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","rendered":{"name":"admin/accounts/index","file":"/home/eugr/Projects/mastodon/app/views/admin/accounts/index.html.haml"}}],
+      "render_path": [
+        {
+          "type": "controller",
+          "class": "Admin::AccountsController",
+          "method": "index",
+          "line": 12,
+          "file": "app/controllers/admin/accounts_controller.rb",
+          "rendered": {
+            "name": "admin/accounts/index",
+            "file": "app/views/admin/accounts/index.html.haml"
+          }
+        }
+      ],
       "location": {
         "type": "template",
         "template": "admin/accounts/index"
@@ -219,40 +236,40 @@
     {
       "warning_type": "Redirect",
       "warning_code": 18,
-      "fingerprint": "ba699ddcc6552c422c4ecd50d2cd217f616a2446659e185a50b05a0f2dad8d33",
+      "fingerprint": "ba568ac09683f98740f663f3d850c31785900215992e8c090497d359a2563d50",
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
-      "file": "app/controllers/media_controller.rb",
-      "line": 14,
+      "file": "app/controllers/remote_follow_controller.rb",
+      "line": 21,
       "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))",
+      "code": "redirect_to(RemoteFollow.new(resource_params).subscribe_address_for(@account))",
       "render_path": null,
       "location": {
         "type": "method",
-        "class": "MediaController",
-        "method": "show"
+        "class": "RemoteFollowController",
+        "method": "create"
       },
-      "user_input": "MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original)",
+      "user_input": "RemoteFollow.new(resource_params).subscribe_address_for(@account)",
       "confidence": "High",
       "note": ""
     },
     {
       "warning_type": "Redirect",
       "warning_code": 18,
-      "fingerprint": "bb7e94e60af41decb811bb32171f1b27e9bf3f4d01e9e511127362e22510eb11",
+      "fingerprint": "ba699ddcc6552c422c4ecd50d2cd217f616a2446659e185a50b05a0f2dad8d33",
       "check_name": "Redirect",
       "message": "Possible unprotected redirect",
-      "file": "app/controllers/remote_follow_controller.rb",
-      "line": 19,
+      "file": "app/controllers/media_controller.rb",
+      "line": 20,
       "link": "https://brakemanscanner.org/docs/warning_types/redirect/",
-      "code": "redirect_to(RemoteFollow.new(resource_params).subscribe_address_for(Account.find_local!(params[:account_username])))",
+      "code": "redirect_to(MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original))",
       "render_path": null,
       "location": {
         "type": "method",
-        "class": "RemoteFollowController",
-        "method": "create"
+        "class": "MediaController",
+        "method": "show"
       },
-      "user_input": "RemoteFollow.new(resource_params).subscribe_address_for(Account.find_local!(params[:account_username]))",
+      "user_input": "MediaAttachment.attached.find_by!(:shortcode => ((params[:id] or params[:medium_id]))).file.url(:original)",
       "confidence": "High",
       "note": ""
     },
@@ -275,27 +292,8 @@
       "user_input": ":account_id",
       "confidence": "High",
       "note": ""
-    },
-    {
-      "warning_type": "Dynamic Render Path",
-      "warning_code": 15,
-      "fingerprint": "fbd0fc59adb5c6d44b60e02debb31d3af11719f534c9881e21435bbff87404d6",
-      "check_name": "Render",
-      "message": "Render path contains parameter value",
-      "file": "app/views/stream_entries/show.html.haml",
-      "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":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"
-      },
-      "user_input": "params[:id]",
-      "confidence": "Weak",
-      "note": ""
     }
   ],
-  "updated": "2019-02-21 02:30:29 +0100",
-  "brakeman_version": "4.4.0"
+  "updated": "2020-06-01 18:18:02 +0200",
+  "brakeman_version": "4.8.0"
 }
diff --git a/config/deploy.rb b/config/deploy.rb
index 76e6b2815..5d6873588 100644
--- a/config/deploy.rb
+++ b/config/deploy.rb
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 
-lock '3.14.0'
+lock '3.14.1'
 
 set :repo_url, ENV.fetch('REPO', 'https://github.com/tootsuite/mastodon.git')
 set :branch, ENV.fetch('BRANCH', 'master')
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index e03380cec..63cff7c59 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -95,7 +95,8 @@ Doorkeeper.configure do
                   :'admin:read:reports',
                   :'admin:write',
                   :'admin:write:accounts',
-                  :'admin:write:reports'
+                  :'admin:write:reports',
+                  :crypto
 
   # Change the way client credentials are retrieved from the request object.
   # By default it retrieves first from the `HTTP_AUTHORIZATION` header, then
diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb
index 0667a542c..ebb7541eb 100644
--- a/config/initializers/inflections.rb
+++ b/config/initializers/inflections.rb
@@ -19,6 +19,7 @@ ActiveSupport::Inflector.inflections(:en) do |inflect|
   inflect.acronym 'ActivityStreams'
   inflect.acronym 'JsonLd'
   inflect.acronym 'NodeInfo'
+  inflect.acronym 'Ed25519'
 
   inflect.singular 'data', 'data'
 end
diff --git a/config/initializers/redis.rb b/config/initializers/redis.rb
index 7573fc9f7..510194044 100644
--- a/config/initializers/redis.rb
+++ b/config/initializers/redis.rb
@@ -1,5 +1,7 @@
 # frozen_string_literal: true
 
+Redis.exists_returns_integer = false
+
 redis_connection = Redis.new(
   url: ENV['REDIS_URL'],
   driver: :hiredis
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 116db4498..aed96e3e1 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -35,13 +35,16 @@ en:
     status_count_before: Who authored
     tagline: Follow friends and discover new ones
     terms: Terms of service
-    unavailable_content: Unavailable content
+    unavailable_content: Moderated servers
     unavailable_content_description:
       domain: Server
       reason: Reason
       rejecting_media: 'Media files from these servers will not be processed or stored, and no thumbnails will be displayed, requiring manual click-through to the original file:'
-      silenced: 'Posts from these servers will be hidden in public timelines and conversations, and no notifications will be generated from their users'' interactions, unless you are following them:'
+      rejecting_media_title: Filtered media
+      silenced: 'Posts from these servers will be hidden in public timelines and conversations, and no notifications will be generated from their users interactions, unless you are following them:'
+      silenced_title: Silenced servers
       suspended: 'No data from these servers will be processed, stored or exchanged, making any interaction or communication with users from these servers impossible:'
+      suspended_title: Suspended servers
     unavailable_content_html: Mastodon generally allows you to view content from and interact with users from any other server in the fediverse. These are the exceptions that have been made on this particular server.
     user_count_after:
       one: user
@@ -309,6 +312,7 @@ en:
       listed: Listed
       new:
         title: Add new custom emoji
+      not_permitted: You are not permitted to perform this action
       overwrite: Overwrite
       shortcode: Shortcode
       shortcode_hint: At least 2 characters, only alphanumeric characters and underscores
@@ -721,6 +725,10 @@ en:
     hint_html: "<strong>Tip:</strong> We won't ask you for your password again for the next hour."
     invalid_password: Invalid password
     prompt: Confirm password to continue
+  crypto:
+    errors:
+      invalid_key: is not a valid Ed25519 or Curve25519 key
+      invalid_signature: is not a valid Ed25519 signature
   date:
     formats:
       default: "%b %d, %Y"
@@ -918,6 +926,7 @@ en:
     on_cooldown: You have recently migrated your account. This function will become available again in %{count} days.
     past_migrations: Past migrations
     proceed_with_move: Move followers
+    redirected_msg: Your account is now redirecting to %{acct}.
     redirecting_to: Your account is redirecting to %{acct}.
     set_redirect: Set redirect
     warning:
@@ -1267,6 +1276,12 @@ en:
       explanation: You requested a full backup of your Mastodon account. It's now ready for download!
       subject: Your archive is ready for download
       title: Archive takeout
+    sign_in_token:
+      details: 'Here are details of the attempt:'
+      explanation: 'We detected an attempt to sign in to your account from an unrecognized IP address. If this is you, please enter the security code below on the sign in challenge page:'
+      further_actions: 'If this wasn''t you, please change your password and enable two-factor authentication on your account. You can do so here:'
+      subject: Please confirm attempted sign in
+      title: Sign in attempt
     warning:
       explanation:
         disable: While your account is frozen, your account data remains intact, but you cannot perform any actions until it is unlocked.
@@ -1304,11 +1319,14 @@ en:
       title: Welcome aboard, %{name}!
   users:
     follow_limit_reached: You cannot follow more than %{limit} people
+    generic_access_help_html: Trouble accessing your account? You may get in touch with %{email} for assistance
     invalid_email: The e-mail address is invalid
     invalid_otp_token: Invalid two-factor code
+    invalid_sign_in_token: Invalid security code
     otp_lost_help_html: If you lost access to both, you may get in touch with %{email}
     seamless_external_login: You are logged in via an external service, so password and e-mail settings are not available.
     signed_in_as: 'Signed in as:'
+    suspicious_sign_in_confirmation: You appear to not have logged in from this device before, and you haven't logged in for a while, so we're sending a security code to your e-mail address to confirm that it's you.
   verification:
     explanation_html: 'You can <strong>verify yourself as the owner of the links in your profile metadata</strong>. For that, the linked website must contain a link back to your Mastodon profile. The link back <strong>must</strong> have a <code>rel="me"</code> attribute. The text content of the link does not matter. Here is an example:'
     verification: Verification
diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml
index 4d2d2d4ec..d225adacb 100644
--- a/config/locales/simple_form.en.yml
+++ b/config/locales/simple_form.en.yml
@@ -151,6 +151,7 @@ en:
         setting_use_blurhash: Show colorful gradients for hidden media
         setting_use_pending_items: Slow mode
         severity: Severity
+        sign_in_token_attempt: Security code
         type: Import type
         username: Username
         username_or_email: Username or Email
diff --git a/config/routes.rb b/config/routes.rb
index 42f2f0f7f..d2f350580 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -79,6 +79,7 @@ Rails.application.routes.draw do
 
     resource :outbox, only: [:show], module: :activitypub
     resource :inbox, only: [:create], module: :activitypub
+    resource :claim, only: [:create], module: :activitypub
     resources :collections, only: [:show], module: :activitypub
   end
 
@@ -342,6 +343,23 @@ Rails.application.routes.draw do
         end
       end
 
+#      namespace :crypto do
+#        resources :deliveries, only: :create
+#
+#        namespace :keys do
+#          resource :upload, only: [:create]
+#          resource :query,  only: [:create]
+#          resource :claim,  only: [:create]
+#          resource :count,  only: [:show]
+#        end
+#
+#        resources :encrypted_messages, only: [:index] do
+#          collection do
+#            post :clear
+#          end
+#        end
+#      end
+
       resources :conversations, only: [:index, :destroy] do
         member do
           post :read
diff --git a/config/webpack/shared.js b/config/webpack/shared.js
index 08526957b..36b5a459e 100644
--- a/config/webpack/shared.js
+++ b/config/webpack/shared.js
@@ -110,10 +110,12 @@ module.exports = {
       writeToDisk: true,
       publicPath: true,
     }),
-    new CopyPlugin([
-      { from: 'node_modules/tesseract.js/dist/worker.min.js', to: 'ocr' },
-      { from: 'node_modules/tesseract.js-core/tesseract-core.wasm.js', to: 'ocr' },
-    ]),
+    new CopyPlugin({
+      patterns: [
+        { from: 'node_modules/tesseract.js/dist/worker.min.js', to: 'ocr' },
+        { from: 'node_modules/tesseract.js-core/tesseract-core.wasm.js', to: 'ocr' },
+      ],
+    }),
   ],
 
   resolve: {
diff --git a/db/migrate/20170129000348_create_devices.rb b/db/migrate/20170129000348_create_devices.rb
deleted file mode 100644
index bf8f5fc6e..000000000
--- a/db/migrate/20170129000348_create_devices.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-class CreateDevices < ActiveRecord::Migration[5.0]
-  def change
-    create_table :devices do |t|
-      t.integer :account_id, null: false
-      t.string :registration_id, null: false, default: ''
-
-      t.timestamps
-    end
-
-    add_index :devices, :registration_id
-    add_index :devices, :account_id
-  end
-end
diff --git a/db/migrate/20170205175257_remove_devices.rb b/db/migrate/20170205175257_remove_devices.rb
index e96ffed4d..9ef5c440e 100644
--- a/db/migrate/20170205175257_remove_devices.rb
+++ b/db/migrate/20170205175257_remove_devices.rb
@@ -1,5 +1,5 @@
 class RemoveDevices < ActiveRecord::Migration[5.0]
   def change
-    drop_table :devices
+    drop_table :devices if table_exists?(:devices)
   end
 end
diff --git a/db/migrate/20200516180352_create_devices.rb b/db/migrate/20200516180352_create_devices.rb
new file mode 100644
index 000000000..04a628a89
--- /dev/null
+++ b/db/migrate/20200516180352_create_devices.rb
@@ -0,0 +1,14 @@
+class CreateDevices < ActiveRecord::Migration[5.2]
+  def change
+    create_table :devices do |t|
+      t.references :access_token, foreign_key: { to_table: :oauth_access_tokens, on_delete: :cascade, index: :unique }
+      t.references :account, foreign_key: { on_delete: :cascade }
+      t.string :device_id, default: '', null: false
+      t.string :name, default: '', null: false
+      t.text :fingerprint_key, default: '', null: false
+      t.text :identity_key, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200516183822_create_one_time_keys.rb b/db/migrate/20200516183822_create_one_time_keys.rb
new file mode 100644
index 000000000..642b9e632
--- /dev/null
+++ b/db/migrate/20200516183822_create_one_time_keys.rb
@@ -0,0 +1,12 @@
+class CreateOneTimeKeys < ActiveRecord::Migration[5.2]
+  def change
+    create_table :one_time_keys do |t|
+      t.references :device, foreign_key: { on_delete: :cascade }
+      t.string :key_id, default: '', null: false, index: :unique
+      t.text :key, default: '', null: false
+      t.text :signature, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200518083523_create_encrypted_messages.rb b/db/migrate/20200518083523_create_encrypted_messages.rb
new file mode 100644
index 000000000..486726303
--- /dev/null
+++ b/db/migrate/20200518083523_create_encrypted_messages.rb
@@ -0,0 +1,15 @@
+class CreateEncryptedMessages < ActiveRecord::Migration[5.2]
+  def change
+    create_table :encrypted_messages do |t|
+      t.references :device, foreign_key: { on_delete: :cascade }
+      t.references :from_account, foreign_key: { to_table: :accounts, on_delete: :cascade }
+      t.string :from_device_id, default: '', null: false
+      t.integer :type, default: 0, null: false
+      t.text :body, default: '', null: false
+      t.text :digest, default: '', null: false
+      t.text :message_franking, default: '', null: false
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb b/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb
new file mode 100644
index 000000000..24d43a0bf
--- /dev/null
+++ b/db/migrate/20200521180606_encrypted_message_ids_to_timestamp_ids.rb
@@ -0,0 +1,13 @@
+class EncryptedMessageIdsToTimestampIds < ActiveRecord::Migration[5.2]
+  def up
+    safety_assured do
+      execute("ALTER TABLE encrypted_messages ALTER COLUMN id SET DEFAULT timestamp_id('encrypted_messages')")
+    end
+  end
+
+  def down
+    execute("LOCK encrypted_messages")
+    execute("SELECT setval('encrypted_messages_id_seq', (SELECT MAX(id) FROM encrypted_messages))")
+    execute("ALTER TABLE encrypted_messages ALTER COLUMN id SET DEFAULT nextval('encrypted_messages_id_seq')")
+  end
+end
diff --git a/db/migrate/20200529214050_add_devices_url_to_accounts.rb b/db/migrate/20200529214050_add_devices_url_to_accounts.rb
new file mode 100644
index 000000000..564877e5d
--- /dev/null
+++ b/db/migrate/20200529214050_add_devices_url_to_accounts.rb
@@ -0,0 +1,5 @@
+class AddDevicesUrlToAccounts < ActiveRecord::Migration[5.2]
+  def change
+    add_column :accounts, :devices_url, :string
+  end
+end
diff --git a/db/migrate/20200601222558_create_system_keys.rb b/db/migrate/20200601222558_create_system_keys.rb
new file mode 100644
index 000000000..fd9d221aa
--- /dev/null
+++ b/db/migrate/20200601222558_create_system_keys.rb
@@ -0,0 +1,9 @@
+class CreateSystemKeys < ActiveRecord::Migration[5.2]
+  def change
+    create_table :system_keys do |t|
+      t.binary :key
+
+      t.timestamps
+    end
+  end
+end
diff --git a/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb b/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb
new file mode 100644
index 000000000..dc4b7a984
--- /dev/null
+++ b/db/migrate/20200605155027_add_blurhash_to_preview_cards.rb
@@ -0,0 +1,5 @@
+class AddBlurhashToPreviewCards < ActiveRecord::Migration[5.2]
+  def change
+    add_column :preview_cards, :blurhash, :string
+  end
+end
diff --git a/db/migrate/20200608113046_add_sign_in_token_to_users.rb b/db/migrate/20200608113046_add_sign_in_token_to_users.rb
new file mode 100644
index 000000000..baa63c10f
--- /dev/null
+++ b/db/migrate/20200608113046_add_sign_in_token_to_users.rb
@@ -0,0 +1,6 @@
+class AddSignInTokenToUsers < ActiveRecord::Migration[5.2]
+  def change
+    add_column :users, :sign_in_token, :string
+    add_column :users, :sign_in_token_sent_at, :datetime
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index e52fefa91..c1b6ffa81 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: 2020_05_10_110808) do
+ActiveRecord::Schema.define(version: 2020_06_08_113046) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
@@ -174,6 +174,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.boolean "hide_collections"
     t.integer "avatar_storage_schema_version"
     t.integer "header_storage_schema_version"
+    t.string "devices_url"
     t.index "(((setweight(to_tsvector('simple'::regconfig, (display_name)::text), 'A'::\"char\") || setweight(to_tsvector('simple'::regconfig, (username)::text), 'B'::\"char\")) || setweight(to_tsvector('simple'::regconfig, (COALESCE(domain, ''::character varying))::text), 'C'::\"char\")))", name: "search_index", using: :gin
     t.index "lower((username)::text), lower((domain)::text)", name: "index_accounts_on_username_and_domain_lower", unique: true
     t.index ["moved_to_account_id"], name: "index_accounts_on_moved_to_account_id"
@@ -317,6 +318,19 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["account_id"], name: "index_custom_filters_on_account_id"
   end
 
+  create_table "devices", force: :cascade do |t|
+    t.bigint "access_token_id"
+    t.bigint "account_id"
+    t.string "device_id", default: "", null: false
+    t.string "name", default: "", null: false
+    t.text "fingerprint_key", default: "", null: false
+    t.text "identity_key", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["access_token_id"], name: "index_devices_on_access_token_id"
+    t.index ["account_id"], name: "index_devices_on_account_id"
+  end
+
   create_table "domain_allows", force: :cascade do |t|
     t.string "domain", default: "", null: false
     t.datetime "created_at", null: false
@@ -344,6 +358,20 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["domain"], name: "index_email_domain_blocks_on_domain", unique: true
   end
 
+  create_table "encrypted_messages", id: :bigint, default: -> { "timestamp_id('encrypted_messages'::text)" }, force: :cascade do |t|
+    t.bigint "device_id"
+    t.bigint "from_account_id"
+    t.string "from_device_id", default: "", null: false
+    t.integer "type", default: 0, null: false
+    t.text "body", default: "", null: false
+    t.text "digest", default: "", null: false
+    t.text "message_franking", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["device_id"], name: "index_encrypted_messages_on_device_id"
+    t.index ["from_account_id"], name: "index_encrypted_messages_on_from_account_id"
+  end
+
   create_table "favourites", force: :cascade do |t|
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
@@ -552,6 +580,17 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["uid"], name: "index_oauth_applications_on_uid", unique: true
   end
 
+  create_table "one_time_keys", force: :cascade do |t|
+    t.bigint "device_id"
+    t.string "key_id", default: "", null: false
+    t.text "key", default: "", null: false
+    t.text "signature", default: "", null: false
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+    t.index ["device_id"], name: "index_one_time_keys_on_device_id"
+    t.index ["key_id"], name: "index_one_time_keys_on_key_id"
+  end
+
   create_table "pghero_space_stats", force: :cascade do |t|
     t.text "database"
     t.text "schema"
@@ -610,6 +649,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.datetime "updated_at", null: false
     t.string "embed_url", default: "", null: false
     t.integer "image_storage_schema_version"
+    t.string "blurhash"
     t.index ["url"], name: "index_preview_cards_on_url", unique: true
   end
 
@@ -752,6 +792,12 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.index ["tag_id", "status_id"], name: "index_statuses_tags_on_tag_id_and_status_id", unique: true
   end
 
+  create_table "system_keys", force: :cascade do |t|
+    t.binary "key"
+    t.datetime "created_at", null: false
+    t.datetime "updated_at", null: false
+  end
+
   create_table "tags", force: :cascade do |t|
     t.string "name", default: "", null: false
     t.datetime "created_at", null: false
@@ -827,6 +873,8 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
     t.string "chosen_languages", array: true
     t.bigint "created_by_application_id"
     t.boolean "approved", default: true, null: false
+    t.string "sign_in_token"
+    t.datetime "sign_in_token_sent_at"
     t.index ["account_id"], name: "index_users_on_account_id"
     t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true
     t.index ["created_by_application_id"], name: "index_users_on_created_by_application_id"
@@ -886,7 +934,11 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
   add_foreign_key "conversation_mutes", "accounts", name: "fk_225b4212bb", on_delete: :cascade
   add_foreign_key "conversation_mutes", "conversations", on_delete: :cascade
   add_foreign_key "custom_filters", "accounts", on_delete: :cascade
+  add_foreign_key "devices", "accounts", on_delete: :cascade
+  add_foreign_key "devices", "oauth_access_tokens", column: "access_token_id", on_delete: :cascade
   add_foreign_key "email_domain_blocks", "email_domain_blocks", column: "parent_id", on_delete: :cascade
+  add_foreign_key "encrypted_messages", "accounts", column: "from_account_id", on_delete: :cascade
+  add_foreign_key "encrypted_messages", "devices", 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
@@ -917,6 +969,7 @@ ActiveRecord::Schema.define(version: 2020_05_10_110808) do
   add_foreign_key "oauth_access_tokens", "oauth_applications", column: "application_id", name: "fk_f5fc4c1ee3", on_delete: :cascade
   add_foreign_key "oauth_access_tokens", "users", column: "resource_owner_id", name: "fk_e84df68546", on_delete: :cascade
   add_foreign_key "oauth_applications", "users", column: "owner_id", name: "fk_b0988c7c0a", on_delete: :cascade
+  add_foreign_key "one_time_keys", "devices", on_delete: :cascade
   add_foreign_key "poll_votes", "accounts", on_delete: :cascade
   add_foreign_key "poll_votes", "polls", on_delete: :cascade
   add_foreign_key "polls", "accounts", on_delete: :cascade
diff --git a/docker-compose.yml b/docker-compose.yml
index e190df6d6..52eea7a74 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -24,15 +24,22 @@ services:
 
 #  es:
 #    restart: always
-#    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.1.3
+#    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
 #    environment:
 #      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+#      - "cluster.name=es-mastodon"
+#      - "discovery.type=single-node"
+#      - "bootstrap.memory_lock=true"
 #    networks:
 #      - internal_network
 #    healthcheck:
 #      test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
 #    volumes:
 #      - ./elasticsearch:/usr/share/elasticsearch/data
+#    ulimits:
+#      memlock:
+#        soft: -1
+#        hard: -1
 
   web:
     build: .
diff --git a/lib/paperclip/blurhash_transcoder.rb b/lib/paperclip/blurhash_transcoder.rb
index 5c33c98b0..1c3a6df02 100644
--- a/lib/paperclip/blurhash_transcoder.rb
+++ b/lib/paperclip/blurhash_transcoder.rb
@@ -3,7 +3,7 @@
 module Paperclip
   class BlurhashTranscoder < Paperclip::Processor
     def make
-      return @file unless options[:style] == :small
+      return @file unless options[:style] == :small || options[:blurhash]
 
       pixels   = convert(':source RGB:-', source: File.expand_path(@file.path)).unpack('C*')
       geometry = options.fetch(:file_geometry_parser).from_file(@file)
diff --git a/lib/tasks/emojis.rake b/lib/tasks/emojis.rake
index 70919fbdb..0e7921ffc 100644
--- a/lib/tasks/emojis.rake
+++ b/lib/tasks/emojis.rake
@@ -1,5 +1,35 @@
 # frozen_string_literal: true
 
+def gen_border(codepoint)
+  input = Rails.root.join('public', 'emoji', "#{codepoint}.svg")
+  dest = Rails.root.join('public', 'emoji', "#{codepoint}_border.svg")
+  doc = File.open(input) { |f| Nokogiri::XML(f) }
+  svg = doc.at_css('svg')
+  if svg.key?('viewBox')
+    view_box = svg['viewBox'].split(' ').map(&:to_i)
+    view_box[0] -= 2
+    view_box[1] -= 2
+    view_box[2] += 4
+    view_box[3] += 4
+    svg['viewBox'] = view_box.join(' ')
+  end
+  g = Nokogiri::XML::Node.new 'g', doc
+  doc.css('svg > *').each do |elem|
+    border_elem = elem.dup
+
+    border_elem.delete('fill')
+
+    border_elem['stroke'] = 'white'
+    border_elem['stroke-linejoin'] = 'round'
+    border_elem['stroke-width'] = '4px'
+
+    g.add_child(border_elem)
+  end
+  svg.prepend_child(g)
+  File.write(dest, doc.to_xml)
+  puts "Wrote bordered #{codepoint}.svg to #{dest}!"
+end
+
 def codepoints_to_filename(codepoints)
   codepoints.downcase.gsub(/\A[0]+/, '').tr(' ', '-')
 end
@@ -23,8 +53,10 @@ namespace :emojis do
 
     HTTP.get(source).to_s.split("\n").each do |line|
       next if line.start_with? '#'
+
       parts = line.split(';').map(&:strip)
       next if parts.size < 2
+
       codes << [parts[0], parts[1].start_with?('fully-qualified')]
     end
 
@@ -55,4 +87,16 @@ namespace :emojis do
     File.write(dest, Oj.dump(map))
     puts "Wrote emojo to destination! (#{dest})"
   end
+
+  desc 'Generate emoji variants with white borders'
+  task :generate_borders do
+    src = Rails.root.join('app', 'javascript', 'mastodon', 'features', 'emoji', 'emoji_map.json')
+    emojis = '🎱🐜⚫🖤⬛◼️◾◼️✒️▪️💣🎳📷📸♣️🕶️✴️🔌💂‍♀️📽️🍳🦍💂🔪🕳️🕹️🕋🖊️🖋️💂‍♂️🎤🎓🎥🎼♠️🎩🦃📼📹🎮🐃🏴👽⚾🐔☁️💨🕊️👀🍥👻🐐❕❔⛸️🌩️🔊🔇📃🌧️🐏🍚🍙🐓🐑💀☠️🌨️🔉🔈💬💭🏐🏳️⚪⬜◽◻️▫️'
+
+    map = Oj.load(File.read(src))
+
+    emojis.each_grapheme_cluster do |emoji|
+      gen_border map[emoji]
+    end
+  end
 end
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index a873335d4..9e80989ef 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -1,6 +1,5 @@
 # frozen_string_literal: true
 
-require 'tty-command'
 require 'tty-prompt'
 
 namespace :mastodon do
@@ -334,8 +333,6 @@ namespace :mastodon do
       prompt.say 'This configuration will be written to .env.production'
 
       if prompt.yes?('Save configuration?')
-        cmd = TTY::Command.new(printer: :quiet)
-
         env_contents = env.each_pair.map do |key, value|
           if value.is_a?(String) && value =~ /[\s\#\\"]/
             if value =~ /[']/
@@ -367,7 +364,7 @@ namespace :mastodon do
           prompt.say 'Running `RAILS_ENV=production rails db:setup` ...'
           prompt.say "\n\n"
 
-          if cmd.run!({ RAILS_ENV: 'production', SAFETY_ASSURED: 1 }, :rails, 'db:setup').failure?
+          if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production', 'SAFETY_ASSURED' => '1' }), 'rails db:setup')
             prompt.error 'That failed! Perhaps your configuration is not right'
           else
             prompt.ok 'Done!'
@@ -382,7 +379,7 @@ namespace :mastodon do
           prompt.say 'Running `RAILS_ENV=production rails assets:precompile` ...'
           prompt.say "\n\n"
 
-          if cmd.run!({ RAILS_ENV: 'production' }, :rails, 'assets:precompile').failure?
+          if !system(env.transform_values(&:to_s).merge({ 'RAILS_ENV' => 'production' }), 'rails assets:precompile')
             prompt.error 'That failed! Maybe you need swap space?'
           else
             prompt.say 'Done!'
diff --git a/package.json b/package.json
index 53937fab4..ba47aa059 100644
--- a/package.json
+++ b/package.json
@@ -60,13 +60,13 @@
   },
   "private": true,
   "dependencies": {
-    "@babel/core": "^7.9.6",
+    "@babel/core": "^7.10.2",
     "@babel/plugin-proposal-class-properties": "^7.8.3",
     "@babel/plugin-proposal-decorators": "^7.8.3",
-    "@babel/plugin-transform-react-inline-elements": "^7.9.0",
-    "@babel/plugin-transform-runtime": "^7.9.0",
-    "@babel/preset-env": "^7.9.6",
-    "@babel/preset-react": "^7.9.4",
+    "@babel/plugin-transform-react-inline-elements": "^7.10.1",
+    "@babel/plugin-transform-runtime": "^7.10.1",
+    "@babel/preset-env": "^7.10.2",
+    "@babel/preset-react": "^7.10.1",
     "@babel/runtime": "^7.8.4",
     "@clusterws/cws": "^2.0.0",
     "@gamestdio/websocket": "^0.3.2",
@@ -74,7 +74,7 @@
     "array-includes": "^3.1.1",
     "arrow-key-navigation": "^1.1.0",
     "atrament": "0.2.4",
-    "autoprefixer": "^9.7.6",
+    "autoprefixer": "^9.8.0",
     "axios": "^0.19.2",
     "babel-loader": "^8.1.0",
     "babel-plugin-lodash": "^3.3.4",
@@ -85,9 +85,9 @@
     "blurhash": "^1.1.3",
     "classnames": "^2.2.5",
     "compression-webpack-plugin": "^4.0.0",
-    "copy-webpack-plugin": "^5.1.1",
+    "copy-webpack-plugin": "^6.0.2",
     "cross-env": "^7.0.2",
-    "css-loader": "^3.5.3",
+    "css-loader": "^3.6.0",
     "cssnano": "^4.1.10",
     "detect-passive-events": "^1.0.2",
     "dotenv": "^8.2.0",
@@ -97,7 +97,7 @@
     "exif-js": "^2.3.0",
     "express": "^4.17.1",
     "favico.js": "^0.3.10",
-    "file-loader": "^5.1.0",
+    "file-loader": "^6.0.0",
     "font-awesome": "^4.7.0",
     "glob": "^7.1.6",
     "history": "^4.10.1",
@@ -131,7 +131,7 @@
     "react-dom": "^16.13.1",
     "react-hotkeys": "^1.1.4",
     "react-immutable-proptypes": "^2.2.0",
-    "react-immutable-pure-component": "^1.1.1",
+    "react-immutable-pure-component": "^2.2.2",
     "react-intl": "^2.9.0",
     "react-masonry-infinite": "^1.2.2",
     "react-motion": "^0.5.2",
@@ -144,7 +144,7 @@
     "react-select": "^3.1.0",
     "react-sparklines": "^1.7.0",
     "react-swipeable-views": "^0.13.9",
-    "react-textarea-autosize": "^7.1.2",
+    "react-textarea-autosize": "^8.0.1",
     "react-toggle": "^4.1.1",
     "redis": "^3.0.2",
     "redux": "^4.0.5",
@@ -159,7 +159,7 @@
     "stacktrace-js": "^2.0.2",
     "stringz": "^2.1.0",
     "substring-trie": "^1.0.2",
-    "terser-webpack-plugin": "^3.0.1",
+    "terser-webpack-plugin": "^3.0.3",
     "tesseract.js": "^2.1.1",
     "throng": "^4.0.0",
     "tiny-queue": "^0.2.1",
@@ -167,22 +167,22 @@
     "wavesurfer.js": "^3.3.3",
     "webpack": "^4.43.0",
     "webpack-assets-manifest": "^3.1.1",
-    "webpack-bundle-analyzer": "^3.7.0",
+    "webpack-bundle-analyzer": "^3.8.0",
     "webpack-cli": "^3.3.11",
     "webpack-merge": "^4.2.1",
     "wicg-inert": "^3.0.3"
   },
   "devDependencies": {
-    "babel-eslint": "^10.0.3",
+    "babel-eslint": "^10.1.0",
     "babel-jest": "^25.2.4",
     "enzyme": "^3.11.0",
     "enzyme-adapter-react-16": "^1.15.2",
     "eslint": "^6.8.0",
-    "eslint-plugin-import": "~2.20.2",
+    "eslint-plugin-import": "~2.21.2",
     "eslint-plugin-jsx-a11y": "~6.2.3",
     "eslint-plugin-promise": "~4.2.1",
-    "eslint-plugin-react": "~7.19.0",
-    "jest": "^25.4.0",
+    "eslint-plugin-react": "~7.20.0",
+    "jest": "^26.0.1",
     "raf": "^3.4.1",
     "react-intl-translations-manager": "^5.0.3",
     "react-test-renderer": "^16.13.1",
diff --git a/public/emoji/1f327_border.svg b/public/emoji/1f327_border.svg
new file mode 100644
index 000000000..3298c8f87
--- /dev/null
+++ b/public/emoji/1f327_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.999 24.961l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.98-.937 1.943-2.039zm-1.979 7.46L9.907 29l-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm-5-4.46l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.102.966 1.975 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm18-3l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm-6.021 4l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm5.021 4.46L21.906 30l-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm6.979-5.46l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+  <path fill="#5DADEC" d="M11.999 24.961l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.98-.937 1.943-2.039zm-1.979 7.46L9.907 29l-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm-5-4.46l-.113-3.421-2.87 1.708c-.638.345-1.062 1.024-1.036 1.799.037 1.102.966 1.975 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm18-3l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm-6.021 4l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039zm5.021 4.46L21.906 30l-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.11-.023 1.98-.937 1.943-2.039zm6.979-5.46l-.113-3.421-2.869 1.708c-.639.345-1.062 1.024-1.036 1.799.037 1.103.966 1.976 2.076 1.953 1.109-.023 1.979-.937 1.942-2.039z"/>
+</svg>
diff --git a/public/emoji/1f328_border.svg b/public/emoji/1f328_border.svg
new file mode 100644
index 000000000..254dc90de
--- /dev/null
+++ b/public/emoji/1f328_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.53 26.75c-.138-.239-.443-.32-.683-.183L4 27.634V25.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684L2.499 28.5.651 29.567c-.239.138-.32.443-.183.683.138.24.443.321.683.184L3 29.366V31.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L4.5 28.5l1.848-1.067c.239-.138.321-.443.182-.683zm10 4c-.138-.239-.443-.32-.683-.183L14 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L13 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L14.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683zM11 27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L12.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L12 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L11 25.366V27.5zm12.848-.066c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L22.5 25.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L22 24.634V22.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L21 26.366V28.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067zm10.5-1.867L32.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L32 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L31 25.366V27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.137-.239.056-.545-.183-.683zM29.53 30.75c-.138-.239-.443-.32-.683-.183L27 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L26 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L27.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+  <path d="M6.53 26.75c-.138-.239-.443-.32-.683-.183L4 27.634V25.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684L2.499 28.5.651 29.567c-.239.138-.32.443-.183.683.138.24.443.321.683.184L3 29.366V31.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L4.5 28.5l1.848-1.067c.239-.138.321-.443.182-.683zm10 4c-.138-.239-.443-.32-.683-.183L14 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L13 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L14.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683zM11 27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L12.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L12 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L11 25.366V27.5zm12.848-.066c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L22.5 25.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L22 24.634V22.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L21 26.366V28.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067zm10.5-1.867L32.5 24.5l1.848-1.067c.239-.139.321-.443.183-.684-.138-.239-.443-.32-.683-.183L32 23.634V21.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L31 25.366V27.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.137-.239.056-.545-.183-.683zM29.53 30.75c-.138-.239-.443-.32-.683-.183L27 31.634V29.5c0-.276-.224-.5-.5-.5s-.5.224-.5.5v2.135l-1.849-1.067c-.239-.138-.545-.057-.683.183-.139.24-.057.545.183.684l1.848 1.067-1.848 1.067c-.239.138-.32.443-.183.683.138.24.443.321.683.184L26 33.366V35.5c0 .276.224.5.5.5s.5-.224.5-.5v-2.133l1.848 1.067c.239.138.545.057.683-.184.138-.239.057-.545-.183-.683L27.5 32.5l1.848-1.067c.239-.138.321-.443.182-.683z" fill="#5DADEC"/>
+</svg>
diff --git a/public/emoji/1f329_border.svg b/public/emoji/1f329_border.svg
new file mode 100644
index 000000000..05c662ac4
--- /dev/null
+++ b/public/emoji/1f329_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M13.917 36c-.091 0-.182-.029-.258-.089-.157-.124-.204-.341-.113-.518L17 29h-5.078c-.174 0-.438-.031-.562-.297-.114-.243-.057-.474.047-.703L15 19c.078-.067 6.902.393 7 .393.09 0 .182.029.257.089.157.124.204.341.112.519l-3.817 6h5.032c.174 0 .329.108.391.271.06.163.013.347-.119.461l-9.666 9.166c-.079.067-.176.101-.273.101z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#F4900C" d="M13.917 36c-.091 0-.182-.029-.258-.089-.157-.124-.204-.341-.113-.518L17 29h-5.078c-.174 0-.438-.031-.562-.297-.114-.243-.057-.474.047-.703L15 19c.078-.067 6.902.393 7 .393.09 0 .182.029.257.089.157.124.204.341.112.519l-3.817 6h5.032c.174 0 .329.108.391.271.06.163.013.347-.119.461l-9.666 9.166c-.079.067-.176.101-.273.101z"/>
+  <path fill="#E1E8ED" d="M28 4c-.825 0-1.62.125-2.369.357C24.744 1.822 22.338 0 19.5 0c-3.044 0-5.592 2.096-6.299 4.921C12.447 4.351 11.519 4 10.5 4 8.015 4 6 6.015 6 8.5c0 .604.123 1.178.339 1.704C5.91 10.085 5.467 10 5 10c-2.762 0-5 2.238-5 5s2.238 5 5 5h23c4.418 0 8-3.581 8-8 0-4.418-3.582-8-8-8z"/>
+</svg>
diff --git a/public/emoji/1f359_border.svg b/public/emoji/1f359_border.svg
new file mode 100644
index 000000000..6541681d8
--- /dev/null
+++ b/public/emoji/1f359_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 26c0 9.389-7.609 9-17 9s-17 .389-17-9C1 18 9 7 14 3c2.75-2 5.129-2.051 8 0 7 5 13 18 13 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.258 29.642c-.461.316-1.091.199-1.406-.263-.316-.46-.198-1.091.262-1.406l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.405l-1.668 1.145zm2.438-7.095c-.512-.207-.758-.792-.549-1.303.209-.512.793-.758 1.304-.549l1.852.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.852-.755zm-4.494-5.256c-.519-.21-.767-.801-.555-1.318.209-.517.801-.766 1.316-.556l1.875.764c.516.211.765.801.554 1.318-.211.517-.8.766-1.318.555l-1.872-.763zm-21.001 7c-.517-.21-.766-.801-.554-1.318.21-.517.801-.766 1.317-.556l1.873.764c.518.211.766.801.556 1.318-.211.518-.802.767-1.318.556l-1.874-.764zm3.557-6.149c-.461.316-1.091.199-1.406-.264-.315-.46-.198-1.09.262-1.405l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.406l-1.668 1.144zm9.028 3.739c-.767-.312-1.137-1.188-.824-1.956.314-.766 1.189-1.135 1.956-.823l2.778 1.134c.767.312 1.136 1.186.824 1.953-.312.768-1.188 1.137-1.956.824l-2.778-1.132zm-6.184 6.052c.522-.199 1.106.062 1.306.586.197.519-.066 1.105-.588 1.303l-1.892.721c-.519.199-1.104-.063-1.302-.586-.2-.524.062-1.107.585-1.307l1.891-.717z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 21H12c-1.104 0-2 .896-2 2v11.812c2.384.224 5.107.188 8 .188s5.616.036 8-.188V23c0-1.104-.896-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#EEE" d="M35 26c0 9.389-7.609 9-17 9s-17 .389-17-9C1 18 9 7 14 3c2.75-2 5.129-2.051 8 0 7 5 13 18 13 23z"/>
+  <path fill="#CCD6DD" d="M27.258 29.642c-.461.316-1.091.199-1.406-.263-.316-.46-.198-1.091.262-1.406l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.405l-1.668 1.145zm2.438-7.095c-.512-.207-.758-.792-.549-1.303.209-.512.793-.758 1.304-.549l1.852.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.852-.755zm-4.494-5.256c-.519-.21-.767-.801-.555-1.318.209-.517.801-.766 1.316-.556l1.875.764c.516.211.765.801.554 1.318-.211.517-.8.766-1.318.555l-1.872-.763zm-21.001 7c-.517-.21-.766-.801-.554-1.318.21-.517.801-.766 1.317-.556l1.873.764c.518.211.766.801.556 1.318-.211.518-.802.767-1.318.556l-1.874-.764zm3.557-6.149c-.461.316-1.091.199-1.406-.264-.315-.46-.198-1.09.262-1.405l1.67-1.144c.46-.315 1.089-.198 1.405.263.315.46.198 1.091-.263 1.406l-1.668 1.144zm9.028 3.739c-.767-.312-1.137-1.188-.824-1.956.314-.766 1.189-1.135 1.956-.823l2.778 1.134c.767.312 1.136 1.186.824 1.953-.312.768-1.188 1.137-1.956.824l-2.778-1.132zm-6.184 6.052c.522-.199 1.106.062 1.306.586.197.519-.066 1.105-.588 1.303l-1.892.721c-.519.199-1.104-.063-1.302-.586-.2-.524.062-1.107.585-1.307l1.891-.717z"/>
+  <path fill="#292F33" d="M24 21H12c-1.104 0-2 .896-2 2v11.812c2.384.224 5.107.188 8 .188s5.616.036 8-.188V23c0-1.104-.896-2-2-2z"/>
+</svg>
diff --git a/public/emoji/1f35a_border.svg b/public/emoji/1f35a_border.svg
new file mode 100644
index 000000000..d6621c590
--- /dev/null
+++ b/public/emoji/1f35a_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 36C3.042 36 1 21 1 17h34c0 2-1.958 19-17 19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="17.056" rx="17" ry="9.444" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 25c-6 0-16-3-16-8C2 11 8.125 4 18 4s16 8 16 13-9 8-16 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.41 19.892c.419.359.468.991.108 1.41-.359.419-.991.468-1.41.108l-1.519-1.302c-.419-.359-.468-.991-.108-1.41.359-.419.991-.468 1.41-.108l1.519 1.302zm-8.127-1.507c-.304.46-.925.587-1.386.283-.46-.305-.587-.925-.283-1.386l1.103-1.669c.305-.461.925-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm23 0c-.305.46-.926.587-1.387.283-.46-.305-.587-.925-.282-1.386l1.103-1.669c.305-.461.926-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm-6.103-3.606c.11.541-.239 1.069-.78 1.18-.541.11-1.069-.239-1.18-.78l-.399-1.96c-.11-.541.238-1.069.78-1.179.541-.111 1.069.239 1.179.78l.4 1.959zm-7.54-3.958c-.345-.14-.511-.534-.37-.879.14-.344.534-.51.878-.37l1.249.509c.345.14.51.533.37.878-.141.345-.534.511-.879.37l-1.248-.508zm-9.296 1.567c-.307.211-.727.133-.938-.175-.21-.307-.132-.727.175-.937l1.113-.762c.307-.21.726-.132.937.175.21.307.132.727-.175.938l-1.112.761zm13.593 8.545c-.551-.036-.969-.513-.933-1.064.037-.55.513-.968 1.062-.933l1.997.131c.55.035.969.512.933 1.062-.035.551-.511.97-1.062.933l-1.997-.129zm-9.241-6.386c-.512-.208-.758-.793-.549-1.304.209-.511.793-.757 1.304-.549l1.853.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.853-.754zm15.945-2.726c-.346-.14-.512-.534-.37-.879.14-.344.534-.51.878-.37l1.25.509c.344.14.51.533.369.878-.141.345-.533.511-.879.37l-1.248-.508z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M18 36C3.042 36 1 21 1 17h34c0 2-1.958 19-17 19z"/>
+  <ellipse fill="#A0041E" cx="18" cy="17.056" rx="17" ry="9.444"/>
+  <path fill="#E6E9EA" d="M18 25c-6 0-16-3-16-8C2 11 8.125 4 18 4s16 8 16 13-9 8-16 8z"/>
+  <path d="M15.41 19.892c.419.359.468.991.108 1.41-.359.419-.991.468-1.41.108l-1.519-1.302c-.419-.359-.468-.991-.108-1.41.359-.419.991-.468 1.41-.108l1.519 1.302zm-8.127-1.507c-.304.46-.925.587-1.386.283-.46-.305-.587-.925-.283-1.386l1.103-1.669c.305-.461.925-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm23 0c-.305.46-.926.587-1.387.283-.46-.305-.587-.925-.282-1.386l1.103-1.669c.305-.461.926-.587 1.386-.283.46.305.587.925.283 1.386l-1.103 1.669zm-6.103-3.606c.11.541-.239 1.069-.78 1.18-.541.11-1.069-.239-1.18-.78l-.399-1.96c-.11-.541.238-1.069.78-1.179.541-.111 1.069.239 1.179.78l.4 1.959zm-7.54-3.958c-.345-.14-.511-.534-.37-.879.14-.344.534-.51.878-.37l1.249.509c.345.14.51.533.37.878-.141.345-.534.511-.879.37l-1.248-.508zm-9.296 1.567c-.307.211-.727.133-.938-.175-.21-.307-.132-.727.175-.937l1.113-.762c.307-.21.726-.132.937.175.21.307.132.727-.175.938l-1.112.761zm13.593 8.545c-.551-.036-.969-.513-.933-1.064.037-.55.513-.968 1.062-.933l1.997.131c.55.035.969.512.933 1.062-.035.551-.511.97-1.062.933l-1.997-.129zm-9.241-6.386c-.512-.208-.758-.793-.549-1.304.209-.511.793-.757 1.304-.549l1.853.755c.511.208.757.791.549 1.303-.208.512-.792.758-1.304.549l-1.853-.754zm15.945-2.726c-.346-.14-.512-.534-.37-.879.14-.344.534-.51.878-.37l1.25.509c.344.14.51.533.369.878-.141.345-.533.511-.879.37l-1.248-.508z" fill="#CCD6DD"/>
+</svg>
diff --git a/public/emoji/1f365_border.svg b/public/emoji/1f365_border.svg
new file mode 100644
index 000000000..278cebd43
--- /dev/null
+++ b/public/emoji/1f365_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22.235 35.662c-.418 0-.83-.123-1.182-.361l-2.96-2.007-2.959 2.007c-.354.238-.766.361-1.184.361-.183 0-.365-.023-.546-.072-.589-.156-1.084-.562-1.351-1.113l-1.721-2.393-3.405-.568c-.05.003-.101.005-.151.005-.558 0-1.096-.222-1.491-.617-.433-.435-.657-1.032-.614-1.642l.256-3.567-3.215-1.56c-.551-.266-.958-.762-1.116-1.353-.159-.591-.053-1.221.291-1.729l1.152-2.928-1.152-2.991c-.343-.507-.45-1.137-.291-1.729.159-.589.565-1.084 1.116-1.351l3.215-1.561-.254-3.564c-.043-.612.181-1.212.614-1.642.395-.397.933-.618 1.491-.618.05 0 .101 0 .151.004l3.28-.506 1.846-2.452c.267-.551.761-.958 1.351-1.116.181-.048.363-.073.546-.073.418 0 .83.125 1.184.363l2.959 2.005 2.96-2.005c.352-.239.764-.363 1.182-.363.183 0 .369.025.545.073.592.159 1.088.565 1.354 1.116L26 4.042l3.262.631c.048-.004.1-.004.149-.004.558 0 1.094.221 1.493.618.431.43.656 1.03.612 1.642l-.26 3.565 3.221 1.561c.551.267.957.761 1.113 1.351.158.592.055 1.223-.289 1.729l-.926 2.908.926 3.011c.344.508.447 1.138.289 1.729-.156.591-.562 1.087-1.113 1.353l-3.221 1.56.26 3.567c.044.609-.182 1.206-.612 1.642-.399.396-.935.617-1.493.617-.049 0-.101-.002-.149-.005l-3.22.526-1.908 2.435c-.266.551-.762.957-1.354 1.113-.176.049-.362.071-.545.071z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.5 28.709c-3.708.041-8.167-2.875-7.792-8.37.133-1.959.903-3.779 2.341-5.116 2.543-2.365 6.538-2.219 8.903.324.986 1.061 1.5 2.443 1.447 3.891-.052 1.447-.665 2.788-1.727 3.774-.918.853-2.104 1.302-3.365 1.253-1.253-.046-2.413-.577-3.266-1.495-.785-.844-1.059-2.045-.733-3.214.331-1.188 1.219-2.095 2.375-2.425.532-.151 1.123-.236 1.275.294.152.531-.38.757-1.083 1.25-.833.584-1.292 1.667-.368 2.733.471.544 1.155.831 1.874.857.716.024 1.405-.228 1.931-.719.669-.622 1.057-1.469 1.09-2.383.033-.914-.292-1.786-.914-2.456-1.615-1.736-4.34-1.836-6.077-.221-1.046.973-1.652 2.295-1.704 3.724-.052 1.429.455 2.791 1.428 3.838 1.202 1.293 2.835 2.04 4.6 2.104 1.764.07 3.447-.562 4.74-1.765 1.588-1.476 2.506-3.483 2.585-5.649.079-2.167-.691-4.234-2.167-5.822-3.725-4.008-8.601-4.952-13.643-1.91-.763.463-1.401 1.139-1.833.794-.208-.167-.314-.481.09-.857 4.815-4.478 12.376-4.201 16.851.614 1.84 1.979 2.919 4.562 2.7 7.257-.683 8.403-6.558 9.861-9.558 9.695z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M22.235 35.662c-.418 0-.83-.123-1.182-.361l-2.96-2.007-2.959 2.007c-.354.238-.766.361-1.184.361-.183 0-.365-.023-.546-.072-.589-.156-1.084-.562-1.351-1.113l-1.721-2.393-3.405-.568c-.05.003-.101.005-.151.005-.558 0-1.096-.222-1.491-.617-.433-.435-.657-1.032-.614-1.642l.256-3.567-3.215-1.56c-.551-.266-.958-.762-1.116-1.353-.159-.591-.053-1.221.291-1.729l1.152-2.928-1.152-2.991c-.343-.507-.45-1.137-.291-1.729.159-.589.565-1.084 1.116-1.351l3.215-1.561-.254-3.564c-.043-.612.181-1.212.614-1.642.395-.397.933-.618 1.491-.618.05 0 .101 0 .151.004l3.28-.506 1.846-2.452c.267-.551.761-.958 1.351-1.116.181-.048.363-.073.546-.073.418 0 .83.125 1.184.363l2.959 2.005 2.96-2.005c.352-.239.764-.363 1.182-.363.183 0 .369.025.545.073.592.159 1.088.565 1.354 1.116L26 4.042l3.262.631c.048-.004.1-.004.149-.004.558 0 1.094.221 1.493.618.431.43.656 1.03.612 1.642l-.26 3.565 3.221 1.561c.551.267.957.761 1.113 1.351.158.592.055 1.223-.289 1.729l-.926 2.908.926 3.011c.344.508.447 1.138.289 1.729-.156.591-.562 1.087-1.113 1.353l-3.221 1.56.26 3.567c.044.609-.182 1.206-.612 1.642-.399.396-.935.617-1.493.617-.049 0-.101-.002-.149-.005l-3.22.526-1.908 2.435c-.266.551-.762.957-1.354 1.113-.176.049-.362.071-.545.071z"/>
+  <path fill="#D372B8" d="M18.5 28.709c-3.708.041-8.167-2.875-7.792-8.37.133-1.959.903-3.779 2.341-5.116 2.543-2.365 6.538-2.219 8.903.324.986 1.061 1.5 2.443 1.447 3.891-.052 1.447-.665 2.788-1.727 3.774-.918.853-2.104 1.302-3.365 1.253-1.253-.046-2.413-.577-3.266-1.495-.785-.844-1.059-2.045-.733-3.214.331-1.188 1.219-2.095 2.375-2.425.532-.151 1.123-.236 1.275.294.152.531-.38.757-1.083 1.25-.833.584-1.292 1.667-.368 2.733.471.544 1.155.831 1.874.857.716.024 1.405-.228 1.931-.719.669-.622 1.057-1.469 1.09-2.383.033-.914-.292-1.786-.914-2.456-1.615-1.736-4.34-1.836-6.077-.221-1.046.973-1.652 2.295-1.704 3.724-.052 1.429.455 2.791 1.428 3.838 1.202 1.293 2.835 2.04 4.6 2.104 1.764.07 3.447-.562 4.74-1.765 1.588-1.476 2.506-3.483 2.585-5.649.079-2.167-.691-4.234-2.167-5.822-3.725-4.008-8.601-4.952-13.643-1.91-.763.463-1.401 1.139-1.833.794-.208-.167-.314-.481.09-.857 4.815-4.478 12.376-4.201 16.851.614 1.84 1.979 2.919 4.562 2.7 7.257-.683 8.403-6.558 9.861-9.558 9.695z"/>
+</svg>
diff --git a/public/emoji/1f373_border.svg b/public/emoji/1f373_border.svg
new file mode 100644
index 000000000..56b1ef9e6
--- /dev/null
+++ b/public/emoji/1f373_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34.238 27.931c-.704-.703-3.857-2.661-6.935-4.364C28.999 21.137 30 18.187 30 15c0-8.284-6.716-15-15-15C6.715 0 0 6.716 0 15c0 8.284 6.715 15 15 15 3.159 0 6.086-.981 8.504-2.649 1.705 3.081 3.666 6.24 4.37 6.944C29.288 35.709 31 36.002 32 36c1.177-.002 4.055-2.881 4-4-.049-.999-.348-2.655-1.762-4.069z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="15" cy="15" r="12" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 25c4.863-1.533 4-5 4-9s4.001-6.708.334-9.75c-2.177-1.806-6.75-2.417-8.875-1.625C9.506 5.352 7 6.833 7 9.833s-.058 2.927-1.708 5.625C2.667 19.75 9.125 27.167 16 25z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13" cy="18" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M34.238 27.931c-.704-.703-3.857-2.661-6.935-4.364C28.999 21.137 30 18.187 30 15c0-8.284-6.716-15-15-15C6.715 0 0 6.716 0 15c0 8.284 6.715 15 15 15 3.159 0 6.086-.981 8.504-2.649 1.705 3.081 3.666 6.24 4.37 6.944C29.288 35.709 31 36.002 32 36c1.177-.002 4.055-2.881 4-4-.049-.999-.348-2.655-1.762-4.069z"/>
+  <circle fill="#66757F" cx="15" cy="15" r="12"/>
+  <path fill="#F5F8FA" d="M16 25c4.863-1.533 4-5 4-9s4.001-6.708.334-9.75c-2.177-1.806-6.75-2.417-8.875-1.625C9.506 5.352 7 6.833 7 9.833s-.058 2.927-1.708 5.625C2.667 19.75 9.125 27.167 16 25z"/>
+  <circle fill="#FFAC33" cx="13" cy="18" r="4"/>
+</svg>
diff --git a/public/emoji/1f393_border.svg b/public/emoji/1f393_border.svg
new file mode 100644
index 000000000..1af6e6fdb
--- /dev/null
+++ b/public/emoji/1f393_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24 14H12s-5 6-5 10 11 11 11 11 11-7 11-11-5-10-5-10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.902.704 2.377.704 3.278 0l14.722-11.495c.902-.704.902-1.856 0-2.56L19.64 1.28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.901.704 2.377.704 3.278 0l14.723-11.495c.901-.704.901-1.856 0-2.56L19.64 1.28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 25s-2 2-2 3v6s0 2 2 2 2-2 2-2v-6c0-1-2-3-2-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="8" cy="26" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.001 27c-.552 0-1-.447-1-1v-3.958c-.042-.634.187-2.036 1.317-2.884l9.022-7.91c.416-.365 1.048-.323 1.411.093.364.415.322 1.047-.093 1.411l-9.08 7.958C8.974 21.166 9 21.982 9 21.99L9.002 26c0 .553-.448 1-1.001 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="13" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M24 14H12s-5 6-5 10 11 11 11 11 11-7 11-11-5-10-5-10z"/>
+  <path fill="#292F33" d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.902.704 2.377.704 3.278 0l14.722-11.495c.902-.704.902-1.856 0-2.56L19.64 1.28z"/>
+  <path fill="#394146" d="M19.64 1.28c-.901-.704-2.377-.704-3.278 0L1.639 12.776c-.901.704-.901 1.856 0 2.56l14.722 11.495c.901.704 2.377.704 3.278 0l14.723-11.495c.901-.704.901-1.856 0-2.56L19.64 1.28z"/>
+  <path fill="#FCAB40" d="M8 25s-2 2-2 3v6s0 2 2 2 2-2 2-2v-6c0-1-2-3-2-3z"/>
+  <circle fill="#FDD888" cx="8" cy="26" r="3"/>
+  <path fill="#FCAB40" d="M8.001 27c-.552 0-1-.447-1-1v-3.958c-.042-.634.187-2.036 1.317-2.884l9.022-7.91c.416-.365 1.048-.323 1.411.093.364.415.322 1.047-.093 1.411l-9.08 7.958C8.974 21.166 9 21.982 9 21.99L9.002 26c0 .553-.448 1-1.001 1z"/>
+  <circle fill="#31373D" cx="18" cy="13" r="3"/>
+</svg>
diff --git a/public/emoji/1f3a4_border.svg b/public/emoji/1f3a4_border.svg
new file mode 100644
index 000000000..78f546247
--- /dev/null
+++ b/public/emoji/1f3a4_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.999 11.917c0 3.803-3.082 6.885-6.885 6.885-3.802 0-6.884-3.082-6.884-6.885 0-3.802 3.082-6.884 6.884-6.884 3.803 0 6.885 3.082 6.885 6.884z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.81 18.568c-.336.336-.881.336-1.217 0L22.466 9.44c-.336-.336-.336-.881 0-1.217l1.217-1.217c.336-.336.881-.336 1.217 0l9.127 9.128c.336.336.336.881 0 1.217l-1.217 1.217zm-6.071.136l-4.325-4.327c-.778-.779-1.995-.733-2.719.101l-9.158 10.574c-1.219 1.408-1.461 3.354-.711 4.73l-4.911 4.912 1.409 1.409 4.877-4.877c1.381.84 3.411.609 4.862-.648l10.575-9.157c.834-.723.881-1.94.101-2.717z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 6v8.122C3.686 14.047 3.352 14 3 14c-1.657 0-3 .896-3 2s1.343 2 3 2 3-.896 3-2V9.889l5 2.222v5.011c-.314-.075-.648-.122-1-.122-1.657 0-3 .896-3 2s1.343 2 3 2 2.999-.896 3-2v-9L4 6zm14-5v8.123C17.685 9.048 17.353 9 17 9c-1.657 0-3 .895-3 2 0 1.104 1.343 2 3 2 1.656 0 3-.896 3-2V1h-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M35.999 11.917c0 3.803-3.082 6.885-6.885 6.885-3.802 0-6.884-3.082-6.884-6.885 0-3.802 3.082-6.884 6.884-6.884 3.803 0 6.885 3.082 6.885 6.884z"/>
+  <path fill="#31373D" d="M32.81 18.568c-.336.336-.881.336-1.217 0L22.466 9.44c-.336-.336-.336-.881 0-1.217l1.217-1.217c.336-.336.881-.336 1.217 0l9.127 9.128c.336.336.336.881 0 1.217l-1.217 1.217zm-6.071.136l-4.325-4.327c-.778-.779-1.995-.733-2.719.101l-9.158 10.574c-1.219 1.408-1.461 3.354-.711 4.73l-4.911 4.912 1.409 1.409 4.877-4.877c1.381.84 3.411.609 4.862-.648l10.575-9.157c.834-.723.881-1.94.101-2.717z"/>
+  <path fill="#55ACEE" d="M4 6v8.122C3.686 14.047 3.352 14 3 14c-1.657 0-3 .896-3 2s1.343 2 3 2 3-.896 3-2V9.889l5 2.222v5.011c-.314-.075-.648-.122-1-.122-1.657 0-3 .896-3 2s1.343 2 3 2 2.999-.896 3-2v-9L4 6zm14-5v8.123C17.685 9.048 17.353 9 17 9c-1.657 0-3 .895-3 2 0 1.104 1.343 2 3 2 1.656 0 3-.896 3-2V1h-2z"/>
+</svg>
diff --git a/public/emoji/1f3a5_border.svg b/public/emoji/1f3a5_border.svg
new file mode 100644
index 000000000..cb4415635
--- /dev/null
+++ b/public/emoji/1f3a5_border.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M32 21v1h-2v-1c0-.446-.09-.867-.225-1.268 2.446-.757 4.224-3.038 4.224-5.733 0-3.314-2.687-6-6-6-1.603 0-3.055.632-4.131 1.656C23.241 6.433 20.405 4 17 4c-3.866 0-7 3.134-7 7 0 2.551 1.369 4.777 3.409 6H13c-2.209 0-4 1.791-4 4H8l-6-4H1v14h1l6-4h1v2c0 2.209 1.791 4 4 4h13c2.209 0 4-1.791 4-4v-3h2v1h3v-6h-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22 11c0 2.761-2.239 5-5 5s-5-2.239-5-5 2.239-5 5-5 5 2.238 5 5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="17" cy="11" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="27.999" cy="14" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="27.999" cy="14" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 20h10v10H17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19 22h6v6h-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.999" cy="28" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M32 21v1h-2v-1c0-.446-.09-.867-.225-1.268 2.446-.757 4.224-3.038 4.224-5.733 0-3.314-2.687-6-6-6-1.603 0-3.055.632-4.131 1.656C23.241 6.433 20.405 4 17 4c-3.866 0-7 3.134-7 7 0 2.551 1.369 4.777 3.409 6H13c-2.209 0-4 1.791-4 4H8l-6-4H1v14h1l6-4h1v2c0 2.209 1.791 4 4 4h13c2.209 0 4-1.791 4-4v-3h2v1h3v-6h-3z"/>
+  <path fill="#66757F" d="M22 11c0 2.761-2.239 5-5 5s-5-2.239-5-5 2.239-5 5-5 5 2.238 5 5z"/>
+  <circle fill="#CCD6DD" cx="17" cy="11" r="2"/>
+  <circle fill="#66757F" cx="27.999" cy="14" r="4"/>
+  <circle fill="#CCD6DD" cx="27.999" cy="14" r="2"/>
+  <path fill="#8899A6" d="M17 20h10v10H17z"/>
+  <path fill="#31373D" d="M19 22h6v6h-6z"/>
+  <circle fill="#8899A6" cx="12.999" cy="28" r="2"/>
+</svg>
diff --git a/public/emoji/1f3a9_border.svg b/public/emoji/1f3a9_border.svg
new file mode 100644
index 000000000..87671f0ee
--- /dev/null
+++ b/public/emoji/1f3a9_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M30.198 27.385L32 3.816c0-.135-.008-.263-.021-.373.003-.033.021-.075.021-.11C32 1.529 25.731.066 18 .066c-7.732 0-14 1.462-14 3.267 0 .035.017.068.022.102-.014.11-.022.23-.022.365l1.802 23.585C2.298 28.295 0 29.576 0 31c0 2.762 8.611 5 18 5s18-2.238 18-5c0-1.424-2.298-2.705-5.802-3.615z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.536 6.595c-4.89 0-8.602-.896-10.852-1.646-.524-.175-.808-.741-.633-1.265.175-.524.739-.808 1.265-.633 2.889.963 10.762 2.891 21.421-.016.529-.142 1.082.168 1.227.702.146.533-.169 1.083-.702 1.228-4.406 1.202-8.347 1.63-11.726 1.63z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M30.198 27.385l.446-5.829c-7.705 2.157-17.585 2.207-25.316-.377l.393 5.142c.069.304.113.65.113 1.076 0 1.75 1.289 2.828 2.771 3.396 4.458 1.708 13.958 1.646 18.807.149 1.467-.453 2.776-1.733 2.776-3.191 0-.119.015-.241.024-.361l-.014-.005z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M30.198 27.385L32 3.816c0-.135-.008-.263-.021-.373.003-.033.021-.075.021-.11C32 1.529 25.731.066 18 .066c-7.732 0-14 1.462-14 3.267 0 .035.017.068.022.102-.014.11-.022.23-.022.365l1.802 23.585C2.298 28.295 0 29.576 0 31c0 2.762 8.611 5 18 5s18-2.238 18-5c0-1.424-2.298-2.705-5.802-3.615z"/>
+  <path fill="#66757F" d="M17.536 6.595c-4.89 0-8.602-.896-10.852-1.646-.524-.175-.808-.741-.633-1.265.175-.524.739-.808 1.265-.633 2.889.963 10.762 2.891 21.421-.016.529-.142 1.082.168 1.227.702.146.533-.169 1.083-.702 1.228-4.406 1.202-8.347 1.63-11.726 1.63z"/>
+  <path fill="#744EAA" d="M30.198 27.385l.446-5.829c-7.705 2.157-17.585 2.207-25.316-.377l.393 5.142c.069.304.113.65.113 1.076 0 1.75 1.289 2.828 2.771 3.396 4.458 1.708 13.958 1.646 18.807.149 1.467-.453 2.776-1.733 2.776-3.191 0-.119.015-.241.024-.361l-.014-.005z"/>
+</svg>
diff --git a/public/emoji/1f3ae_border.svg b/public/emoji/1f3ae_border.svg
new file mode 100644
index 000000000..4a17797b1
--- /dev/null
+++ b/public/emoji/1f3ae_border.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M2.13 14.856l-.004-.002S.075 27.271.075 29.061c0 1.824 1.343 3.302 3 3.302.68 0 1.3-.258 1.803-.678l10.166-8.938L2.13 14.856zm31.69 0l.004-.002s2.051 12.417 2.051 14.207c0 1.824-1.343 3.302-3 3.302-.68 0-1.3-.258-1.803-.678l-10.166-8.938 12.914-7.891z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <g stroke="white" stroke-linejoin="round" stroke-width="4px">
+      <circle cx="25.975" cy="15.551" r="8.5"/>
+      <circle cx="9.975" cy="15.551" r="8.5"/>
+      <path d="M9.975 7.051h16v16.87h-16z"/>
+    </g>
+    <circle cx="13.075" cy="23.301" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.875" cy="23.301" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.875" cy="23.301" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13.075" cy="23.301" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25.735" cy="11.133" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25.735" cy="17.607" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="22.498" cy="14.37" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="28.972" cy="14.37" r="1.603" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.148 12.514v-2.168c0-.279-.226-.505-.505-.505H9.085c-.279 0-.505.226-.505.505v2.168l1.284 1.285 1.284-1.285zm-2.569 3.63v2.168c0 .279.226.505.505.505h1.558c.279 0 .505-.226.505-.505v-2.168l-1.284-1.285-1.284 1.285zm5.269-3.1H11.68l-1.285 1.285 1.285 1.285h2.168c.279 0 .505-.227.505-.505V13.55c0-.279-.226-.506-.505-.506zm-5.799 0H5.88c-.279 0-.505.227-.505.505v1.558c0 .279.226.505.505.505h2.168l1.285-1.285-1.284-1.283z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M2.13 14.856l-.004-.002S.075 27.271.075 29.061c0 1.824 1.343 3.302 3 3.302.68 0 1.3-.258 1.803-.678l10.166-8.938L2.13 14.856zm31.69 0l.004-.002s2.051 12.417 2.051 14.207c0 1.824-1.343 3.302-3 3.302-.68 0-1.3-.258-1.803-.678l-10.166-8.938 12.914-7.891z"/>
+  <g fill="#14171A">
+    <circle cx="25.975" cy="15.551" r="8.5"/>
+    <circle cx="9.975" cy="15.551" r="8.5"/>
+    <path d="M9.975 7.051h16v16.87h-16z"/>
+  </g>
+  <circle fill="#14171A" cx="13.075" cy="23.301" r="5"/>
+  <circle fill="#14171A" cx="22.875" cy="23.301" r="5"/>
+  <circle fill="#67757F" cx="22.875" cy="23.301" r="3"/>
+  <circle fill="#67757F" cx="13.075" cy="23.301" r="3"/>
+  <circle fill="#FFCC4D" cx="25.735" cy="11.133" r="1.603"/>
+  <circle fill="#77B255" cx="25.735" cy="17.607" r="1.603"/>
+  <circle fill="#50A5E6" cx="22.498" cy="14.37" r="1.603"/>
+  <circle fill="#DD2E44" cx="28.972" cy="14.37" r="1.603"/>
+  <path d="M11.148 12.514v-2.168c0-.279-.226-.505-.505-.505H9.085c-.279 0-.505.226-.505.505v2.168l1.284 1.285 1.284-1.285zm-2.569 3.63v2.168c0 .279.226.505.505.505h1.558c.279 0 .505-.226.505-.505v-2.168l-1.284-1.285-1.284 1.285zm5.269-3.1H11.68l-1.285 1.285 1.285 1.285h2.168c.279 0 .505-.227.505-.505V13.55c0-.279-.226-.506-.505-.506zm-5.799 0H5.88c-.279 0-.505.227-.505.505v1.558c0 .279.226.505.505.505h2.168l1.285-1.285-1.284-1.283z" fill="#8899A6"/>
+</svg>
diff --git a/public/emoji/1f3b1_border.svg b/public/emoji/1f3b1_border.svg
new file mode 100644
index 000000000..59dc9e819
--- /dev/null
+++ b/public/emoji/1f3b1_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="18" r="9" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.703 20.203c0-1.406.773-2.443 1.881-3.041-.826-.598-1.336-1.406-1.336-2.514 0-2.057 1.705-3.375 3.797-3.375 2.039 0 3.814 1.301 3.814 3.375 0 .984-.492 1.969-1.354 2.514 1.195.598 1.881 1.688 1.881 3.041 0 2.443-1.986 4.008-4.342 4.008-2.425 0-4.341-1.652-4.341-4.008zm2.742-.176c0 .896.527 1.758 1.6 1.758 1.002 0 1.6-.861 1.6-1.758 0-1.107-.633-1.758-1.6-1.758-1.02.001-1.6.774-1.6 1.758zm.334-5.097c0 .791.457 1.336 1.266 1.336.809 0 1.283-.545 1.283-1.336 0-.756-.457-1.336-1.283-1.336-.826 0-1.266.58-1.266 1.336z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#31373D" cx="18" cy="18" r="18"/>
+  <circle fill="#E1E8ED" cx="18" cy="18" r="9"/>
+  <path fill="#31373D" d="M13.703 20.203c0-1.406.773-2.443 1.881-3.041-.826-.598-1.336-1.406-1.336-2.514 0-2.057 1.705-3.375 3.797-3.375 2.039 0 3.814 1.301 3.814 3.375 0 .984-.492 1.969-1.354 2.514 1.195.598 1.881 1.688 1.881 3.041 0 2.443-1.986 4.008-4.342 4.008-2.425 0-4.341-1.652-4.341-4.008zm2.742-.176c0 .896.527 1.758 1.6 1.758 1.002 0 1.6-.861 1.6-1.758 0-1.107-.633-1.758-1.6-1.758-1.02.001-1.6.774-1.6 1.758zm.334-5.097c0 .791.457 1.336 1.266 1.336.809 0 1.283-.545 1.283-1.336 0-.756-.457-1.336-1.283-1.336-.826 0-1.266.58-1.266 1.336z"/>
+</svg>
diff --git a/public/emoji/1f3b3_border.svg b/public/emoji/1f3b3_border.svg
new file mode 100644
index 000000000..71daa085f
--- /dev/null
+++ b/public/emoji/1f3b3_border.svg
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22 10c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C14 22.417 16 29 17 31h6c1-2 3-8.583 3-11.916C26 15 22 13 22 10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 10h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 13c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C24 25.417 26 32 27 34h6c1-2 3-8.583 3-11.916C36 18 32 16 32 13z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 13h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.562" cy="23.438" r="12.562" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="12.915" cy="18.79" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.505" cy="20.938" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.431" cy="28.053" r="2.316" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M22 10c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C14 22.417 16 29 17 31h6c1-2 3-8.583 3-11.916C26 15 22 13 22 10z"/>
+  <path fill="#BE1931" d="M18 10h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z"/>
+  <path fill="#CCD6DD" d="M32 13c0-1 1-3 1-5s0-3-1-4-2-1-2-1-1 0-2 1-1 2-1 4 1 4 1 5c0 3-4 5-4 9.084C24 25.417 26 32 27 34h6c1-2 3-8.583 3-11.916C36 18 32 16 32 13z"/>
+  <path fill="#BE1931" d="M28 13h4c0-.475.227-1.18.464-2h-4.927c.236.82.463 1.525.463 2zm5.902 4c-.494-.681-.976-1.333-1.332-2h-5.139c-.357.667-.839 1.319-1.332 2h7.803z"/>
+  <circle fill="#31373D" cx="12.562" cy="23.438" r="12.562"/>
+  <circle cx="12.915" cy="18.79" r="2.316"/>
+  <circle cx="6.505" cy="20.938" r="2.316"/>
+  <circle cx="11.431" cy="28.053" r="2.316"/>
+</svg>
diff --git a/public/emoji/1f3bc_border.svg b/public/emoji/1f3bc_border.svg
new file mode 100644
index 000000000..f7aafddac
--- /dev/null
+++ b/public/emoji/1f3bc_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 5V3H0v30h36v-2H6v-5h30v-2H6v-5h30v-2H6v-5h30v-2H6V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.827 20.562c-.223-.646-.543-1.227-.947-1.723-.411-.513-.926-.928-1.529-1.232-.61-.31-1.259-.46-1.981-.46-.086 0-.208.009-.366.026l-.533-2.593c.613-.603 1.156-1.299 1.616-2.077.499-.847.885-1.77 1.145-2.741.269-.978.399-1.942.399-2.945 0-2.106-.542-3.94-1.627-5.475-.158-.196-.288-.343-.387-.431-.394-.355-.788-.412-1.704.266-.47.352-.883.86-1.224 1.506-.352.644-.608 1.366-.786 2.2-.185.826-.283 1.723-.292 2.684.041 1.352.234 2.701.576 4.013-.77.779-1.392 1.43-1.881 1.951-.521.569-1.038 1.222-1.539 1.943-.495.711-.91 1.493-1.233 2.324-.317.807-.497 1.693-.533 2.655.008.982.195 1.944.561 2.864.365.902.884 1.726 1.546 2.45.665.718 1.448 1.287 2.325 1.694 1.23.569 2.644.749 4.02.51.063.288.146.629.244 1.022.157.647.274 1.172.35 1.56.073.391.109.766.109 1.122 0 .541-.059.955-.197 1.301-.05.202-.185.412-.401.62-.233.227-.508.401-.839.533-.468.184-.922.231-1.289.181.195-.105.375-.241.537-.405.433-.443.652-.988.652-1.622 0-.447-.109-.875-.328-1.282-.215-.375-.508-.684-.886-.929-.378-.225-.778-.341-1.226-.341h-.006c-.512.034-.954.195-1.301.471-.36.266-.646.619-.852 1.051-.193.406-.307.847-.338 1.362.04 1.04.477 1.885 1.306 2.508.784.581 1.707.877 2.739.877.743 0 1.434-.164 2.053-.487.634-.326 1.148-.796 1.529-1.402.37-.602.559-1.291.559-2.046 0-.495-.043-.96-.129-1.419-.085-.458-.211-1.08-.384-1.869-.124-.535-.219-.987-.288-1.35.965-.428 1.712-1.049 2.226-1.85.576-.898.867-1.908.867-3-.001-.665-.112-1.342-.333-2.015zm-3.122 5.178l-1.047-5.149c.261.056.502.147.727.276.396.224.703.529.945.938.241.39.392.838.456 1.303 0 1.246-.354 2.115-1.081 2.632zM23.547 7.101c-.181.526-.43 1.057-.743 1.577-.307.517-.629.973-.959 1.359-.105.125-.202.231-.288.322-.078-.354-.128-.746-.149-1.165.016-.685.116-1.364.305-2.081.17-.661.408-1.259.695-1.756.305-.468.621-.705.944-.705.115 0 .196.028.259.087.07.071.119.208.15.454.03.133.047.303.047.494 0 .443-.088.918-.261 1.414zM18.602 18.58c.653-.943 1.452-1.837 2.431-2.718l.339 1.739c-.717.362-1.321.9-1.801 1.61-.552.82-.846 1.727-.872 2.717.017.913.309 1.736.871 2.451.566.708 1.294 1.181 2.169 1.4l.12.03.122-.029c.537-.127.594-.471.594-.613 0-.345-.224-.621-.579-.72-.367-.17-.637-.417-.82-.758-.202-.368-.309-.713-.309-.994 0-.476.17-.903.516-1.303.214-.242.432-.432.654-.572l1.093 5.508c-.382.081-.733.132-1.046.152-1.384-.045-2.518-.5-3.369-1.35-.434-.442-.747-.907-.958-1.423-.213-.516-.327-1.059-.342-1.584.029-1.27.429-2.463 1.187-3.543z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M36 5V3H0v30h36v-2H6v-5h30v-2H6v-5h30v-2H6v-5h30v-2H6V5z"/>
+  <path fill="#31373D" d="M27.827 20.562c-.223-.646-.543-1.227-.947-1.723-.411-.513-.926-.928-1.529-1.232-.61-.31-1.259-.46-1.981-.46-.086 0-.208.009-.366.026l-.533-2.593c.613-.603 1.156-1.299 1.616-2.077.499-.847.885-1.77 1.145-2.741.269-.978.399-1.942.399-2.945 0-2.106-.542-3.94-1.627-5.475-.158-.196-.288-.343-.387-.431-.394-.355-.788-.412-1.704.266-.47.352-.883.86-1.224 1.506-.352.644-.608 1.366-.786 2.2-.185.826-.283 1.723-.292 2.684.041 1.352.234 2.701.576 4.013-.77.779-1.392 1.43-1.881 1.951-.521.569-1.038 1.222-1.539 1.943-.495.711-.91 1.493-1.233 2.324-.317.807-.497 1.693-.533 2.655.008.982.195 1.944.561 2.864.365.902.884 1.726 1.546 2.45.665.718 1.448 1.287 2.325 1.694 1.23.569 2.644.749 4.02.51.063.288.146.629.244 1.022.157.647.274 1.172.35 1.56.073.391.109.766.109 1.122 0 .541-.059.955-.197 1.301-.05.202-.185.412-.401.62-.233.227-.508.401-.839.533-.468.184-.922.231-1.289.181.195-.105.375-.241.537-.405.433-.443.652-.988.652-1.622 0-.447-.109-.875-.328-1.282-.215-.375-.508-.684-.886-.929-.378-.225-.778-.341-1.226-.341h-.006c-.512.034-.954.195-1.301.471-.36.266-.646.619-.852 1.051-.193.406-.307.847-.338 1.362.04 1.04.477 1.885 1.306 2.508.784.581 1.707.877 2.739.877.743 0 1.434-.164 2.053-.487.634-.326 1.148-.796 1.529-1.402.37-.602.559-1.291.559-2.046 0-.495-.043-.96-.129-1.419-.085-.458-.211-1.08-.384-1.869-.124-.535-.219-.987-.288-1.35.965-.428 1.712-1.049 2.226-1.85.576-.898.867-1.908.867-3-.001-.665-.112-1.342-.333-2.015zm-3.122 5.178l-1.047-5.149c.261.056.502.147.727.276.396.224.703.529.945.938.241.39.392.838.456 1.303 0 1.246-.354 2.115-1.081 2.632zM23.547 7.101c-.181.526-.43 1.057-.743 1.577-.307.517-.629.973-.959 1.359-.105.125-.202.231-.288.322-.078-.354-.128-.746-.149-1.165.016-.685.116-1.364.305-2.081.17-.661.408-1.259.695-1.756.305-.468.621-.705.944-.705.115 0 .196.028.259.087.07.071.119.208.15.454.03.133.047.303.047.494 0 .443-.088.918-.261 1.414zM18.602 18.58c.653-.943 1.452-1.837 2.431-2.718l.339 1.739c-.717.362-1.321.9-1.801 1.61-.552.82-.846 1.727-.872 2.717.017.913.309 1.736.871 2.451.566.708 1.294 1.181 2.169 1.4l.12.03.122-.029c.537-.127.594-.471.594-.613 0-.345-.224-.621-.579-.72-.367-.17-.637-.417-.82-.758-.202-.368-.309-.713-.309-.994 0-.476.17-.903.516-1.303.214-.242.432-.432.654-.572l1.093 5.508c-.382.081-.733.132-1.046.152-1.384-.045-2.518-.5-3.369-1.35-.434-.442-.747-.907-.958-1.423-.213-.516-.327-1.059-.342-1.584.029-1.27.429-2.463 1.187-3.543z"/>
+</svg>
diff --git a/public/emoji/1f3d0_border.svg b/public/emoji/1f3d0_border.svg
new file mode 100644
index 000000000..c1804f2cb
--- /dev/null
+++ b/public/emoji/1f3d0_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.809 7.779c-2.156-.087-5.324.186-8.21 1.966-.009.005-.019.004-.028.009-.02.011-.031.03-.05.042-2.148 1.348-4.131 3.539-5.411 7.054-2.395-.049-4.569-.286-6.488-.715C16.789 4.13 25.77 3.83 29.699 4.337c-.91-.78-1.894-1.473-2.948-2.061-5.071.24-12.398 2.611-16.065 13.335-1.797-.578-3.319-1.35-4.534-2.312.051-.075.098-.155.128-.246C9.604 2.972 18.478.735 21.108.286 20.097.11 19.062 0 18 0c-1.037 0-2.046.107-3.035.275C11.227 2.109 6.884 5.52 4.609 11.794 3.499 10.42 3.071 9.078 2.91 8.206c-.501.771-.943 1.583-1.323 2.43.425.984 1.077 2.074 2.096 3.137 3.168 3.307 8.495 5.01 15.807 5.088.641 2.235.969 4.287 1.064 6.152-11.714.419-17.645-4.414-20.49-8.277C.035 17.155 0 17.573 0 18c0 .589.033 1.171.088 1.746 3.422 3.627 9.303 7.297 19.114 7.297.445 0 .907-.016 1.368-.032-.07 1.93-.382 3.629-.817 5.094-9.528-.256-14.941-3.361-17.932-6.255.931 1.915 2.182 3.641 3.698 5.102 3.275 1.666 7.681 2.906 13.566 3.029-.316.757-.654 1.429-.99 2.014.8-.004 1.583-.076 2.356-.181 1.828-3.749 3.305-9.756.842-17.938l-.197-.613c.91-2.363 2.181-4.011 3.592-5.144 4.465 9.084 2.105 17.699-.101 22.62.94-.37 1.837-.82 2.692-1.336 2.027-5.501 3.435-13.744-.906-22.383 1.404-.729 2.848-1.075 4.144-1.213.008.014.008.031.017.045 4.295 6.693 2.406 15.067-.073 21.119 1.599-1.536 2.906-3.364 3.853-5.399 1.399-6.064.893-11.461-1.516-15.822.486.027.91.073 1.248.122-.369-.726-.777-1.428-1.237-2.093z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E6E7E8" cx="18" cy="18" r="18"/>
+  <path fill="#99AAB5" d="M32.809 7.779c-2.156-.087-5.324.186-8.21 1.966-.009.005-.019.004-.028.009-.02.011-.031.03-.05.042-2.148 1.348-4.131 3.539-5.411 7.054-2.395-.049-4.569-.286-6.488-.715C16.789 4.13 25.77 3.83 29.699 4.337c-.91-.78-1.894-1.473-2.948-2.061-5.071.24-12.398 2.611-16.065 13.335-1.797-.578-3.319-1.35-4.534-2.312.051-.075.098-.155.128-.246C9.604 2.972 18.478.735 21.108.286 20.097.11 19.062 0 18 0c-1.037 0-2.046.107-3.035.275C11.227 2.109 6.884 5.52 4.609 11.794 3.499 10.42 3.071 9.078 2.91 8.206c-.501.771-.943 1.583-1.323 2.43.425.984 1.077 2.074 2.096 3.137 3.168 3.307 8.495 5.01 15.807 5.088.641 2.235.969 4.287 1.064 6.152-11.714.419-17.645-4.414-20.49-8.277C.035 17.155 0 17.573 0 18c0 .589.033 1.171.088 1.746 3.422 3.627 9.303 7.297 19.114 7.297.445 0 .907-.016 1.368-.032-.07 1.93-.382 3.629-.817 5.094-9.528-.256-14.941-3.361-17.932-6.255.931 1.915 2.182 3.641 3.698 5.102 3.275 1.666 7.681 2.906 13.566 3.029-.316.757-.654 1.429-.99 2.014.8-.004 1.583-.076 2.356-.181 1.828-3.749 3.305-9.756.842-17.938l-.197-.613c.91-2.363 2.181-4.011 3.592-5.144 4.465 9.084 2.105 17.699-.101 22.62.94-.37 1.837-.82 2.692-1.336 2.027-5.501 3.435-13.744-.906-22.383 1.404-.729 2.848-1.075 4.144-1.213.008.014.008.031.017.045 4.295 6.693 2.406 15.067-.073 21.119 1.599-1.536 2.906-3.364 3.853-5.399 1.399-6.064.893-11.461-1.516-15.822.486.027.91.073 1.248.122-.369-.726-.777-1.428-1.237-2.093z"/>
+</svg>
diff --git a/public/emoji/1f3f3_border.svg b/public/emoji/1f3f3_border.svg
new file mode 100644
index 000000000..e7d03583b
--- /dev/null
+++ b/public/emoji/1f3f3_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#E1E8ED" d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z"/>
+</svg>
diff --git a/public/emoji/1f3f4_border.svg b/public/emoji/1f3f4_border.svg
new file mode 100644
index 000000000..7251ad712
--- /dev/null
+++ b/public/emoji/1f3f4_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#8899A6" d="M5 36c-1.104 0-2-.896-2-2V3c0-1.104.896-2 2-2s2 .896 2 2v31c0 1.104-.896 2-2 2z"/>
+  <path fill="#AAB8C2" d="M5 1c-1.105 0-2 .895-2 2v31c0 .276.224.5.5.5s.5-.224.5-.5V4.414C4 3.633 4.633 3 5.414 3H7c0-1.105-.895-2-2-2z"/>
+  <path fill="#31373D" d="M32.415 3.09c-1.752-.799-3.615-1.187-5.698-1.187-2.518 0-5.02.57-7.438 1.122-2.418.551-4.702 1.072-6.995 1.072-1.79 0-3.382-.329-4.868-1.006-.309-.142-.67-.115-.956.068C6.173 3.343 6 3.66 6 4v19c0 .392.229.747.585.91 1.752.799 3.616 1.187 5.698 1.187 2.518 0 5.02-.57 7.438-1.122 2.418-.551 4.702-1.071 6.995-1.071 1.79 0 3.383.329 4.868 1.007.311.14.67.115.956-.069.287-.185.46-.502.46-.842V4c0-.392-.229-.748-.585-.91z"/>
+</svg>
diff --git a/public/emoji/1f403_border.svg b/public/emoji/1f403_border.svg
new file mode 100644
index 000000000..ed788427a
--- /dev/null
+++ b/public/emoji/1f403_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33.912 14.37C33.588 12.602 31.976 11 30 11H11c-.239 0-.521.135-.83.365C9.664 11.139 9.129 11 8.565 11c-1 0-4.731.375-5.565 2L.691 17.305C.016 19.27 1 22.087 3.027 22.087c.57 0 1.536-.007 2.665-.017 1.65.286 3.603 1.504 5.436 2.848C13.248 29.325 14.048 36 15 36c.964 0 2.529-4.409 2.913-7h9.124c.147 2.479.771 7 1.964 7 1.016 0 3.24-4.883 4.347-12.238.315-1.625.532-3.697.615-6.319.022.17.037.352.037.557v12c0 .553.447 1 1 1s1-.447 1-1V18c0-1.807-.749-3.053-2.088-3.63z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6" cy="16" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 15c3 0 6.708-1.625 6.708-5.625 0-2-1.552-4.101-4.458-4.167C8.128 5.116 6.375 8 7 8.375 7.528 8.692 9 6.5 11.5 7c1.861.372 2.054 1.567 1.667 2.333C12.716 10.226 11 11 9 11s-1 4 1 4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M33.912 14.37C33.588 12.602 31.976 11 30 11H11c-.239 0-.521.135-.83.365C9.664 11.139 9.129 11 8.565 11c-1 0-4.731.375-5.565 2L.691 17.305C.016 19.27 1 22.087 3.027 22.087c.57 0 1.536-.007 2.665-.017 1.65.286 3.603 1.504 5.436 2.848C13.248 29.325 14.048 36 15 36c.964 0 2.529-4.409 2.913-7h9.124c.147 2.479.771 7 1.964 7 1.016 0 3.24-4.883 4.347-12.238.315-1.625.532-3.697.615-6.319.022.17.037.352.037.557v12c0 .553.447 1 1 1s1-.447 1-1V18c0-1.807-.749-3.053-2.088-3.63z"/>
+  <circle fill="#FFF" cx="6" cy="16" r="1"/>
+  <path fill="#99AAB5" d="M10 15c3 0 6.708-1.625 6.708-5.625 0-2-1.552-4.101-4.458-4.167C8.128 5.116 6.375 8 7 8.375 7.528 8.692 9 6.5 11.5 7c1.861.372 2.054 1.567 1.667 2.333C12.716 10.226 11 11 9 11s-1 4 1 4z"/>
+</svg>
diff --git a/public/emoji/1f40f_border.svg b/public/emoji/1f40f_border.svg
new file mode 100644
index 000000000..fb4bbcfb3
--- /dev/null
+++ b/public/emoji/1f40f_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 35c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S30 26.896 30 28c0 0-2.25 7-5 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 36c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S33 27.896 33 29c0 0-2.25 7-5 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14 35c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S17 26.896 17 28c0 0-.25 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 36c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S20 27.896 20 29c0 0-.25 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.75 21.384c0 7.782-4.495 11.408-14.519 11.408-10.023 0-13.481-3.626-13.481-11.408 0-7.783 3.458-11.407 13.481-11.407 10.024 0 14.519 3.624 14.519 11.407z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 17.667C17 27 12.345 29 8.042 29 3.738 29 1 22.36 1 17.667 1 12.973 3.738 12 8.042 12c4.303 0 8.958.973 8.958 5.667z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4.5" cy="20.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.75 12.75C14 16 13.622 15.356 8.622 17.356 5.545 18.587 0 18.25 0 13.5 0 11.567 3.687 11 7 11c3.314 0 10.409-1.332 8.75 1.75z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 13.696c3.353 2.427 5.43 6.139 3.724 11.089-1.367 3.967-6.816 3.115-9.616 1.127-2.799-1.988-2.643-4.792-1.733-6.291.909-1.497 4.158-1.229 6.024.097.934.663.287 1.559-.721 1.068-2.292-1.118-3.037 1.443-1.246 2.882 1.266 1.016 3.275 1.049 3.655-1.01.671-3.63-3.505-6.274-7.465-5.302C11 16 13.161 11.641 16 13.696z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M25 35c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S30 26.896 30 28c0 0-2.25 7-5 7z"/>
+  <path fill="#66757F" d="M28 36c-2.75 0-2-6-2-6 0-1.104 2.646-2 3.75-2S33 27.896 33 29c0 0-2.25 7-5 7z"/>
+  <path fill="#292F33" d="M14 35c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S17 26.896 17 28c0 0-.25 7-3 7z"/>
+  <path fill="#66757F" d="M17 36c-2.75 0-4-6-4-6 0-1.104 2.646-2 3.75-2S20 27.896 20 29c0 0-.25 7-3 7z"/>
+  <path fill="#E1E8ED" d="M35.75 21.384c0 7.782-4.495 11.408-14.519 11.408-10.023 0-13.481-3.626-13.481-11.408 0-7.783 3.458-11.407 13.481-11.407 10.024 0 14.519 3.624 14.519 11.407z"/>
+  <path fill="#99AAB5" d="M17 17.667C17 27 12.345 29 8.042 29 3.738 29 1 22.36 1 17.667 1 12.973 3.738 12 8.042 12c4.303 0 8.958.973 8.958 5.667z"/>
+  <circle fill="#292F33" cx="4.5" cy="20.5" r="1.5"/>
+  <path fill="#E1E8ED" d="M15.75 12.75C14 16 13.622 15.356 8.622 17.356 5.545 18.587 0 18.25 0 13.5 0 11.567 3.687 11 7 11c3.314 0 10.409-1.332 8.75 1.75z"/>
+  <path fill="#FFCC4D" d="M16 13.696c3.353 2.427 5.43 6.139 3.724 11.089-1.367 3.967-6.816 3.115-9.616 1.127-2.799-1.988-2.643-4.792-1.733-6.291.909-1.497 4.158-1.229 6.024.097.934.663.287 1.559-.721 1.068-2.292-1.118-3.037 1.443-1.246 2.882 1.266 1.016 3.275 1.049 3.655-1.01.671-3.63-3.505-6.274-7.465-5.302C11 16 13.161 11.641 16 13.696z"/>
+</svg>
diff --git a/public/emoji/1f410_border.svg b/public/emoji/1f410_border.svg
new file mode 100644
index 000000000..7a36382b5
--- /dev/null
+++ b/public/emoji/1f410_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7.44 7.503c-1-4 3.687-6 8-4 .907.421.948 1.316 0 1-3-1-6 1-4 4 1.109 1.664-3.233 2.068-4-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.136 5.785c-1-4 3.687-6 8-4 .907.421.949 1.316 0 1-3-1-6 1-4 4 1.11 1.664-3.233 2.067-4-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5 14.785c0 4-2 4.827-2 4 0-2-1 0-1-1v-3c0-1.657.671-3 1.5-3s1.5 1.343 1.5 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.159 10.49c-.68-1.643-2.313-2.705-4.159-2.705-.553 0-1 .448-1 1s.447 1 1 1c1.034 0 1.941.577 2.312 1.471.341.824.168 1.758-.455 2.647-.984-1.506-2.602-2.618-4.856-2.618-2.391 0-7.279.714-10.828 1.289-.052-.094-.105-.188-.172-.289-2-3-4-8.157-7-8.157-4 0-10 4.986-10 9.157 0 2.544 5.738 2.929 7.486 2.988.697 1.43 1.414 2.934 2.232 4.33.066.205.155.429.282.683 3 6 3.119 14.5 4.5 14.5s2.5-4.857 2.5-9c0-.151-.004-.299-.007-.447 3.126.649 6.607.322 9.677-.61 1.448 5.045 1.77 10.058 2.83 10.058 1.342 0 2.433-8.818 2.494-13.12C33.316 21.226 34 19.51 34 17.785c0-.605-.086-1.23-.248-1.843 1.614-1.644 2.143-3.676 1.407-5.452z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7" cy="9.285" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M7.44 7.503c-1-4 3.687-6 8-4 .907.421.948 1.316 0 1-3-1-6 1-4 4 1.109 1.664-3.233 2.068-4-1z"/>
+  <path fill="#FFCC4D" d="M6.136 5.785c-1-4 3.687-6 8-4 .907.421.949 1.316 0 1-3-1-6 1-4 4 1.11 1.664-3.233 2.067-4-1z"/>
+  <path fill="#E1E8ED" d="M5 14.785c0 4-2 4.827-2 4 0-2-1 0-1-1v-3c0-1.657.671-3 1.5-3s1.5 1.343 1.5 3z"/>
+  <path fill="#CCD6DD" d="M35.159 10.49c-.68-1.643-2.313-2.705-4.159-2.705-.553 0-1 .448-1 1s.447 1 1 1c1.034 0 1.941.577 2.312 1.471.341.824.168 1.758-.455 2.647-.984-1.506-2.602-2.618-4.856-2.618-2.391 0-7.279.714-10.828 1.289-.052-.094-.105-.188-.172-.289-2-3-4-8.157-7-8.157-4 0-10 4.986-10 9.157 0 2.544 5.738 2.929 7.486 2.988.697 1.43 1.414 2.934 2.232 4.33.066.205.155.429.282.683 3 6 3.119 14.5 4.5 14.5s2.5-4.857 2.5-9c0-.151-.004-.299-.007-.447 3.126.649 6.607.322 9.677-.61 1.448 5.045 1.77 10.058 2.83 10.058 1.342 0 2.433-8.818 2.494-13.12C33.316 21.226 34 19.51 34 17.785c0-.605-.086-1.23-.248-1.843 1.614-1.644 2.143-3.676 1.407-5.452z"/>
+  <circle fill="#292F33" cx="7" cy="9.285" r="1"/>
+</svg>
diff --git a/public/emoji/1f411_border.svg b/public/emoji/1f411_border.svg
new file mode 100644
index 000000000..dc4ddeb08
--- /dev/null
+++ b/public/emoji/1f411_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M11.983 3.562c4.543-.262 7.824 1.597 8.089 6.826.215 4.19-5.184 6.79-8.046 6.879-2.462.077-1.353-1.852.61-2.334 1.576-.387 4.124-2.413 3.602-4.44-.597-2.32-4.315-2.684-6.351.292-.798 1.167-3.554.873-4.096-.434-.958-2.309 1.211-6.502 6.192-6.789z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35.75 21.384c0-7.783-4.495-11.407-14.519-11.407-1.087 0-2.083.051-3.018.137-1.36-2.423-4.845-2.828-8.213-2.828-4.304 0-10 6.145-10 10.839 0 4.608 3.606 4.866 7.811 4.874.233 3.245 1.226 5.647 3.249 7.26C11.337 31.409 12.594 36 15 36c1.353 0 2.099-1.695 2.51-3.417 1.128.136 2.359.209 3.722.209 1.733 0 3.288-.116 4.695-.335C26.017 34.114 26.458 36 28 36c2.317 0 4.273-4.956 4.834-6.521 1.969-1.87 2.916-4.545 2.916-8.095z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4.5" cy="15.786" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.562 4.339c4.312 1.455 5.74 4.148 4.034 9.099-1.367 3.967-7.345 4.361-10.034 3.375C9.25 15.964 11 14.589 13 14.875c1.606.23 4.727-.698 5-2.773C18.312 9.727 15 8 12 10c-1.177.785-5.774.43-5.5-.958.638-3.226 6.335-6.298 11.062-4.703z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M11.983 3.562c4.543-.262 7.824 1.597 8.089 6.826.215 4.19-5.184 6.79-8.046 6.879-2.462.077-1.353-1.852.61-2.334 1.576-.387 4.124-2.413 3.602-4.44-.597-2.32-4.315-2.684-6.351.292-.798 1.167-3.554.873-4.096-.434-.958-2.309 1.211-6.502 6.192-6.789z"/>
+  <path fill="#E1E8ED" d="M35.75 21.384c0-7.783-4.495-11.407-14.519-11.407-1.087 0-2.083.051-3.018.137-1.36-2.423-4.845-2.828-8.213-2.828-4.304 0-10 6.145-10 10.839 0 4.608 3.606 4.866 7.811 4.874.233 3.245 1.226 5.647 3.249 7.26C11.337 31.409 12.594 36 15 36c1.353 0 2.099-1.695 2.51-3.417 1.128.136 2.359.209 3.722.209 1.733 0 3.288-.116 4.695-.335C26.017 34.114 26.458 36 28 36c2.317 0 4.273-4.956 4.834-6.521 1.969-1.87 2.916-4.545 2.916-8.095z"/>
+  <circle fill="#292F33" cx="4.5" cy="15.786" r="1.5"/>
+  <path fill="#FFCC4D" d="M17.562 4.339c4.312 1.455 5.74 4.148 4.034 9.099-1.367 3.967-7.345 4.361-10.034 3.375C9.25 15.964 11 14.589 13 14.875c1.606.23 4.727-.698 5-2.773C18.312 9.727 15 8 12 10c-1.177.785-5.774.43-5.5-.958.638-3.226 6.335-6.298 11.062-4.703z"/>
+</svg>
diff --git a/public/emoji/1f413_border.svg b/public/emoji/1f413_border.svg
new file mode 100644
index 000000000..3391490df
--- /dev/null
+++ b/public/emoji/1f413_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24.88 33.097c-.098-.18-.25-.302-.418-.391C22.865 31 24 28.999 24 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.486-.262.667-.868.404-1.354zm-7 0c-.097-.18-.25-.302-.417-.391C15.866 31 17 28.999 17 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.485-.262.666-.868.403-1.354zM7.516 10c0 1.104-1.119 2-2.5 2s-3.5-1-3.5-2 2.119-2 3.5-2c1.38 0 2.5.896 2.5 2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.516 2c-2-1-3 1-3 1s0-3-3-3-3 3-3 3-3-.938-3 2c0 1.482 1.101 2.411 2.484 2.387V12c0 1 .263 3-.737 4s-2.484 4 .516 4 3-4 3-7c1 1 4 1 4-4 0-.867-.213-1.512-.55-2h1.287c4 0 4-4 2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.516 9c4 10 0 22-13 22-7.732 0-13-6-14-11-1.177-5.883-1-8-1-12 0-2.738 2.118-4.824 5-4 7 2 5 10 12 10 10 0 8.23-11.923 11-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7.516" cy="8" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M24.88 33.097c-.098-.18-.25-.302-.418-.391C22.865 31 24 28.999 24 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.486-.262.667-.868.404-1.354zm-7 0c-.097-.18-.25-.302-.417-.391C15.866 31 17 28.999 17 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.355s.869.667 1.356.404l2.639-1.427c.485-.262.666-.868.403-1.354zM7.516 10c0 1.104-1.119 2-2.5 2s-3.5-1-3.5-2 2.119-2 3.5-2c1.38 0 2.5.896 2.5 2z"/>
+  <path fill="#DD2E44" d="M13.516 2c-2-1-3 1-3 1s0-3-3-3-3 3-3 3-3-.938-3 2c0 1.482 1.101 2.411 2.484 2.387V12c0 1 .263 3-.737 4s-2.484 4 .516 4 3-4 3-7c1 1 4 1 4-4 0-.867-.213-1.512-.55-2h1.287c4 0 4-4 2-5z"/>
+  <path fill="#E1E8ED" d="M32.516 9c4 10 0 22-13 22-7.732 0-13-6-14-11-1.177-5.883-1-8-1-12 0-2.738 2.118-4.824 5-4 7 2 5 10 12 10 10 0 8.23-11.923 11-5z"/>
+  <circle fill="#292F33" cx="7.516" cy="8" r="1"/>
+</svg>
diff --git a/public/emoji/1f414_border.svg b/public/emoji/1f414_border.svg
new file mode 100644
index 000000000..ad54bd1b8
--- /dev/null
+++ b/public/emoji/1f414_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M20.143 32.215c0 1.183-.959 2.143-2.143 2.143s-2.143-.96-2.143-2.143c0-1.184.96-2.144 2.143-2.144s2.143.96 2.143 2.144z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.643 15.643C27.643 10.317 23.324 6 18 6c-5.326 0-9.643 4.317-9.643 9.643 0 5.357-1.071 16.572-1.071 16.572 0 1.183.959 2.143 2.143 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.96 2.143 2.143 2.143 1.183 0 2.142-.96 2.142-2.143h4.286c0 1.183.96 2.143 2.144 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.959 2.143 2.143 2.143 1.184 0 2.143-.96 2.143-2.143-.002 0-1.073-11.215-1.073-16.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20 3c0 2.209-1.447 6-2 6-.552 0-2-3.791-2-6s1.448-3 2-3c.553 0 2 .791 2 3zm-4.365 30c0-2.612 1.711-8 2.365-8 .653 0 2.365 5.388 2.365 8S18.652 36 18 36c-.654 0-2.365-.388-2.365-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="22.5" rx="7" ry="4.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25 22.5c0 1.5-14 1.5-14 0s4.791-4.5 7-4.5 7 3 7 4.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.5" cy="18.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="24.5" cy="18.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M20.143 32.215c0 1.183-.959 2.143-2.143 2.143s-2.143-.96-2.143-2.143c0-1.184.96-2.144 2.143-2.144s2.143.96 2.143 2.144z"/>
+  <path fill="#E1E8ED" d="M27.643 15.643C27.643 10.317 23.324 6 18 6c-5.326 0-9.643 4.317-9.643 9.643 0 5.357-1.071 16.572-1.071 16.572 0 1.183.959 2.143 2.143 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.96 2.143 2.143 2.143 1.183 0 2.142-.96 2.142-2.143h4.286c0 1.183.96 2.143 2.144 2.143 1.183 0 2.143-.96 2.143-2.143 0 1.183.959 2.143 2.143 2.143 1.184 0 2.143-.96 2.143-2.143-.002 0-1.073-11.215-1.073-16.572z"/>
+  <path fill="#DD2E44" d="M20 3c0 2.209-1.447 6-2 6-.552 0-2-3.791-2-6s1.448-3 2-3c.553 0 2 .791 2 3zm-4.365 30c0-2.612 1.711-8 2.365-8 .653 0 2.365 5.388 2.365 8S18.652 36 18 36c-.654 0-2.365-.388-2.365-3z"/>
+  <ellipse fill="#F4900C" cx="18" cy="22.5" rx="7" ry="4.5"/>
+  <path fill="#FFAC33" d="M25 22.5c0 1.5-14 1.5-14 0s4.791-4.5 7-4.5 7 3 7 4.5z"/>
+  <circle fill="#292F33" cx="11.5" cy="18.5" r="1.5"/>
+  <circle fill="#292F33" cx="24.5" cy="18.5" r="1.5"/>
+</svg>
diff --git a/public/emoji/1f41c_border.svg b/public/emoji/1f41c_border.svg
new file mode 100644
index 000000000..929f7482a
--- /dev/null
+++ b/public/emoji/1f41c_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7.5 24.516c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414L22.81 6.793c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414L8.207 24.223c-.196.195-.452.293-.707.293zm8.282-11.738c-.219 0-.438-.071-.623-.218-.431-.344-.502-.971-.161-1.403.113-.144 2.571-3.361.971-7.572-.196-.517.063-1.094.579-1.29.518-.196 1.094.064 1.29.579 2.017 5.307-1.139 9.357-1.274 9.527-.197.248-.488.377-.782.377zm3.89 3.888c-.221 0-.441-.072-.626-.221-.429-.345-.499-.97-.156-1.4.138-.172 3.435-4.197 9.323-2.726.536.134.862.677.727 1.213-.134.535-.679.861-1.212.728-4.623-1.157-7.172 1.905-7.278 2.036-.197.243-.487.37-.778.37zM6.454 18.511c-1.096 0-2.301-.186-3.58-.671-.517-.196-.776-.773-.58-1.29.195-.517.775-.775 1.29-.58 4.219 1.604 7.439-.866 7.574-.972.434-.338 1.062-.266 1.403.166.342.432.271 1.058-.159 1.4-.129.103-2.495 1.947-5.948 1.947zm1.564-8.066c-1.829 0-4.968-.482-7.542-3.332-.37-.41-.338-1.042.072-1.412.411-.371 1.043-.337 1.412.072C4.984 9.122 8.976 8.392 9.146 8.36c.538-.105 1.066.246 1.173.787.107.54-.241 1.064-.781 1.174-.069.014-.644.124-1.52.124z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9.341 10.341c-.066 0-.132-.006-.199-.02-.541-.109-.89-.635-.783-1.175.034-.173.76-4.163-2.587-7.185C5.362 1.591 5.33.959 5.7.549 6.069.14 6.702.106 7.113.477c4.214 3.806 3.251 8.849 3.207 9.062-.096.475-.513.802-.979.802zm3.948 18.63c-.448 0-.856-.303-.969-.758-1.473-5.895 2.554-9.186 2.726-9.323.431-.344 1.061-.273 1.405.159.343.431.273 1.058-.156 1.402-.14.114-3.187 2.667-2.035 7.277.134.535-.192 1.078-.728 1.212-.081.021-.163.031-.243.031z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29.844 19.167c-2.96-2.959-6.095-3.569-8.915-2.069-.157-1.874-1.166-4.007-2.521-5.363-1.488-1.488-3.008-1.653-4.405-1.044 1.058-2.465.6-5.43-.826-6.856-1.843-1.843-4.594-.411-7.174 2.168-2.58 2.58-4.012 5.331-2.168 7.174 1.425 1.426 4.391 1.883 6.856.826-.61 1.397-.444 2.918 1.044 4.405 1.354 1.354 3.489 2.363 5.363 2.521-1.5 2.82-.891 5.954 2.069 8.915 3.75 3.749 12.204 5.527 14.204 3.527s.223-10.455-3.527-14.204z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M7.5 24.516c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.024 0-1.414L22.81 6.793c.391-.391 1.023-.391 1.414 0s.391 1.024 0 1.414L8.207 24.223c-.196.195-.452.293-.707.293zm8.282-11.738c-.219 0-.438-.071-.623-.218-.431-.344-.502-.971-.161-1.403.113-.144 2.571-3.361.971-7.572-.196-.517.063-1.094.579-1.29.518-.196 1.094.064 1.29.579 2.017 5.307-1.139 9.357-1.274 9.527-.197.248-.488.377-.782.377zm3.89 3.888c-.221 0-.441-.072-.626-.221-.429-.345-.499-.97-.156-1.4.138-.172 3.435-4.197 9.323-2.726.536.134.862.677.727 1.213-.134.535-.679.861-1.212.728-4.623-1.157-7.172 1.905-7.278 2.036-.197.243-.487.37-.778.37zM6.454 18.511c-1.096 0-2.301-.186-3.58-.671-.517-.196-.776-.773-.58-1.29.195-.517.775-.775 1.29-.58 4.219 1.604 7.439-.866 7.574-.972.434-.338 1.062-.266 1.403.166.342.432.271 1.058-.159 1.4-.129.103-2.495 1.947-5.948 1.947zm1.564-8.066c-1.829 0-4.968-.482-7.542-3.332-.37-.41-.338-1.042.072-1.412.411-.371 1.043-.337 1.412.072C4.984 9.122 8.976 8.392 9.146 8.36c.538-.105 1.066.246 1.173.787.107.54-.241 1.064-.781 1.174-.069.014-.644.124-1.52.124z"/>
+  <path fill="#31373D" d="M9.341 10.341c-.066 0-.132-.006-.199-.02-.541-.109-.89-.635-.783-1.175.034-.173.76-4.163-2.587-7.185C5.362 1.591 5.33.959 5.7.549 6.069.14 6.702.106 7.113.477c4.214 3.806 3.251 8.849 3.207 9.062-.096.475-.513.802-.979.802zm3.948 18.63c-.448 0-.856-.303-.969-.758-1.473-5.895 2.554-9.186 2.726-9.323.431-.344 1.061-.273 1.405.159.343.431.273 1.058-.156 1.402-.14.114-3.187 2.667-2.035 7.277.134.535-.192 1.078-.728 1.212-.081.021-.163.031-.243.031z"/>
+  <path fill="#31373D" d="M29.844 19.167c-2.96-2.959-6.095-3.569-8.915-2.069-.157-1.874-1.166-4.007-2.521-5.363-1.488-1.488-3.008-1.653-4.405-1.044 1.058-2.465.6-5.43-.826-6.856-1.843-1.843-4.594-.411-7.174 2.168-2.58 2.58-4.012 5.331-2.168 7.174 1.425 1.426 4.391 1.883 6.856.826-.61 1.397-.444 2.918 1.044 4.405 1.354 1.354 3.489 2.363 5.363 2.521-1.5 2.82-.891 5.954 2.069 8.915 3.75 3.749 12.204 5.527 14.204 3.527s.223-10.455-3.527-14.204z"/>
+</svg>
diff --git a/public/emoji/1f440_border.svg b/public/emoji/1f440_border.svg
new file mode 100644
index 000000000..f25c3ca40
--- /dev/null
+++ b/public/emoji/1f440_border.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <ellipse cx="8.828" cy="18" rx="7.953" ry="13.281" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.828 32.031C3.948 32.031.125 25.868.125 18S3.948 3.969 8.828 3.969 17.531 10.132 17.531 18s-3.823 14.031-8.703 14.031zm0-26.562C4.856 5.469 1.625 11.09 1.625 18s3.231 12.531 7.203 12.531S16.031 24.91 16.031 18 12.8 5.469 8.828 5.469z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.594" cy="18" r="4.96" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6.594" cy="18" r="3.565" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="7.911" cy="15.443" r="1.426" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="27.234" cy="18" rx="7.953" ry="13.281" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.234 32.031c-4.88 0-8.703-6.163-8.703-14.031s3.823-14.031 8.703-14.031S35.938 10.132 35.938 18s-3.824 14.031-8.704 14.031zm0-26.562c-3.972 0-7.203 5.622-7.203 12.531 0 6.91 3.231 12.531 7.203 12.531S34.438 24.91 34.438 18 31.206 5.469 27.234 5.469z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="18" r="4.96" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="18" r="3.565" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="26.317" cy="15.443" r="1.426" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <ellipse fill="#F5F8FA" cx="8.828" cy="18" rx="7.953" ry="13.281"/>
+  <path fill="#E1E8ED" d="M8.828 32.031C3.948 32.031.125 25.868.125 18S3.948 3.969 8.828 3.969 17.531 10.132 17.531 18s-3.823 14.031-8.703 14.031zm0-26.562C4.856 5.469 1.625 11.09 1.625 18s3.231 12.531 7.203 12.531S16.031 24.91 16.031 18 12.8 5.469 8.828 5.469z"/>
+  <circle fill="#8899A6" cx="6.594" cy="18" r="4.96"/>
+  <circle fill="#292F33" cx="6.594" cy="18" r="3.565"/>
+  <circle fill="#F5F8FA" cx="7.911" cy="15.443" r="1.426"/>
+  <ellipse fill="#F5F8FA" cx="27.234" cy="18" rx="7.953" ry="13.281"/>
+  <path fill="#E1E8ED" d="M27.234 32.031c-4.88 0-8.703-6.163-8.703-14.031s3.823-14.031 8.703-14.031S35.938 10.132 35.938 18s-3.824 14.031-8.704 14.031zm0-26.562c-3.972 0-7.203 5.622-7.203 12.531 0 6.91 3.231 12.531 7.203 12.531S34.438 24.91 34.438 18 31.206 5.469 27.234 5.469z"/>
+  <circle fill="#8899A6" cx="25" cy="18" r="4.96"/>
+  <circle fill="#292F33" cx="25" cy="18" r="3.565"/>
+  <circle fill="#F5F8FA" cx="26.317" cy="15.443" r="1.426"/>
+</svg>
diff --git a/public/emoji/1f464_border.svg b/public/emoji/1f464_border.svg
new file mode 100644
index 000000000..c7393d6bd
--- /dev/null
+++ b/public/emoji/1f464_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M24 26.799v-2.566c2-1.348 4.08-3.779 4.703-6.896.186.103.206.17.413.17.991 0 1.709-1.287 1.709-2.873 0-1.562-.823-2.827-1.794-2.865.187-.674.293-1.577.293-2.735C29.324 5.168 26 .527 18.541.527c-6.629 0-10.777 4.641-10.777 8.507 0 1.123.069 2.043.188 2.755-.911.137-1.629 1.352-1.629 2.845 0 1.587.804 2.873 1.796 2.873.206 0 .025-.067.209-.17C8.952 20.453 11 22.885 13 24.232v2.414c-5 .645-12 3.437-12 6.23v1.061C1 35 2.076 35 3.137 35h29.725C33.924 35 35 35 35 33.938v-1.061c0-2.615-6-5.225-11-6.078z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#269" d="M24 26.799v-2.566c2-1.348 4.08-3.779 4.703-6.896.186.103.206.17.413.17.991 0 1.709-1.287 1.709-2.873 0-1.562-.823-2.827-1.794-2.865.187-.674.293-1.577.293-2.735C29.324 5.168 26 .527 18.541.527c-6.629 0-10.777 4.641-10.777 8.507 0 1.123.069 2.043.188 2.755-.911.137-1.629 1.352-1.629 2.845 0 1.587.804 2.873 1.796 2.873.206 0 .025-.067.209-.17C8.952 20.453 11 22.885 13 24.232v2.414c-5 .645-12 3.437-12 6.23v1.061C1 35 2.076 35 3.137 35h29.725C33.924 35 35 35 35 33.938v-1.061c0-2.615-6-5.225-11-6.078z"/>
+</svg>
diff --git a/public/emoji/1f465_border.svg b/public/emoji/1f465_border.svg
new file mode 100644
index 000000000..cc3732c4e
--- /dev/null
+++ b/public/emoji/1f465_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29 20.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.068 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13.477 2.384 2.484 4.243 3.484 5.274v1.847c-4 .492-7 2.628-7 4.765v.81c0 .812.823.812 1.634.812h18.73c.813 0 1.636 0 1.636-.812v-.81c0-2.001-3-3.997-6-4.649z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17 28.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.069 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13C4.993 23.876 7 25.735 8 26.766v1.847c-4 .492-7 2.628-7 4.765v.811C1 35 1.823 35 2.634 35h18.73c.813 0 1.636 0 1.636-.812v-.811c0-2-3-3.996-6-4.648z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#55ACEE" d="M29 20.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.068 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13.477 2.384 2.484 4.243 3.484 5.274v1.847c-4 .492-7 2.628-7 4.765v.81c0 .812.823.812 1.634.812h18.73c.813 0 1.636 0 1.636-.812v-.81c0-2.001-3-3.997-6-4.649z"/>
+  <path fill="#269" d="M17 28.729v-1.963c1-1.03 2.914-2.89 3.391-5.273.142.079.055.13.213.13.758 0 1.256-.983 1.256-2.197 0-1.194-.656-2.161-1.399-2.191.143-.516.212-1.206.212-2.092 0-2.956-2.549-6.505-8.253-6.505-5.069 0-8.244 3.549-8.244 6.505 0 .858.051 1.562.142 2.107-.697.105-1.247 1.033-1.247 2.175 0 1.214.614 2.197 1.373 2.197.157 0-.069-.051.072-.13C4.993 23.876 7 25.735 8 26.766v1.847c-4 .492-7 2.628-7 4.765v.811C1 35 1.823 35 2.634 35h18.73c.813 0 1.636 0 1.636-.812v-.811c0-2-3-3.996-6-4.648z"/>
+</svg>
diff --git a/public/emoji/1f47b_border.svg b/public/emoji/1f47b_border.svg
new file mode 100644
index 000000000..80ac01215
--- /dev/null
+++ b/public/emoji/1f47b_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 11c0-1.104-.896-2-2-2s-2 .896-2 2c0 0-.011 3.285-3 3.894V12c0-6.075-4.925-11-11-11S7 5.925 7 12v3.237C1.778 16.806 0 23.231 0 27c0 1.104.896 2 2 2s2-.896 2-2c0 0 .002-3.54 3.336-3.958C7.838 27.883 8.954 33 11 33h1c4 0 3 2 7 2s3-2 6-2 2.395 2 6 2c1.657 0 3-1.343 3-3 0-.675-2.274-4.994-3.755-9.268C35.981 21.348 36 14.58 36 11z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13" cy="12" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="23" cy="12" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="23" cy="13" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.192 19.491c2.65 1.987 3.591 5.211 2.1 7.199-1.491 1.988-4.849 1.988-7.5 0-2.65-1.987-3.591-5.211-2.1-7.199 1.492-1.989 4.849-1.988 7.5 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E1E8ED" d="M36 11c0-1.104-.896-2-2-2s-2 .896-2 2c0 0-.011 3.285-3 3.894V12c0-6.075-4.925-11-11-11S7 5.925 7 12v3.237C1.778 16.806 0 23.231 0 27c0 1.104.896 2 2 2s2-.896 2-2c0 0 .002-3.54 3.336-3.958C7.838 27.883 8.954 33 11 33h1c4 0 3 2 7 2s3-2 6-2 2.395 2 6 2c1.657 0 3-1.343 3-3 0-.675-2.274-4.994-3.755-9.268C35.981 21.348 36 14.58 36 11z"/>
+  <circle fill="#292F33" cx="13" cy="12" r="2"/>
+  <circle fill="#292F33" cx="23" cy="12" r="4"/>
+  <circle fill="#9AAAB4" cx="23" cy="13" r="2"/>
+  <path fill="#292F33" d="M22.192 19.491c2.65 1.987 3.591 5.211 2.1 7.199-1.491 1.988-4.849 1.988-7.5 0-2.65-1.987-3.591-5.211-2.1-7.199 1.492-1.989 4.849-1.988 7.5 0z"/>
+</svg>
diff --git a/public/emoji/1f47d_border.svg b/public/emoji/1f47d_border.svg
new file mode 100644
index 000000000..e1d4a54d7
--- /dev/null
+++ b/public/emoji/1f47d_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 17c0 9.389-13.223 19-17 19-3.778 0-17-9.611-17-19S8.611 0 18 0s17 7.611 17 17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.503 14.845c3.124 3.124 4.39 6.923 2.828 8.485-1.562 1.562-5.361.297-8.485-2.828-3.125-3.124-4.391-6.923-2.828-8.485s5.361-.296 8.485 2.828zm8.994 0c-3.124 3.124-4.39 6.923-2.828 8.485 1.562 1.562 5.361.297 8.485-2.828 3.125-3.125 4.391-6.923 2.828-8.485-1.562-1.562-5.361-.297-8.485 2.828zM18 31c-2.347 0-3.575-1.16-3.707-1.293-.391-.391-.391-1.023 0-1.414.387-.387 1.013-.391 1.404-.01.051.047.806.717 2.303.717 1.519 0 2.273-.689 2.305-.719.398-.374 1.027-.363 1.408.029.379.393.38 1.011-.006 1.396C21.575 29.84 20.347 31 18 31z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M35 17c0 9.389-13.223 19-17 19-3.778 0-17-9.611-17-19S8.611 0 18 0s17 7.611 17 17z"/>
+  <path fill="#292F33" d="M13.503 14.845c3.124 3.124 4.39 6.923 2.828 8.485-1.562 1.562-5.361.297-8.485-2.828-3.125-3.124-4.391-6.923-2.828-8.485s5.361-.296 8.485 2.828zm8.994 0c-3.124 3.124-4.39 6.923-2.828 8.485 1.562 1.562 5.361.297 8.485-2.828 3.125-3.125 4.391-6.923 2.828-8.485-1.562-1.562-5.361-.297-8.485 2.828zM18 31c-2.347 0-3.575-1.16-3.707-1.293-.391-.391-.391-1.023 0-1.414.387-.387 1.013-.391 1.404-.01.051.047.806.717 2.303.717 1.519 0 2.273-.689 2.305-.719.398-.374 1.027-.363 1.408.029.379.393.38 1.011-.006 1.396C21.575 29.84 20.347 31 18 31z"/>
+</svg>
diff --git a/public/emoji/1f480_border.svg b/public/emoji/1f480_border.svg
new file mode 100644
index 000000000..8546f7b00
--- /dev/null
+++ b/public/emoji/1f480_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34 16C34 6 26.837 0 18 0 9.164 0 2 6 2 16c0 5.574.002 10.388 6 12.64V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.155c.324.027.659.05 1 .07V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.085c.342-.021.676-.043 1-.07V33c0 1.657 1.344 3 3 3 1.657 0 3-1.343 3-3v-4.36c5.998-2.252 6-7.066 6-12.64z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11" cy="14" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="25" cy="14" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19.903 23.062C19.651 22.449 18.9 22 18 22s-1.652.449-1.903 1.062c-.632.176-1.097.75-1.097 1.438 0 .828.671 1.5 1.5 1.5.655 0 1.206-.422 1.41-1.007.03.001.059.007.09.007s.06-.006.09-.007c.205.585.756 1.007 1.41 1.007.828 0 1.5-.672 1.5-1.5 0-.688-.466-1.261-1.097-1.438z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M34 16C34 6 26.837 0 18 0 9.164 0 2 6 2 16c0 5.574.002 10.388 6 12.64V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.155c.324.027.659.05 1 .07V33c0 1.657 1.343 3 3 3s3-1.343 3-3v-3.085c.342-.021.676-.043 1-.07V33c0 1.657 1.344 3 3 3 1.657 0 3-1.343 3-3v-4.36c5.998-2.252 6-7.066 6-12.64z"/>
+  <circle fill="#292F33" cx="11" cy="14" r="5"/>
+  <circle fill="#292F33" cx="25" cy="14" r="5"/>
+  <path fill="#292F33" d="M19.903 23.062C19.651 22.449 18.9 22 18 22s-1.652.449-1.903 1.062c-.632.176-1.097.75-1.097 1.438 0 .828.671 1.5 1.5 1.5.655 0 1.206-.422 1.41-1.007.03.001.059.007.09.007s.06-.006.09-.007c.205.585.756 1.007 1.41 1.007.828 0 1.5-.672 1.5-1.5 0-.688-.466-1.261-1.097-1.438z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..7c7ff7949
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#292F33" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#F7DECE" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..e601eae22
--- /dev/null
+++ b/public/emoji/1f482-1f3fb-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#F7DECE" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#EEC2AD" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#F7DECE" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fb_border.svg b/public/emoji/1f482-1f3fb_border.svg
new file mode 100644
index 000000000..98d025086
--- /dev/null
+++ b/public/emoji/1f482-1f3fb_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#F7DECE" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#EEC2AD" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#292F33" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#F7DECE" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..4542fbc40
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFE51E" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#F3D2A2" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..e4cf68375
--- /dev/null
+++ b/public/emoji/1f482-1f3fc-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#F3D2A2" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#E2C196" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#F3D2A2" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fc_border.svg b/public/emoji/1f482-1f3fc_border.svg
new file mode 100644
index 000000000..279f34362
--- /dev/null
+++ b/public/emoji/1f482-1f3fc_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#F3D2A2" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#E2C196" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#FFE51E" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#F3D2A2" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..d93566dcc
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#963B22" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#D5AB88" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..bd4270dd3
--- /dev/null
+++ b/public/emoji/1f482-1f3fd-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#D5AB88" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#CC9B7A" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#D5AB88" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fd_border.svg b/public/emoji/1f482-1f3fd_border.svg
new file mode 100644
index 000000000..1d40871a6
--- /dev/null
+++ b/public/emoji/1f482-1f3fd_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#D4AB88" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#CC9B7A" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#963B22" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#D4AB88" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..1f590fa5e
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#60352A" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#AF7E57" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#60352A" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#915A34" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..b74e4930c
--- /dev/null
+++ b/public/emoji/1f482-1f3fe-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#AF7E57" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#9B6A49" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#AF7E57" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#915A34" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#60352A" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3fe_border.svg b/public/emoji/1f482-1f3fe_border.svg
new file mode 100644
index 000000000..0024c77f8
--- /dev/null
+++ b/public/emoji/1f482-1f3fe_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#AF7E57" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#9B6A49" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#60352A" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#AF7E57" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#915A34" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#915A34" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg b/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..e426d8efa
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#0B0200" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#7C533E" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#3D2E24" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg b/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..3c4515c0f
--- /dev/null
+++ b/public/emoji/1f482-1f3ff-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#7C533E" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#664131" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#7C533E" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#3D2E24" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-1f3ff_border.svg b/public/emoji/1f482-1f3ff_border.svg
new file mode 100644
index 000000000..0183693a9
--- /dev/null
+++ b/public/emoji/1f482-1f3ff_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#7C533E" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#664131" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#0B0200" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#7C533E" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#3D2E24" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#3D2E24" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482-200d-2640-fe0f_border.svg b/public/emoji/1f482-200d-2640-fe0f_border.svg
new file mode 100644
index 000000000..480318a6e
--- /dev/null
+++ b/public/emoji/1f482-200d-2640-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 30h1v6h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M28 36v-2.5c0-3.313-1.687-5.5-5-5.5H13c-3.313 0-5 2.187-5 5.5V36h20z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFAC33" d="M18 18H9.679s-.016 1.731.01 2.844c.06 2.517.342 5.496 1.539 5.496 1.594 0 3.616-1.549 6.715-1.549 3.099 0 5.166 1.549 6.715 1.549 1.293 0 1.506-1.09 1.542-5.345.008-.846.009-2.995.009-2.995H18z"/>
+  <path fill="#FFDC5D" d="M24.94 18.883c0-.298-.013-.592-.035-.883H10.983c-.022.291-.035.585-.035.883 0 3.545 1.598 6.483 3.915 7.881v1.749c1.249.907 2.041 1.153 3.124 1.153 1.083 0 1.874-.246 3.124-1.153v-1.799c2.27-1.418 3.829-4.329 3.829-7.831z"/>
+  <path fill="#DF1F32" d="M17.944 25.551c-1.368 0-2.084-.676-2.161-.754-.228-.228-.228-.597 0-.824.226-.225.59-.227.819-.006.03.027.47.418 1.342.418.885 0 1.325-.402 1.344-.419.232-.218.599-.211.821.017.221.229.221.589-.003.814-.078.077-.794.754-2.162.754z"/>
+  <path fill="#662113" d="M15.17 20.731h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652zm5.764 0h-.137c-.358 0-.652-.293-.652-.652v-.858c0-.358.293-.652.652-.652h.137c.358 0 .652.293.652.652v.858c0 .359-.293.652-.652.652z"/>
+  <path fill="#C1694F" d="M18.679 22.958h-1.391c-.212 0-.385-.173-.385-.385v-.081c0-.212.173-.385.385-.385h1.391c.212 0 .385.173.385.385v.081c0 .212-.173.385-.385.385z"/>
+  <path fill="#292F33" d="M13.578 29.492l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm8.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 30h1v6h-1z"/>
+  <path fill="#292F33" d="M21.13 26.971c0 1.459-2.071 2.022-3.13 2.022-1 0-3.13-.563-3.13-2.022 0 0-.574-.117-.574 1.096 0 1.214 1.704 2.778 3.704 2.778 1.956 0 3.704-1.564 3.704-2.778 0-1.213-.574-1.096-.574-1.096z"/>
+</svg>
diff --git a/public/emoji/1f482-200d-2642-fe0f_border.svg b/public/emoji/1f482-200d-2642-fe0f_border.svg
new file mode 100644
index 000000000..5c68070a7
--- /dev/null
+++ b/public/emoji/1f482-200d-2642-fe0f_border.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M30 36v-1c0-3.313-1.687-6-5-6H11c-3.313 0-5 2.687-5 6v1h24z"/>
+  <path fill="#292F33" d="M27 6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12c0 4.971 4.029 5 9 5s9-.029 9-5V6z"/>
+  <path fill="#FFDC5D" d="M14.626 29.456c1.344.976 2.195 1.194 3.36 1.194s2.016-.218 3.36-1.194v-2.938h-6.721v2.938z"/>
+  <path fill="#F9CA55" d="M14.62 27.816c.938 1.059 2.1 1.345 3.364 1.345 1.264 0 2.426-.287 3.364-1.345v-2.691H14.62v2.691z"/>
+  <path fill="#FFDC5D" d="M25.565 20.08c0-1.116-.565-2.021-1.263-2.021-.064 0-.125.015-.186.03-.009-.03-.016-.06-.026-.089H11.883c-.01.029-.016.059-.026.089-.061-.015-.123-.03-.186-.03-.698 0-1.263.905-1.263 2.021 0 1.025.479 1.863 1.097 1.994.489 3.734 3.201 6.595 6.482 6.595s5.993-2.861 6.482-6.595c.618-.132 1.096-.969 1.096-1.994z"/>
+  <path fill="#C1694F" d="M17.987 26.143c-2.123 0-2.774-.544-2.884-.653-.197-.197-.197-.517 0-.714.191-.191.497-.197.695-.018.04.029.556.376 2.188.376 1.695 0 2.186-.374 2.191-.377.197-.196.506-.187.704.01.197.197.187.527-.011.724-.109.108-.761.652-2.883.652zm.578-3.123h-1.156c-.318 0-.578-.26-.578-.578 0-.318.26-.578.578-.578h1.156c.318 0 .578.26.578.578 0 .318-.261.578-.578.578z"/>
+  <path fill="#662113" d="M14.904 20.9c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c-.001.424-.348.771-.771.771zm6.165 0c-.424 0-.771-.347-.771-.771v-.771c0-.424.347-.771.771-.771.424 0 .771.347.771.771v.771c0 .424-.347.771-.771.771z"/>
+  <path fill="#292F33" d="M12.578 30.461l-4.653.737c-.272.043-.529-.144-.572-.416l-.156-.988c-.043-.272.144-.529.416-.572l4.653-.737c.272-.043.529.144.572.416l.156.988c.043.271-.144.529-.416.572zm10.87 0l4.653.737c.272.043.529-.144.572-.416l.156-.988c.043-.272-.144-.529-.416-.572l-4.653-.737c-.272-.043-.529.144-.572.416l-.156.988c-.043.271.144.529.416.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9 6.113 9 6.137-9 6.137-9H25s-.307 10-7 10-7-10-7-10h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f482_border.svg b/public/emoji/1f482_border.svg
new file mode 100644
index 000000000..f4da528fb
--- /dev/null
+++ b/public/emoji/1f482_border.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.5 31h1v5h-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#DD2E44" d="M29.192 36v-1c0-3.314-2.686-6-6-6H11.808c-2.761 0-5 2.239-5 5v2h22.384z"/>
+  <path fill="#292F33" d="M9 18c0 4.971 4.029 5 9 5s9-.029 9-5c0-.153-4.563-.998-9-1-4.562-.002-9 .843-9 1z"/>
+  <path fill="#FFDC5D" d="M14.587 29.169l3.414 1.493 3.415-1.493v-3.415h-6.829z"/>
+  <path fill="#F9CA55" d="M14.587 27.558c1.038 1.173 2.011 1.467 3.411 1.467 1.399 0 2.379-.295 3.418-1.467v-3.414h-6.829v3.414z"/>
+  <path fill="#FFAC33" d="M20.76 9.97c-1.476-.478-4.95-.347-5.818.782-2.258.043-4.907 2.084-5.254 4.776-.344 2.665.422 3.902.695 5.905.309 2.27 1.585 2.996 2.605 3.3 1.468 1.939 3.028 1.856 5.648 1.856 5.116 0 7.553-3.423 7.769-9.238.13-3.517-1.934-6.18-5.645-7.381z"/>
+  <path fill="#FFDC5D" d="M23.686 17.6c-.495-.685-1.129-1.237-2.518-1.433.521.239 1.02 1.064 1.086 1.52.065.456.13.825-.282.369-1.653-1.827-3.452-1.107-5.236-2.223-1.246-.779-1.625-1.641-1.625-1.641s-.152 1.151-2.041 2.323c-.548.34-1.201 1.097-1.563 2.214-.261.803-.18 1.52-.18 2.744 0 3.574 2.945 6.578 6.578 6.578s6.578-3.031 6.578-6.578c0-2.223-.233-3.092-.797-3.873z"/>
+  <path fill="#C1694F" d="M18.636 23.3h-1.462c-.202 0-.365-.163-.365-.365s.163-.365.365-.365h1.462c.202 0 .365.163.365.365s-.163.365-.365.365z"/>
+  <path fill="#662113" d="M14.981 20.742c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731.404 0 .731.327.731.731v.731c0 .403-.327.731-.731.731zm5.848 0c-.404 0-.731-.327-.731-.731v-.731c0-.404.327-.731.731-.731s.731.327.731.731v.731c-.001.403-.328.731-.731.731z"/>
+  <path fill="#C1694F" d="M18.001 26.352c-2.112 0-2.76-.541-2.869-.65-.196-.196-.196-.514 0-.711.19-.19.495-.195.692-.018.04.028.553.374 2.177.374 1.687 0 2.175-.372 2.179-.376.196-.195.504-.186.7.011.196.196.186.523-.011.72-.107.109-.756.65-2.868.65"/>
+  <path fill="#292F33" d="M27 18V6c0-3.3-2.7-6-6-6h-6c-3.3 0-6 2.7-6 6v12h18zM12.943 30.461l-4.34.737c-.253.043-.493-.144-.533-.416l-.146-.988c-.04-.272.134-.529.388-.572l4.34-.737c.253-.043.493.144.534.416l.146.988c.039.271-.135.529-.389.572zm10.138 0l4.34.737c.253.043.493-.144.534-.416l.146-.988c.04-.272-.134-.529-.388-.572l-4.34-.737c-.253-.043-.493.144-.534.416l-.146.988c-.04.271.135.529.388.572z"/>
+  <path fill="#99AAB5" d="M11.875 18s-.174 9.414 6.113 9.414S24.125 18 24.125 18H25s-.307 10.461-7 10.461S11 18 11 18h.875z"/>
+  <path fill="#F5F8FA" d="M17.5 31h1v5h-1z"/>
+  <path fill="#292F33" d="M21.38 27.816C21.38 29.391 19.144 30 18 30s-3.38-.609-3.38-2.184c0 0-.62-.127-.62 1.184s1.888 3 4 3 4-1.689 4-3-.62-1.184-.62-1.184z"/>
+</svg>
diff --git a/public/emoji/1f4a3_border.svg b/public/emoji/1f4a3_border.svg
new file mode 100644
index 000000000..aac8f4443
--- /dev/null
+++ b/public/emoji/1f4a3_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M24.187 9.657l5.658-5.654L32 6.16l-5.658 5.655z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="14" cy="22" r="14" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M19 11.342l5.658-5.657 5.657 5.658L24.657 17z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32" cy="4" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32" cy="4" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M24.187 9.657l5.658-5.654L32 6.16l-5.658 5.655z"/>
+  <circle fill="#31373D" cx="14" cy="22" r="14"/>
+  <path fill="#31373D" d="M19 11.342l5.658-5.657 5.657 5.658L24.657 17z"/>
+  <circle fill="#F18F26" cx="32" cy="4" r="4"/>
+  <circle fill="#FDCB58" cx="32" cy="4" r="2"/>
+</svg>
diff --git a/public/emoji/1f4a8_border.svg b/public/emoji/1f4a8_border.svg
new file mode 100644
index 000000000..c20a5cb3b
--- /dev/null
+++ b/public/emoji/1f4a8_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 15c0-4.155-3.169-7.568-7.221-7.96C27.884 3.013 24.297 0 20 0c-4.971 0-9 3.56-9 8.531 0 1.156.25 2.906 1.121 3.785C8.859 12.5 4.094 12.6 0 12.015c0 0 4.816 3.831 15.357 3.985-.151.313-.254 1.43-.306 1.786-.249.003-.595.009-1.051.009C6 17.795 0 17 0 17s3 3.234 15.406 4.106C15 21.234 15 23 15 23c-8 0-15-1-15-1 3.362 2.802 6.724 4.033 9.03 4.574-.011.142-.03.281-.03.426 0 3.313 2.686 5 6 5 .487 0 .958-.064 1.412-.174C18.009 34.333 20.807 36 24 36c4.971 0 9-4.029 9-9 0-1.788-.527-3.449-1.427-4.851C34.195 20.837 36 18.132 36 15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M36 15c0-4.155-3.169-7.568-7.221-7.96C27.884 3.013 24.297 0 20 0c-4.971 0-9 3.56-9 8.531 0 1.156.25 2.906 1.121 3.785C8.859 12.5 4.094 12.6 0 12.015c0 0 4.816 3.831 15.357 3.985-.151.313-.254 1.43-.306 1.786-.249.003-.595.009-1.051.009C6 17.795 0 17 0 17s3 3.234 15.406 4.106C15 21.234 15 23 15 23c-8 0-15-1-15-1 3.362 2.802 6.724 4.033 9.03 4.574-.011.142-.03.281-.03.426 0 3.313 2.686 5 6 5 .487 0 .958-.064 1.412-.174C18.009 34.333 20.807 36 24 36c4.971 0 9-4.029 9-9 0-1.788-.527-3.449-1.427-4.851C34.195 20.837 36 18.132 36 15z"/>
+</svg>
diff --git a/public/emoji/1f4ac_border.svg b/public/emoji/1f4ac_border.svg
new file mode 100644
index 000000000..3d71232f9
--- /dev/null
+++ b/public/emoji/1f4ac_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 1C8.059 1 0 7.268 0 15c0 4.368 2.574 8.268 6.604 10.835C6.08 28.144 4.859 31.569 2 35c5.758-.96 9.439-3.761 11.716-6.416 1.376.262 2.805.416 4.284.416 9.941 0 18-6.268 18-14S27.941 1 18 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="26" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="10" cy="15" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M18 1C8.059 1 0 7.268 0 15c0 4.368 2.574 8.268 6.604 10.835C6.08 28.144 4.859 31.569 2 35c5.758-.96 9.439-3.761 11.716-6.416 1.376.262 2.805.416 4.284.416 9.941 0 18-6.268 18-14S27.941 1 18 1z"/>
+  <circle fill="#2A6797" cx="18" cy="15" r="2"/>
+  <circle fill="#2A6797" cx="26" cy="15" r="2"/>
+  <circle fill="#2A6797" cx="10" cy="15" r="2"/>
+</svg>
diff --git a/public/emoji/1f4ad_border.svg b/public/emoji/1f4ad_border.svg
new file mode 100644
index 000000000..c887a7126
--- /dev/null
+++ b/public/emoji/1f4ad_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35 12c0-3.866-3.134-7-7-7-1.167 0-2.265.29-3.232.794-2.082-2.827-5.425-4.669-9.205-4.669-5.132 0-9.475 3.38-10.923 8.036C1.982 9.778 0 12.155 0 15c0 2.979 2.174 5.445 5.021 5.913C5.237 24.862 8.498 28 12.5 28c2.176 0 4.13-.933 5.5-2.413C19.37 27.067 21.323 28 23.5 28c4.143 0 7.5-3.357 7.5-7.5 0-.71-.105-1.394-.289-2.045C33.23 17.396 35 14.905 35 12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="4" cy="31" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#BDDDF4" d="M35 12c0-3.866-3.134-7-7-7-1.167 0-2.265.29-3.232.794-2.082-2.827-5.425-4.669-9.205-4.669-5.132 0-9.475 3.38-10.923 8.036C1.982 9.778 0 12.155 0 15c0 2.979 2.174 5.445 5.021 5.913C5.237 24.862 8.498 28 12.5 28c2.176 0 4.13-.933 5.5-2.413C19.37 27.067 21.323 28 23.5 28c4.143 0 7.5-3.357 7.5-7.5 0-.71-.105-1.394-.289-2.045C33.23 17.396 35 14.905 35 12z"/>
+  <circle fill="#BDDDF4" cx="4" cy="31" r="3"/>
+</svg>
diff --git a/public/emoji/1f4b1_border.svg b/public/emoji/1f4b1_border.svg
new file mode 100644
index 000000000..f5ef5e849
--- /dev/null
+++ b/public/emoji/1f4b1_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M15.068 14.278c0-4.719-8.7-4.411-8.7-7.261 0-1.379 1.32-2.053 2.85-2.053 2.574 0 3.032 1.654 4.198 1.654.824 0 1.223-.521 1.223-1.103 0-1.353-2.053-2.378-4.021-2.732V1.476C10.617.661 9.958 0 9.143 0c-.817 0-1.477.661-1.477 1.476v1.353c-2.147.489-3.992 1.978-3.992 4.404 0 4.532 8.698 4.349 8.698 7.532 0 1.103-1.193 2.207-3.155 2.207-2.941 0-3.921-1.992-5.115-1.992-.582 0-1.103.49-1.103 1.23 0 1.17 1.965 2.581 4.667 2.976l-.001.01v1.473c0 .818.661 1.479 1.477 1.479.815 0 1.476-.661 1.476-1.479v-1.473c0-.018-.008-.031-.009-.047 2.431-.453 4.459-2.039 4.459-4.871zm8.828 11.598h-4.104c-.688 0-1.227-.327-1.227-.985 0-.661.539-.99 1.227-.99h2.876l-4.792-7.399c-.298-.449-.449-.775-.449-1.195 0-.571.57-.99 1.049-.99.481 0 .958.21 1.378.839l5.36 8.058 5.362-8.058c.419-.629.897-.839 1.378-.839.477 0 1.046.419 1.046.99 0 .42-.148.746-.448 1.195L27.76 23.9h2.875c.689 0 1.229.329 1.229.99 0 .658-.539.985-1.229.985h-4.102v2.126h4.102c.689 0 1.229.332 1.229.99 0 .658-.539.987-1.229.987h-4.102v4.611c0 .868-.539 1.41-1.319 1.41-.778 0-1.317-.542-1.317-1.41v-4.611h-4.104c-.688 0-1.227-.329-1.227-.987 0-.658.539-.99 1.227-.99h4.104v-2.125z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.875 6.125L17 2l4.125 6.875L17 13h11V2zm-14.75 23.75L16 34l-4.125-6.875L16 23H5v11z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M15.068 14.278c0-4.719-8.7-4.411-8.7-7.261 0-1.379 1.32-2.053 2.85-2.053 2.574 0 3.032 1.654 4.198 1.654.824 0 1.223-.521 1.223-1.103 0-1.353-2.053-2.378-4.021-2.732V1.476C10.617.661 9.958 0 9.143 0c-.817 0-1.477.661-1.477 1.476v1.353c-2.147.489-3.992 1.978-3.992 4.404 0 4.532 8.698 4.349 8.698 7.532 0 1.103-1.193 2.207-3.155 2.207-2.941 0-3.921-1.992-5.115-1.992-.582 0-1.103.49-1.103 1.23 0 1.17 1.965 2.581 4.667 2.976l-.001.01v1.473c0 .818.661 1.479 1.477 1.479.815 0 1.476-.661 1.476-1.479v-1.473c0-.018-.008-.031-.009-.047 2.431-.453 4.459-2.039 4.459-4.871zm8.828 11.598h-4.104c-.688 0-1.227-.327-1.227-.985 0-.661.539-.99 1.227-.99h2.876l-4.792-7.399c-.298-.449-.449-.775-.449-1.195 0-.571.57-.99 1.049-.99.481 0 .958.21 1.378.839l5.36 8.058 5.362-8.058c.419-.629.897-.839 1.378-.839.477 0 1.046.419 1.046.99 0 .42-.148.746-.448 1.195L27.76 23.9h2.875c.689 0 1.229.329 1.229.99 0 .658-.539.985-1.229.985h-4.102v2.126h4.102c.689 0 1.229.332 1.229.99 0 .658-.539.987-1.229.987h-4.102v4.611c0 .868-.539 1.41-1.319 1.41-.778 0-1.317-.542-1.317-1.41v-4.611h-4.104c-.688 0-1.227-.329-1.227-.987 0-.658.539-.99 1.227-.99h4.104v-2.125z"/>
+  <path fill="#67757F" d="M23.875 6.125L17 2l4.125 6.875L17 13h11V2zm-14.75 23.75L16 34l-4.125-6.875L16 23H5v11z"/>
+</svg>
diff --git a/public/emoji/1f4b2_border.svg b/public/emoji/1f4b2_border.svg
new file mode 100644
index 000000000..3bfe777e4
--- /dev/null
+++ b/public/emoji/1f4b2_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M28.81 23.209c0-7.672-14.144-7.171-14.144-11.803 0-2.242 2.145-3.337 4.633-3.337 4.184 0 4.929 2.688 6.824 2.688 1.342 0 1.988-.845 1.988-1.792 0-2.201-3.337-3.867-6.537-4.444V2.397c0-1.325-1.072-2.4-2.398-2.4-1.327 0-2.4 1.075-2.4 2.4v2.199c-3.489.794-6.49 3.214-6.49 7.159 0 7.369 14.142 7.071 14.142 12.247 0 1.793-1.941 3.586-5.129 3.586-4.781 0-6.374-3.236-8.316-3.236-.946 0-1.792.796-1.792 1.996 0 1.906 3.195 4.2 7.588 4.841l-.003.015v2.397c0 1.326 1.075 2.401 2.401 2.401 1.325 0 2.399-1.075 2.399-2.401v-2.397c0-.028-.014-.05-.016-.075 3.953-.738 7.25-3.315 7.25-7.92z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M28.81 23.209c0-7.672-14.144-7.171-14.144-11.803 0-2.242 2.145-3.337 4.633-3.337 4.184 0 4.929 2.688 6.824 2.688 1.342 0 1.988-.845 1.988-1.792 0-2.201-3.337-3.867-6.537-4.444V2.397c0-1.325-1.072-2.4-2.398-2.4-1.327 0-2.4 1.075-2.4 2.4v2.199c-3.489.794-6.49 3.214-6.49 7.159 0 7.369 14.142 7.071 14.142 12.247 0 1.793-1.941 3.586-5.129 3.586-4.781 0-6.374-3.236-8.316-3.236-.946 0-1.792.796-1.792 1.996 0 1.906 3.195 4.2 7.588 4.841l-.003.015v2.397c0 1.326 1.075 2.401 2.401 2.401 1.325 0 2.399-1.075 2.399-2.401v-2.397c0-.028-.014-.05-.016-.075 3.953-.738 7.25-3.315 7.25-7.92z"/>
+</svg>
diff --git a/public/emoji/1f4c3_border.svg b/public/emoji/1f4c3_border.svg
new file mode 100644
index 000000000..9e7b56241
--- /dev/null
+++ b/public/emoji/1f4c3_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M28 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.875-4-8V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31 36H4c4 0 4-8 4-8 0-2.209 1.791-4 4-4h20c2.209 0 4 2 4 4 0 0 .25 8-5 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 7c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H5c-.552 0-1-.447-1-1 0-.553.448-1 1-1h18c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M28 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.875-4-8V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z"/>
+  <path fill="#E1E8ED" d="M31 36H4c4 0 4-8 4-8 0-2.209 1.791-4 4-4h20c2.209 0 4 2 4 4 0 0 .25 8-5 8z"/>
+  <path fill="#99AAB5" d="M24 7c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .552-.447 1-1 1H5c-.552 0-1-.448-1-1s.448-1 1-1h18c.553 0 1 .448 1 1zm0 4c0 .553-.447 1-1 1H5c-.552 0-1-.447-1-1 0-.553.448-1 1-1h18c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f4de_border.svg b/public/emoji/1f4de_border.svg
new file mode 100644
index 000000000..2a8044d96
--- /dev/null
+++ b/public/emoji/1f4de_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34.06 26.407l-3.496-3.496c-1.93-1.93-5.06-1.93-6.989 0-.719.718-1.167 1.603-1.351 2.528-5.765-1.078-11.372-6.662-11.721-11.653.947-.176 1.854-.627 2.586-1.36 1.93-1.93 1.93-5.06 0-6.99L9.594 1.94c-1.93-1.93-5.06-1.93-6.99 0-10.486 10.486 20.97 41.942 31.456 31.456 1.929-1.929 1.929-5.059 0-6.989z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.06 26.407l-3.496-3.496c-1.93-1.93-5.06-1.93-6.989 0-.719.718-1.167 1.603-1.351 2.528-5.765-1.078-11.372-6.662-11.721-11.653.947-.176 1.854-.627 2.586-1.36 1.93-1.93 1.93-5.06 0-6.99L9.594 1.94c-1.93-1.93-5.06-1.93-6.99 0-10.486 10.486 20.97 41.942 31.456 31.456 1.929-1.929 1.929-5.059 0-6.989z"/>
+</svg>
diff --git a/public/emoji/1f4f7_border.svg b/public/emoji/1f4f7_border.svg
new file mode 100644
index 000000000..60421f912
--- /dev/null
+++ b/public/emoji/1f4f7_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M4 5s0-1 1-1h6s1 0 1 1v2H4V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="10" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="8" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32.5" cy="9.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M12 9.5c0 .829-.671 1.5-1.5 1.5h-5C4.671 11 4 10.329 4 9.5S4.671 8 5.5 8h5c.829 0 1.5.671 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#66757F" d="M4 5s0-1 1-1h6s1 0 1 1v2H4V5z"/>
+  <path fill="#31373D" d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z"/>
+  <circle fill="#CCD6DD" cx="21" cy="19" r="10"/>
+  <circle fill="#31373D" cx="21" cy="19" r="8"/>
+  <circle fill="#3B88C3" cx="21" cy="19" r="5"/>
+  <circle fill="#FFF" cx="32.5" cy="9.5" r="1.5"/>
+  <path fill="#F5F8FA" d="M12 9.5c0 .829-.671 1.5-1.5 1.5h-5C4.671 11 4 10.329 4 9.5S4.671 8 5.5 8h5c.829 0 1.5.671 1.5 1.5z"/>
+</svg>
diff --git a/public/emoji/1f4f8_border.svg b/public/emoji/1f4f8_border.svg
new file mode 100644
index 000000000..6bb518f54
--- /dev/null
+++ b/public/emoji/1f4f8_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="10" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="8" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="21" cy="19" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="32.5" cy="9.5" r="1.5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 9l3-6-6 2-4-5-2 5-6-1 4 6-5 4h6l-2 6 6-3 6 5-1-8 6-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 14l-3 2 1-3-3-1 3-2-3-3h4l1-3 2 3 3-1-2 3 3 3-3 1 1 4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M0 10s0-4 4-4h28s4 0 4 4v18s0 4-4 4H4s-4 0-4-4V10z"/>
+  <circle fill="#CCD6DD" cx="21" cy="19" r="10"/>
+  <circle fill="#31373D" cx="21" cy="19" r="8"/>
+  <circle fill="#3B88C3" cx="21" cy="19" r="5"/>
+  <circle fill="#FFF" cx="32.5" cy="9.5" r="1.5"/>
+  <path fill="#FFAC33" d="M16 9l3-6-6 2-4-5-2 5-6-1 4 6-5 4h6l-2 6 6-3 6 5-1-8 6-1z"/>
+  <path fill="#FFF" d="M10 14l-3 2 1-3-3-1 3-2-3-3h4l1-3 2 3 3-1-2 3 3 3-3 1 1 4z"/>
+</svg>
diff --git a/public/emoji/1f4f9_border.svg b/public/emoji/1f4f9_border.svg
new file mode 100644
index 000000000..8adae2f15
--- /dev/null
+++ b/public/emoji/1f4f9_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 18H16c-3.668 0-5-2.99-5-5v-2H7c-3 0-3 3-3 3s-2-1-3-1-1 1-1 1v10s0 1 1 1 3-1 3-1v7c0 4 4 4 4 4h18c4 0 4-4 4-4V17.894c-.347.069-.685.106-1 .106z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M35 6c-.559 0-2.05.934-3.26 1.76C31.413 6.934 30.674 6 29 6H18s-5 0-5 5v2s0 3 3 3h13s2.075-.006 2.771-1.739C32.976 15.082 34.446 16 35 16c1 0 1-1 1-1V7s0-1-1-1zM9 35v-9s0-3 2.75-3H22s3 0 3 3v9h-2v-9s0-1-1-1H12s-1 0-1 1v9H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M29 18H16c-3.668 0-5-2.99-5-5v-2H7c-3 0-3 3-3 3s-2-1-3-1-1 1-1 1v10s0 1 1 1 3-1 3-1v7c0 4 4 4 4 4h18c4 0 4-4 4-4V17.894c-.347.069-.685.106-1 .106z"/>
+  <path fill="#66757F" d="M35 6c-.559 0-2.05.934-3.26 1.76C31.413 6.934 30.674 6 29 6H18s-5 0-5 5v2s0 3 3 3h13s2.075-.006 2.771-1.739C32.976 15.082 34.446 16 35 16c1 0 1-1 1-1V7s0-1-1-1zM9 35v-9s0-3 2.75-3H22s3 0 3 3v9h-2v-9s0-1-1-1H12s-1 0-1 1v9H9z"/>
+</svg>
diff --git a/public/emoji/1f4fc_border.svg b/public/emoji/1f4fc_border.svg
new file mode 100644
index 000000000..8b6081428
--- /dev/null
+++ b/public/emoji/1f4fc_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 25s0 4-4 4H4s-4 0-4-4V10c0-4 4-4 4-4h28s4 0 4 4v15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 12h-6s-1 0-1 1v8s0 1 1 1h6c1 0 2-2 2-5s-1-5-2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29.894 12H26s-1 0-1 1v1c1.656 0 3 1.343 3 3s-1.344 3-3 3v1s0 1 1 1h3.895C31.193 20.73 32 18.96 32 17c0-1.959-.808-3.729-2.106-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 17c0-1.657-1.344-3-3-3v6c1.656 0 3-1.343 3-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 12h6s1 0 1 1v8s0 1-1 1H4c-1 0-2-2-2-5s1-5 2-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 20c-1.657 0-3-1.343-3-3s1.343-3 3-3v-1c0-1-1-1-1-1H6.106C4.808 13.271 4 15.04 4 17s.808 3.729 2.106 5H10c1 0 1-1 1-1v-1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 17c0 1.657 1.343 3 3 3v-6c-1.657 0-3 1.343-3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13 14s0-1 1-1h8s1 0 1 1v6s0 1-1 1h-8s-1 0-1-1v-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 26c0 .553-.447 1-1 1H3c-.552 0-1-.447-1-1 0-.553.448-1 1-1h30c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M36 25s0 4-4 4H4s-4 0-4-4V10c0-4 4-4 4-4h28s4 0 4 4v15z"/>
+  <path fill="#CCD6DD" d="M32 12h-6s-1 0-1 1v8s0 1 1 1h6c1 0 2-2 2-5s-1-5-2-5z"/>
+  <path d="M29.894 12H26s-1 0-1 1v1c1.656 0 3 1.343 3 3s-1.344 3-3 3v1s0 1 1 1h3.895C31.193 20.73 32 18.96 32 17c0-1.959-.808-3.729-2.106-5z"/>
+  <path fill="#66757F" d="M28 17c0-1.657-1.344-3-3-3v6c1.656 0 3-1.343 3-3z"/>
+  <path fill="#CCD6DD" d="M4 12h6s1 0 1 1v8s0 1-1 1H4c-1 0-2-2-2-5s1-5 2-5z"/>
+  <path d="M11 20c-1.657 0-3-1.343-3-3s1.343-3 3-3v-1c0-1-1-1-1-1H6.106C4.808 13.271 4 15.04 4 17s.808 3.729 2.106 5H10c1 0 1-1 1-1v-1z"/>
+  <path fill="#66757F" d="M8 17c0 1.657 1.343 3 3 3v-6c-1.657 0-3 1.343-3 3z"/>
+  <path fill="#88C9F9" d="M13 14s0-1 1-1h8s1 0 1 1v6s0 1-1 1h-8s-1 0-1-1v-6z"/>
+  <path d="M34 26c0 .553-.447 1-1 1H3c-.552 0-1-.447-1-1 0-.553.448-1 1-1h30c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f4fd_border.svg b/public/emoji/1f4fd_border.svg
new file mode 100644
index 000000000..3b2050bae
--- /dev/null
+++ b/public/emoji/1f4fd_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M34.074 18l-4.832 3H28v-4c0-.088-.02-.169-.026-.256C31.436 15.864 34 12.735 34 9c0-4.418-3.582-8-8-8s-8.001 3.582-8.001 8c0 1.463.412 2.822 1.099 4H14.92c.047-.328.08-.66.08-1 0-3.866-3.134-7-7-7-3.865 0-7 3.134-7 7 0 2.79 1.638 5.193 4 6.317V29c0 2.209 1.791 4 4 4h15c2.209 0 4-1.791 4-4v-3h1.242l4.832 3H35V18h-.926zM28.727 3.977c1.762.959 2.961 2.819 2.984 4.961L28.18 8.35c-.112-.376-.31-.715-.583-.982l1.13-3.391zm-.9 6.342l3.552.592c-.66 1.857-2.254 3.26-4.214 3.669-.37-.483-.843-.875-1.392-1.148l.625-2.19c.556-.113 1.076-.452 1.429-.923zM26 3.285c.282 0 .557.027.828.067l-1.131 3.392c-.404.054-.772.21-1.081.446L21.42 5.592c1.042-1.397 2.703-2.307 4.58-2.307zM20.285 9c0-.563.085-1.106.236-1.62l3.194 1.597-.002.023c0 .657.313 1.245.771 1.662L23.816 13h-1.871c-1.02-1.03-1.66-2.436-1.66-4zm-9.088-.385c.901.851 1.47 2.048 1.47 3.385 0 .344-.043.677-.113 1H10.1c.145-.304.233-.641.233-1 0-.478-.145-.922-.392-1.292l1.256-2.093zM8 7.333c.519 0 1.01.105 1.476.261L8.22 9.688c-.073-.007-.145-.022-.22-.022-.478 0-.922.145-1.292.392L4.615 8.803c.851-.901 2.048-1.47 3.385-1.47zM3.333 12c0-.519.105-1.01.261-1.477l2.095 1.257c-.007.073-.022.144-.022.22 0 .75.36 1.41.91 1.837-.624.479-1.097 1.134-1.353 1.895-1.141-.851-1.891-2.199-1.891-3.732z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="24" cy="19" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="9" cy="19" r="2" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24 27c0-1.104-.896-2-2-2H11c-1.104 0-2 .896-2 2v6c0 1.104.896 2 2 2h11c1.104 0 2-.896 2-2v-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.074 18l-4.832 3H28v-4c0-.088-.02-.169-.026-.256C31.436 15.864 34 12.735 34 9c0-4.418-3.582-8-8-8s-8.001 3.582-8.001 8c0 1.463.412 2.822 1.099 4H14.92c.047-.328.08-.66.08-1 0-3.866-3.134-7-7-7-3.865 0-7 3.134-7 7 0 2.79 1.638 5.193 4 6.317V29c0 2.209 1.791 4 4 4h15c2.209 0 4-1.791 4-4v-3h1.242l4.832 3H35V18h-.926zM28.727 3.977c1.762.959 2.961 2.819 2.984 4.961L28.18 8.35c-.112-.376-.31-.715-.583-.982l1.13-3.391zm-.9 6.342l3.552.592c-.66 1.857-2.254 3.26-4.214 3.669-.37-.483-.843-.875-1.392-1.148l.625-2.19c.556-.113 1.076-.452 1.429-.923zM26 3.285c.282 0 .557.027.828.067l-1.131 3.392c-.404.054-.772.21-1.081.446L21.42 5.592c1.042-1.397 2.703-2.307 4.58-2.307zM20.285 9c0-.563.085-1.106.236-1.62l3.194 1.597-.002.023c0 .657.313 1.245.771 1.662L23.816 13h-1.871c-1.02-1.03-1.66-2.436-1.66-4zm-9.088-.385c.901.851 1.47 2.048 1.47 3.385 0 .344-.043.677-.113 1H10.1c.145-.304.233-.641.233-1 0-.478-.145-.922-.392-1.292l1.256-2.093zM8 7.333c.519 0 1.01.105 1.476.261L8.22 9.688c-.073-.007-.145-.022-.22-.022-.478 0-.922.145-1.292.392L4.615 8.803c.851-.901 2.048-1.47 3.385-1.47zM3.333 12c0-.519.105-1.01.261-1.477l2.095 1.257c-.007.073-.022.144-.022.22 0 .75.36 1.41.91 1.837-.624.479-1.097 1.134-1.353 1.895-1.141-.851-1.891-2.199-1.891-3.732z"/>
+  <circle fill="#8899A6" cx="24" cy="19" r="2"/>
+  <circle fill="#8899A6" cx="9" cy="19" r="2"/>
+  <path fill="#8899A6" d="M24 27c0-1.104-.896-2-2-2H11c-1.104 0-2 .896-2 2v6c0 1.104.896 2 2 2h11c1.104 0 2-.896 2-2v-6z"/>
+</svg>
diff --git a/public/emoji/1f507_border.svg b/public/emoji/1f507_border.svg
new file mode 100644
index 000000000..cd02481bd
--- /dev/null
+++ b/public/emoji/1f507_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.003 33.003L3.997 5.997c-.551-.551-.551-1.443 0-1.994l.006-.006c.551-.551 1.443-.551 1.994 0l27.006 27.006c.551.551.551 1.443 0 1.994l-.006.006c-.551.551-1.443.551-1.994 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z"/>
+  <path fill="#CCD6DD" d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#DD2E44" d="M31.003 33.003L3.997 5.997c-.551-.551-.551-1.443 0-1.994l.006-.006c.551-.551 1.443-.551 1.994 0l27.006 27.006c.551.551.551 1.443 0 1.994l-.006.006c-.551.551-1.443.551-1.994 0z"/>
+</svg>
diff --git a/public/emoji/1f508_border.svg b/public/emoji/1f508_border.svg
new file mode 100644
index 000000000..c920d89dc
--- /dev/null
+++ b/public/emoji/1f508_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M9 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H9z"/>
+  <path fill="#CCD6DD" d="M15 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+</svg>
diff --git a/public/emoji/1f509_border.svg b/public/emoji/1f509_border.svg
new file mode 100644
index 000000000..6881edb30
--- /dev/null
+++ b/public/emoji/1f509_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M7 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C29.934 22.658 31 20.403 31 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C31.639 12.116 33 14.957 33 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M7 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H7z"/>
+  <path fill="#CCD6DD" d="M13 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#8899A6" d="M28.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C29.934 22.658 31 20.403 31 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C31.639 12.116 33 14.957 33 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z"/>
+</svg>
diff --git a/public/emoji/1f50a_border.svg b/public/emoji/1f50a_border.svg
new file mode 100644
index 000000000..549811b69
--- /dev/null
+++ b/public/emoji/1f50a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M2 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M29 32.019c-.267 0-.533-.113-.72-.332-.339-.398-.292-.995.105-1.334 3.603-3.071 5.668-7.551 5.668-12.29s-2.066-9.219-5.669-12.29c-.397-.339-.444-.937-.105-1.334.339-.399.935-.444 1.334-.106 4.024 3.431 6.333 8.436 6.333 13.73 0 5.294-2.309 10.299-6.332 13.729-.179.152-.396.227-.614.227z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M26.27 28.959c-.269 0-.533-.115-.717-.338-.327-.396-.271-.98.125-1.307 2.792-2.304 4.394-5.699 4.394-9.315 0-3.573-1.571-6.943-4.311-9.245-.392-.33-.443-.916-.113-1.308.33-.394.915-.443 1.309-.114 3.16 2.656 4.973 6.543 4.973 10.667 0 4.172-1.848 8.089-5.069 10.746-.174.145-.383.214-.591.214z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C24.934 22.658 26 20.403 26 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C26.639 12.116 28 14.957 28 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#8899A6" d="M2 10s-2 0-2 2v12c0 2 2 2 2 2h6l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8H2z"/>
+  <path fill="#CCD6DD" d="M8 26l8 8s1 1 2 1h1s1 0 1-1V2s0-1-1-1h-1c-1 0-2 1-2 1l-8 8v16z"/>
+  <path fill="#8899A6" d="M29 32.019c-.267 0-.533-.113-.72-.332-.339-.398-.292-.995.105-1.334 3.603-3.071 5.668-7.551 5.668-12.29s-2.066-9.219-5.669-12.29c-.397-.339-.444-.937-.105-1.334.339-.399.935-.444 1.334-.106 4.024 3.431 6.333 8.436 6.333 13.73 0 5.294-2.309 10.299-6.332 13.729-.179.152-.396.227-.614.227z"/>
+  <path fill="#8899A6" d="M26.27 28.959c-.269 0-.533-.115-.717-.338-.327-.396-.271-.98.125-1.307 2.792-2.304 4.394-5.699 4.394-9.315 0-3.573-1.571-6.943-4.311-9.245-.392-.33-.443-.916-.113-1.308.33-.394.915-.443 1.309-.114 3.16 2.656 4.973 6.543 4.973 10.667 0 4.172-1.848 8.089-5.069 10.746-.174.145-.383.214-.591.214z"/>
+  <path fill="#8899A6" d="M23.709 25.959c-.289 0-.576-.124-.774-.365-.351-.427-.289-1.057.138-1.407C24.934 22.658 26 20.403 26 18c0-2.435-1.089-4.708-2.988-6.236-.431-.346-.498-.976-.152-1.406.348-.429.976-.499 1.406-.152C26.639 12.116 28 14.957 28 18c0 3.004-1.333 5.822-3.657 7.731-.186.154-.411.228-.634.228z"/>
+</svg>
diff --git a/public/emoji/1f50c_border.svg b/public/emoji/1f50c_border.svg
new file mode 100644
index 000000000..6e37ecd63
--- /dev/null
+++ b/public/emoji/1f50c_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M11.858 16.264c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L1.959 9.192c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.485 8.486zm7.072-7.071c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L9.029 2.121c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.487 8.486z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 36c0-4.966-2.56-8.581-4.562-10.65.898-1.532.704-3.529-.61-4.844l-1.099-1.099c.352-1.332.021-2.806-1.022-3.851l-4.949-4.95c.78-.781.78-2.047 0-2.828-.781-.781-2.049-.781-2.829-.001l-2.826 2.826-.003.002-4.242 4.243-2.828 2.828c-.781.781-.781 2.047 0 2.828.781.781 2.047.781 2.828 0l4.95 4.95c1.044 1.044 2.519 1.373 3.85 1.021l1.101 1.101c1.318 1.318 3.323 1.51 4.857.602C28.099 29.726 30 32.404 30 36h4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#9AAAB4" d="M11.858 16.264c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L1.959 9.192c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.485 8.486zm7.072-7.071c.389.389.389 1.025 0 1.414s-1.025.389-1.414 0L9.029 2.121c-.389-.389-.389-1.025 0-1.414s1.025-.389 1.414 0l8.487 8.486z"/>
+  <path fill="#31373D" d="M34 36c0-4.966-2.56-8.581-4.562-10.65.898-1.532.704-3.529-.61-4.844l-1.099-1.099c.352-1.332.021-2.806-1.022-3.851l-4.949-4.95c.78-.781.78-2.047 0-2.828-.781-.781-2.049-.781-2.829-.001l-2.826 2.826-.003.002-4.242 4.243-2.828 2.828c-.781.781-.781 2.047 0 2.828.781.781 2.047.781 2.828 0l4.95 4.95c1.044 1.044 2.519 1.373 3.85 1.021l1.101 1.101c1.318 1.318 3.323 1.51 4.857.602C28.099 29.726 30 32.404 30 36h4z"/>
+</svg>
diff --git a/public/emoji/1f519_border.svg b/public/emoji/1f519_border.svg
new file mode 100644
index 000000000..801bafb8b
--- /dev/null
+++ b/public/emoji/1f519_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 3H12.475V1.128c0-1.046-.74-1.435-1.645-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.024 26.184c0-.727.5-1.137 1.197-1.137H4.13c1.576 0 2.849 1.061 2.849 2.667 0 1.061-.439 1.772-1.409 2.227v.03c1.288.183 2.303 1.258 2.303 2.576 0 2.137-1.424 3.288-3.516 3.288h-3.12c-.697 0-1.212-.439-1.212-1.151v-8.5zm2.273 3.135h1.182c.742 0 1.227-.439 1.227-1.196 0-.713-.561-1.076-1.227-1.076H2.297v2.272zm0 4.516h1.788c.818 0 1.424-.47 1.424-1.318 0-.712-.545-1.197-1.606-1.197H2.297v2.515zm9.217-7.713c.258-.696.85-1.257 1.621-1.257.805 0 1.365.53 1.621 1.257l2.971 8.243c.092.242.121.454.121.561 0 .591-.484 1-1.045 1-.637 0-.955-.333-1.107-.788l-.453-1.424H11.03l-.455 1.409c-.15.47-.469.803-1.09.803-.607 0-1.122-.454-1.122-1.061 0-.242.076-.424.106-.5l3.045-8.243zm.168 5.501h2.879l-1.41-4.395h-.029l-1.44 4.395zm11.378-6.758c1.106 0 3.258.363 3.258 1.696 0 .546-.379 1.016-.94 1.016-.621 0-1.046-.53-2.318-.53-1.879 0-2.849 1.591-2.849 3.439 0 1.803.985 3.349 2.849 3.349 1.272 0 1.788-.637 2.409-.637.682 0 1 .682 1 1.03 0 1.455-2.288 1.788-3.409 1.788-3.076 0-5.212-2.439-5.212-5.576 0-3.151 2.121-5.575 5.212-5.575zm4.471 1.212c0-.621.455-1.121 1.137-1.121.651 0 1.137.424 1.137 1.121v3.273l3.727-3.97c.167-.182.455-.424.879-.424.576 0 1.121.439 1.121 1.091 0 .393-.242.712-.742 1.212l-2.863 2.818 3.5 3.651c.363.364.637.697.637 1.152 0 .712-.562 1.045-1.183 1.045-.44 0-.727-.258-1.151-.712l-3.924-4.243v3.864c0 .591-.455 1.091-1.137 1.091-.651 0-1.137-.424-1.137-1.091v-8.757z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 3H12.475V1.128c0-1.046-.74-1.435-1.645-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.024 26.184c0-.727.5-1.137 1.197-1.137H4.13c1.576 0 2.849 1.061 2.849 2.667 0 1.061-.439 1.772-1.409 2.227v.03c1.288.183 2.303 1.258 2.303 2.576 0 2.137-1.424 3.288-3.516 3.288h-3.12c-.697 0-1.212-.439-1.212-1.151v-8.5zm2.273 3.135h1.182c.742 0 1.227-.439 1.227-1.196 0-.713-.561-1.076-1.227-1.076H2.297v2.272zm0 4.516h1.788c.818 0 1.424-.47 1.424-1.318 0-.712-.545-1.197-1.606-1.197H2.297v2.515zm9.217-7.713c.258-.696.85-1.257 1.621-1.257.805 0 1.365.53 1.621 1.257l2.971 8.243c.092.242.121.454.121.561 0 .591-.484 1-1.045 1-.637 0-.955-.333-1.107-.788l-.453-1.424H11.03l-.455 1.409c-.15.47-.469.803-1.09.803-.607 0-1.122-.454-1.122-1.061 0-.242.076-.424.106-.5l3.045-8.243zm.168 5.501h2.879l-1.41-4.395h-.029l-1.44 4.395zm11.378-6.758c1.106 0 3.258.363 3.258 1.696 0 .546-.379 1.016-.94 1.016-.621 0-1.046-.53-2.318-.53-1.879 0-2.849 1.591-2.849 3.439 0 1.803.985 3.349 2.849 3.349 1.272 0 1.788-.637 2.409-.637.682 0 1 .682 1 1.03 0 1.455-2.288 1.788-3.409 1.788-3.076 0-5.212-2.439-5.212-5.576 0-3.151 2.121-5.575 5.212-5.575zm4.471 1.212c0-.621.455-1.121 1.137-1.121.651 0 1.137.424 1.137 1.121v3.273l3.727-3.97c.167-.182.455-.424.879-.424.576 0 1.121.439 1.121 1.091 0 .393-.242.712-.742 1.212l-2.863 2.818 3.5 3.651c.363.364.637.697.637 1.152 0 .712-.562 1.045-1.183 1.045-.44 0-.727-.258-1.151-.712l-3.924-4.243v3.864c0 .591-.455 1.091-1.137 1.091-.651 0-1.137-.424-1.137-1.091v-8.757z"/>
+</svg>
diff --git a/public/emoji/1f51a_border.svg b/public/emoji/1f51a_border.svg
new file mode 100644
index 000000000..057cf9820
--- /dev/null
+++ b/public/emoji/1f51a_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 3H12.475V1.128c0-1.046-.74-1.434-1.644-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.088 22.915c0-1.03.515-1.791 1.606-1.791h5.108c.989 0 1.462.7 1.462 1.421 0 .7-.495 1.421-1.462 1.421H3.178v3.008h3.378c1.009 0 1.503.699 1.503 1.421 0 .699-.515 1.42-1.503 1.42H3.178v3.131h3.811c.988 0 1.462.701 1.462 1.421 0 .701-.495 1.422-1.462 1.422H1.675c-.906 0-1.586-.617-1.586-1.544v-11.33zm9.419-.309c0-1.029.659-1.606 1.545-1.606.392 0 1.03.31 1.298.68l6.529 8.712h.041v-7.785c0-1.029.659-1.606 1.545-1.606.886 0 1.545.577 1.545 1.606v11.699c0 1.03-.659 1.606-1.545 1.606-.391 0-1.009-.309-1.297-.681l-6.53-8.608h-.041v7.683c0 1.03-.659 1.606-1.544 1.606s-1.545-.576-1.545-1.606v-11.7zm14.239.104c0-.948.659-1.586 1.586-1.586h3.419c4.612 0 7.249 2.965 7.249 7.537 0 4.326-2.801 7.127-7.043 7.127h-3.584c-.68 0-1.627-.37-1.627-1.544V22.71zm3.09 10.235h2.08c2.656 0 3.872-1.957 3.872-4.429 0-2.637-1.235-4.551-4.078-4.551h-1.874v8.98z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 3H12.475V1.128c0-1.046-.74-1.434-1.644-.865L.69 6.652c-.905.57-.922 1.527-.038 2.127l10.215 6.931c.884.602 1.607.235 1.607-.811V13H34c1.104 0 2-.896 2-2V5c0-1.104-.896-2-2-2zM.088 22.915c0-1.03.515-1.791 1.606-1.791h5.108c.989 0 1.462.7 1.462 1.421 0 .7-.495 1.421-1.462 1.421H3.178v3.008h3.378c1.009 0 1.503.699 1.503 1.421 0 .699-.515 1.42-1.503 1.42H3.178v3.131h3.811c.988 0 1.462.701 1.462 1.421 0 .701-.495 1.422-1.462 1.422H1.675c-.906 0-1.586-.617-1.586-1.544v-11.33zm9.419-.309c0-1.029.659-1.606 1.545-1.606.392 0 1.03.31 1.298.68l6.529 8.712h.041v-7.785c0-1.029.659-1.606 1.545-1.606.886 0 1.545.577 1.545 1.606v11.699c0 1.03-.659 1.606-1.545 1.606-.391 0-1.009-.309-1.297-.681l-6.53-8.608h-.041v7.683c0 1.03-.659 1.606-1.544 1.606s-1.545-.576-1.545-1.606v-11.7zm14.239.104c0-.948.659-1.586 1.586-1.586h3.419c4.612 0 7.249 2.965 7.249 7.537 0 4.326-2.801 7.127-7.043 7.127h-3.584c-.68 0-1.627-.37-1.627-1.544V22.71zm3.09 10.235h2.08c2.656 0 3.872-1.957 3.872-4.429 0-2.637-1.235-4.551-4.078-4.551h-1.874v8.98z"/>
+</svg>
diff --git a/public/emoji/1f51b_border.svg b/public/emoji/1f51b_border.svg
new file mode 100644
index 000000000..ccc8ed099
--- /dev/null
+++ b/public/emoji/1f51b_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3h-11.05V1.128c0-1.046-.74-1.434-1.644-.865L.689 6.652c-.904.57-.922 1.527-.037 2.127l10.215 6.932c.885.602 1.607.234 1.607-.812V13h11.051v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM.204 27.986c0-4.529 3.048-8.014 7.49-8.014 4.377 0 7.491 3.594 7.491 8.014 0 4.506-3.027 8.014-7.491 8.014-4.42 0-7.49-3.508-7.49-8.014zm11.584 0c0-2.635-1.372-5.01-4.094-5.01-2.721 0-4.094 2.375-4.094 5.01 0 2.656 1.33 5.008 4.094 5.008 2.765 0 4.094-2.351 4.094-5.008zm4.625-6.184c0-1.089.696-1.699 1.632-1.699.415 0 1.089.327 1.373.72l6.902 9.211h.045v-8.231c0-1.089.694-1.699 1.633-1.699.937 0 1.633.61 1.633 1.699V34.17c0 1.088-.696 1.697-1.633 1.697-.415 0-1.067-.326-1.372-.717l-6.903-9.102h-.044v8.121c0 1.088-.697 1.697-1.633 1.697s-1.632-.609-1.632-1.697V21.802zm16.013 12.499c0-.936.762-1.699 1.698-1.699.936 0 1.698.764 1.698 1.699 0 .936-.763 1.699-1.698 1.699-.936 0-1.698-.764-1.698-1.699zm.131-12.848c0-.914.673-1.48 1.567-1.48.87 0 1.567.588 1.567 1.48v8.384c0 .894-.697 1.479-1.567 1.479-.895 0-1.567-.564-1.567-1.479v-8.384z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3h-11.05V1.128c0-1.046-.74-1.434-1.644-.865L.689 6.652c-.904.57-.922 1.527-.037 2.127l10.215 6.932c.885.602 1.607.234 1.607-.812V13h11.051v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM.204 27.986c0-4.529 3.048-8.014 7.49-8.014 4.377 0 7.491 3.594 7.491 8.014 0 4.506-3.027 8.014-7.491 8.014-4.42 0-7.49-3.508-7.49-8.014zm11.584 0c0-2.635-1.372-5.01-4.094-5.01-2.721 0-4.094 2.375-4.094 5.01 0 2.656 1.33 5.008 4.094 5.008 2.765 0 4.094-2.351 4.094-5.008zm4.625-6.184c0-1.089.696-1.699 1.632-1.699.415 0 1.089.327 1.373.72l6.902 9.211h.045v-8.231c0-1.089.694-1.699 1.633-1.699.937 0 1.633.61 1.633 1.699V34.17c0 1.088-.696 1.697-1.633 1.697-.415 0-1.067-.326-1.372-.717l-6.903-9.102h-.044v8.121c0 1.088-.697 1.697-1.633 1.697s-1.632-.609-1.632-1.697V21.802zm16.013 12.499c0-.936.762-1.699 1.698-1.699.936 0 1.698.764 1.698 1.699 0 .936-.763 1.699-1.698 1.699-.936 0-1.698-.764-1.698-1.699zm.131-12.848c0-.914.673-1.48 1.567-1.48.87 0 1.567.588 1.567 1.48v8.384c0 .894-.697 1.479-1.567 1.479-.895 0-1.567-.564-1.567-1.479v-8.384z"/>
+</svg>
diff --git a/public/emoji/1f51c_border.svg b/public/emoji/1f51c_border.svg
new file mode 100644
index 000000000..3552cfa65
--- /dev/null
+++ b/public/emoji/1f51c_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3H2C.896 3 0 3.895 0 5v6c0 1.104.896 2 2 2h21.525v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM6.303 27.263c0 .537-.357 1.018-.921 1.018-.563 0-1.002-.412-1.826-.412-.591 0-1.126.316-1.126.893 0 1.414 4.587.509 4.587 4.052C7.017 34.776 5.396 36 3.501 36c-1.058 0-3.337-.248-3.337-1.539 0-.535.356-.976.92-.976.645 0 1.415.536 2.308.536.907 0 1.401-.509 1.401-1.182 0-1.62-4.588-.645-4.588-3.832 0-1.923 1.58-3.118 3.407-3.118.768.001 2.691.289 2.691 1.374zm1.213 3.681c0-2.855 1.922-5.055 4.725-5.055 2.761 0 4.725 2.268 4.725 5.055 0 2.844-1.91 5.056-4.725 5.056-2.788 0-4.725-2.212-4.725-5.056zm7.307 0c0-1.661-.866-3.159-2.583-3.159s-2.582 1.498-2.582 3.159c0 1.676.838 3.159 2.582 3.159 1.745.001 2.583-1.483 2.583-3.159zm2.615 0c0-2.855 1.923-5.055 4.725-5.055 2.76 0 4.725 2.268 4.725 5.055 0 2.844-1.909 5.056-4.725 5.056-2.789 0-4.725-2.212-4.725-5.056zm7.306 0c0-1.661-.864-3.159-2.581-3.159-1.718 0-2.582 1.498-2.582 3.159 0 1.676.838 3.159 2.582 3.159 1.743.001 2.581-1.483 2.581-3.159zm2.918-3.9c0-.688.44-1.072 1.03-1.072.261 0 .687.206.865.454l4.353 5.81h.028v-5.191c0-.688.439-1.072 1.031-1.072.589 0 1.029.385 1.029 1.072v7.802c0 .688-.44 1.072-1.029 1.072-.263 0-.675-.206-.866-.454l-4.354-5.741h-.027v5.123c0 .688-.44 1.072-1.03 1.072s-1.03-.385-1.03-1.072v-7.803z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.311 6.652L25.17.263c-.904-.569-1.645-.181-1.645.865V3H2C.896 3 0 3.895 0 5v6c0 1.104.896 2 2 2h21.525v1.899c0 1.046.723 1.413 1.607.811l10.215-6.931c.885-.6.868-1.557-.036-2.127zM6.303 27.263c0 .537-.357 1.018-.921 1.018-.563 0-1.002-.412-1.826-.412-.591 0-1.126.316-1.126.893 0 1.414 4.587.509 4.587 4.052C7.017 34.776 5.396 36 3.501 36c-1.058 0-3.337-.248-3.337-1.539 0-.535.356-.976.92-.976.645 0 1.415.536 2.308.536.907 0 1.401-.509 1.401-1.182 0-1.62-4.588-.645-4.588-3.832 0-1.923 1.58-3.118 3.407-3.118.768.001 2.691.289 2.691 1.374zm1.213 3.681c0-2.855 1.922-5.055 4.725-5.055 2.761 0 4.725 2.268 4.725 5.055 0 2.844-1.91 5.056-4.725 5.056-2.788 0-4.725-2.212-4.725-5.056zm7.307 0c0-1.661-.866-3.159-2.583-3.159s-2.582 1.498-2.582 3.159c0 1.676.838 3.159 2.582 3.159 1.745.001 2.583-1.483 2.583-3.159zm2.615 0c0-2.855 1.923-5.055 4.725-5.055 2.76 0 4.725 2.268 4.725 5.055 0 2.844-1.909 5.056-4.725 5.056-2.789 0-4.725-2.212-4.725-5.056zm7.306 0c0-1.661-.864-3.159-2.581-3.159-1.718 0-2.582 1.498-2.582 3.159 0 1.676.838 3.159 2.582 3.159 1.743.001 2.581-1.483 2.581-3.159zm2.918-3.9c0-.688.44-1.072 1.03-1.072.261 0 .687.206.865.454l4.353 5.81h.028v-5.191c0-.688.439-1.072 1.031-1.072.589 0 1.029.385 1.029 1.072v7.802c0 .688-.44 1.072-1.029 1.072-.263 0-.675-.206-.866-.454l-4.354-5.741h-.027v5.123c0 .688-.44 1.072-1.03 1.072s-1.03-.385-1.03-1.072v-7.803z"/>
+</svg>
diff --git a/public/emoji/1f51d_border.svg b/public/emoji/1f51d_border.svg
new file mode 100644
index 000000000..a81b553f8
--- /dev/null
+++ b/public/emoji/1f51d_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M25.711 10.867L18.779.652c-.602-.885-1.558-.867-2.127.037l-6.39 10.141c-.569.904-.181 1.644.865 1.644H13V16c0 1.104.896 2 2 2h6c1.105 0 2-.896 2-2v-3.525h1.898c1.047 0 1.414-.723.813-1.608zM3.651 23.575H1.438c-.975 0-1.381-.712-1.381-1.401 0-.71.508-1.399 1.381-1.399h7.469c.874 0 1.381.689 1.381 1.399 0 .69-.406 1.401-1.381 1.401H6.696v10.189c0 1.016-.649 1.584-1.522 1.584s-1.522-.568-1.522-1.584V23.575zM10.396 28c0-4.222 2.841-7.471 6.982-7.471 4.079 0 6.983 3.351 6.983 7.471 0 4.201-2.821 7.471-6.983 7.471-4.121 0-6.982-3.27-6.982-7.471zm10.798 0c0-2.456-1.279-4.67-3.816-4.67s-3.816 2.214-3.816 4.67c0 2.476 1.239 4.668 3.816 4.668 2.578 0 3.816-2.192 3.816-4.668zm4.433-5.644c0-.954.569-1.582 1.585-1.582h3.591c2.985 0 5.197 1.947 5.197 4.851 0 2.963-2.293 4.811-5.074 4.811h-2.253v3.329c0 1.016-.649 1.584-1.521 1.584-.874 0-1.524-.568-1.524-1.584V22.356zm3.046 5.4h2.071c1.277 0 2.089-.934 2.089-2.151 0-1.219-.812-2.152-2.089-2.152h-2.071v4.303z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25.711 10.867L18.779.652c-.602-.885-1.558-.867-2.127.037l-6.39 10.141c-.569.904-.181 1.644.865 1.644H13V16c0 1.104.896 2 2 2h6c1.105 0 2-.896 2-2v-3.525h1.898c1.047 0 1.414-.723.813-1.608zM3.651 23.575H1.438c-.975 0-1.381-.712-1.381-1.401 0-.71.508-1.399 1.381-1.399h7.469c.874 0 1.381.689 1.381 1.399 0 .69-.406 1.401-1.381 1.401H6.696v10.189c0 1.016-.649 1.584-1.522 1.584s-1.522-.568-1.522-1.584V23.575zM10.396 28c0-4.222 2.841-7.471 6.982-7.471 4.079 0 6.983 3.351 6.983 7.471 0 4.201-2.821 7.471-6.983 7.471-4.121 0-6.982-3.27-6.982-7.471zm10.798 0c0-2.456-1.279-4.67-3.816-4.67s-3.816 2.214-3.816 4.67c0 2.476 1.239 4.668 3.816 4.668 2.578 0 3.816-2.192 3.816-4.668zm4.433-5.644c0-.954.569-1.582 1.585-1.582h3.591c2.985 0 5.197 1.947 5.197 4.851 0 2.963-2.293 4.811-5.074 4.811h-2.253v3.329c0 1.016-.649 1.584-1.521 1.584-.874 0-1.524-.568-1.524-1.584V22.356zm3.046 5.4h2.071c1.277 0 2.089-.934 2.089-2.151 0-1.219-.812-2.152-2.089-2.152h-2.071v4.303z"/>
+</svg>
diff --git a/public/emoji/1f52a_border.svg b/public/emoji/1f52a_border.svg
new file mode 100644
index 000000000..0a9bdeab6
--- /dev/null
+++ b/public/emoji/1f52a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.875 34.604L19.796 15.113s-5.637 3.692-7.689 9.676c0 0 4.667 5.292 9.79 8.225 6.368 3.646 11.642 2.855 13.703 2.391.362-.081.511-.513.275-.801z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.071 13.005l-4.035 3.559c.066.028.316.45.174 1.107-.402 1.865-2.346 4.288-2.974 5.098-.194.25-.224.691.026 1.007l.845 1.013c1.821-3.964 6.556-8.694 7.689-9.676l-1.725-2.108z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18.071 13.005s-3.32-4.216-5.763-6.986S8.208 1.658 6.625.64C5.01-.398 3.285.205 1.981 1.354S-.722 5.082.787 6.793c.826.937 2.785.078 3.791 1.219.683.774 1.031 1.365 3.464 3.859 3.759 3.854 5.994 4.692 5.994 4.692s1.251-1.042 1.932-1.648c.682-.604 2.103-1.91 2.103-1.91z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="11.618" cy="10.543" r="1.365" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="5.903" cy="4.653" r="1.365" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M35.875 34.604L19.796 15.113s-5.637 3.692-7.689 9.676c0 0 4.667 5.292 9.79 8.225 6.368 3.646 11.642 2.855 13.703 2.391.362-.081.511-.513.275-.801z"/>
+  <path fill="#AAB8C2" d="M18.071 13.005l-4.035 3.559c.066.028.316.45.174 1.107-.402 1.865-2.346 4.288-2.974 5.098-.194.25-.224.691.026 1.007l.845 1.013c1.821-3.964 6.556-8.694 7.689-9.676l-1.725-2.108z"/>
+  <path fill="#31373D" d="M18.071 13.005s-3.32-4.216-5.763-6.986S8.208 1.658 6.625.64C5.01-.398 3.285.205 1.981 1.354S-.722 5.082.787 6.793c.826.937 2.785.078 3.791 1.219.683.774 1.031 1.365 3.464 3.859 3.759 3.854 5.994 4.692 5.994 4.692s1.251-1.042 1.932-1.648c.682-.604 2.103-1.91 2.103-1.91z"/>
+  <circle fill="#F5F8FA" cx="11.618" cy="10.543" r="1.365"/>
+  <circle fill="#F5F8FA" cx="5.903" cy="4.653" r="1.365"/>
+</svg>
diff --git a/public/emoji/1f54a_border.svg b/public/emoji/1f54a_border.svg
new file mode 100644
index 000000000..895872f3e
--- /dev/null
+++ b/public/emoji/1f54a_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M.794 16.112c1 0 5.875 1.344 6.5 2.312L6.013 18.3s-3.906-1.25-4.906-1.25c-1.001 0-.313-.938-.313-.938z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 2c1 1 3 7 3 10s-2 6 2 8 5.001-1 5.001-5S20 7 19 5s-2 0-2 0-1-4-2-4-1 2-1 2-2-2-3-2 0 1 0 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 15c3 0 4 4 6 4s1-3 3-3 10-5 10-11 3-3 3-1c1 0 2 1.586 2 3 0 1 0 2-1 3 1 0 2 2 1 3 1 3-1 6-3 7 0 1-2 3-4 2 0 0-1 3-3 2 0 0 3.052 1.684 4 2 3 1 7 1 7 1s0 1-2 2c0 0 1 1 0 2s-2 1-2 1 1 2-2 1-6-4-6-4-5 1-9-1-6-6-6-8-3-1-4-1 2-2 3-2c0 0 0-2 3-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.95 18.019s5.438 2.625 7.938 6.656c1.9 3.064 2.782 8.656 2.782 8.656s.043.564-.907-2.281c-1-3-2.217-6.288-4.312-8.188-3.344-3.031-4.75-3.5-6.062-4.25-.332-.189.217-.687.561-.593z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16.198 28.54s2.038.103 3.107 2.139c1.068 2.036-.053 4.914-.053 4.914s-2.75-1.268-3.462-2.947c-.712-1.68.408-4.106.408-4.106zm-2.133-4.778s1.274 1.437 3.558 1.705c2.284.269 4.121-1.379 4.121-1.379s-2.144-1.97-3.968-2.033c-1.823-.065-3.711 1.707-3.711 1.707zm-4.047-3.148s-2.015.329-2.85 2.472.425 4.01.425 4.01 2.534-.848 3.055-2.597c.521-1.747-.63-3.885-.63-3.885z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#5C913B" d="M.794 16.112c1 0 5.875 1.344 6.5 2.312L6.013 18.3s-3.906-1.25-4.906-1.25c-1.001 0-.313-.938-.313-.938z"/>
+  <path fill="#99AAB5" d="M11 2c1 1 3 7 3 10s-2 6 2 8 5.001-1 5.001-5S20 7 19 5s-2 0-2 0-1-4-2-4-1 2-1 2-2-2-3-2 0 1 0 1z"/>
+  <path fill="#CCD6DD" d="M10 15c3 0 4 4 6 4s1-3 3-3 10-5 10-11 3-3 3-1c1 0 2 1.586 2 3 0 1 0 2-1 3 1 0 2 2 1 3 1 3-1 6-3 7 0 1-2 3-4 2 0 0-1 3-3 2 0 0 3.052 1.684 4 2 3 1 7 1 7 1s0 1-2 2c0 0 1 1 0 2s-2 1-2 1 1 2-2 1-6-4-6-4-5 1-9-1-6-6-6-8-3-1-4-1 2-2 3-2c0 0 0-2 3-2z"/>
+  <path fill="#5C913B" d="M6.95 18.019s5.438 2.625 7.938 6.656c1.9 3.064 2.782 8.656 2.782 8.656s.043.564-.907-2.281c-1-3-2.217-6.288-4.312-8.188-3.344-3.031-4.75-3.5-6.062-4.25-.332-.189.217-.687.561-.593z"/>
+  <path fill="#5C913B" d="M16.198 28.54s2.038.103 3.107 2.139c1.068 2.036-.053 4.914-.053 4.914s-2.75-1.268-3.462-2.947c-.712-1.68.408-4.106.408-4.106zm-2.133-4.778s1.274 1.437 3.558 1.705c2.284.269 4.121-1.379 4.121-1.379s-2.144-1.97-3.968-2.033c-1.823-.065-3.711 1.707-3.711 1.707zm-4.047-3.148s-2.015.329-2.85 2.472.425 4.01.425 4.01 2.534-.848 3.055-2.597c.521-1.747-.63-3.885-.63-3.885z"/>
+</svg>
diff --git a/public/emoji/1f54b_border.svg b/public/emoji/1f54b_border.svg
new file mode 100644
index 000000000..5f6d6f202
--- /dev/null
+++ b/public/emoji/1f54b_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 0L0 5v29l18 2 18-2V5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 36l18-2V5L18 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.454 14.507v3.407l4.229.612V15.22zm7 1.181v3.239l3.299.478v-3.161zM18 13.756v3.513l1.683.244V14.04zm18 3.036l-.539-.091v3.096l.539.078z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M0 16.792v3.083l.539-.078v-3.096zm16.317-2.752v3.473L18 17.269v-3.513zm-13.07 2.204v3.161l3.299-.478v-3.239zm6.07-1.024v3.306l4.229-.612v-3.407z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.389 15.131v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152-.001-.482-.147-.886-.355-1.103zm6.999 1.069v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152 0-.481-.147-.885-.355-1.103zm6.017 1.03v-.039c0-.393-.134-.712-.299-.712-.165 0-.299.319-.299.712v.039c-.194.203-.331.58-.331 1.03 0 .479.151.886.367 1.076.059.182.152.308.263.308s.203-.126.263-.308c.215-.189.367-.597.367-1.076 0-.45-.136-.827-.331-1.03z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M14.611 15.131v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152.001-.482.147-.886.355-1.103zM7.612 16.2v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152 0-.481.147-.885.355-1.103zm-6.017 1.03v-.039c0-.393.134-.712.299-.712s.299.319.299.712v.039c.194.203.331.58.331 1.03 0 .479-.151.886-.367 1.076-.059.182-.152.308-.263.308s-.204-.127-.264-.308c-.215-.189-.367-.597-.367-1.076.001-.45.137-.827.332-1.03zM0 11.146v3.5l18-3.268V7.614z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 7.614v3.764l18 3.268v-3.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path d="M18 0L0 5v29l18 2 18-2V5z"/>
+  <path fill="#292F33" d="M18 36l18-2V5L18 0z"/>
+  <path fill="#FFD983" d="M22.454 14.507v3.407l4.229.612V15.22zm7 1.181v3.239l3.299.478v-3.161zM18 13.756v3.513l1.683.244V14.04zm18 3.036l-.539-.091v3.096l.539.078z"/>
+  <path fill="#FFAC33" d="M0 16.792v3.083l.539-.078v-3.096zm16.317-2.752v3.473L18 17.269v-3.513zm-13.07 2.204v3.161l3.299-.478v-3.239zm6.07-1.024v3.306l4.229-.612v-3.407z"/>
+  <path fill="#FFD983" d="M21.389 15.131v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152-.001-.482-.147-.886-.355-1.103zm6.999 1.069v-.042c0-.421-.143-.763-.32-.763-.177 0-.32.342-.32.763v.042c-.208.217-.355.621-.355 1.103 0 .513.162.949.393 1.152.064.195.163.33.282.33s.218-.135.282-.33c.231-.203.393-.639.393-1.152 0-.481-.147-.885-.355-1.103zm6.017 1.03v-.039c0-.393-.134-.712-.299-.712-.165 0-.299.319-.299.712v.039c-.194.203-.331.58-.331 1.03 0 .479.151.886.367 1.076.059.182.152.308.263.308s.203-.126.263-.308c.215-.189.367-.597.367-1.076 0-.45-.136-.827-.331-1.03z"/>
+  <path fill="#FFAC33" d="M14.611 15.131v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152.001-.482.147-.886.355-1.103zM7.612 16.2v-.042c0-.421.143-.763.32-.763s.32.342.32.763v.042c.208.217.355.621.355 1.103 0 .513-.162.949-.393 1.152-.064.195-.163.33-.282.33s-.218-.135-.282-.33c-.231-.203-.393-.639-.393-1.152 0-.481.147-.885.355-1.103zm-6.017 1.03v-.039c0-.393.134-.712.299-.712s.299.319.299.712v.039c.194.203.331.58.331 1.03 0 .479-.151.886-.367 1.076-.059.182-.152.308-.263.308s-.204-.127-.264-.308c-.215-.189-.367-.597-.367-1.076.001-.45.137-.827.332-1.03zM0 11.146v3.5l18-3.268V7.614z"/>
+  <path fill="#FFD983" d="M18 7.614v3.764l18 3.268v-3.5z"/>
+</svg>
diff --git a/public/emoji/1f573_border.svg b/public/emoji/1f573_border.svg
new file mode 100644
index 000000000..7a8cf732e
--- /dev/null
+++ b/public/emoji/1f573_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M18 11.001c-9.389 0-17 3.358-17 7.5s7.611 7.5 17 7.5 17-3.358 17-7.5-7.611-7.5-17-7.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M33.871 19.284c.079-.256.129-.516.129-.783 0-1.418-1.16-2.676-3-3.699v2.778c1.083.51 2.05 1.08 2.871 1.704zM5 14.802c-1.84 1.023-3 2.281-3 3.699 0 .267.05.527.129.783C2.95 18.66 3.917 18.09 5 17.58v-2.778z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M18 12.001c-4.766 0-9.87 1.06-13 2.801v2.778c3.398-1.598 7.967-2.579 13-2.579s9.602.981 13 2.579v-2.778c-3.13-1.741-8.234-2.801-13-2.801z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M18 11.001c-9.389 0-17 3.358-17 7.5s7.611 7.5 17 7.5 17-3.358 17-7.5-7.611-7.5-17-7.5z"/>
+  <path fill="#7D8B93" d="M33.871 19.284c.079-.256.129-.516.129-.783 0-1.418-1.16-2.676-3-3.699v2.778c1.083.51 2.05 1.08 2.871 1.704zM5 14.802c-1.84 1.023-3 2.281-3 3.699 0 .267.05.527.129.783C2.95 18.66 3.917 18.09 5 17.58v-2.778z"/>
+  <path fill="#CCD6DD" d="M18 12.001c-4.766 0-9.87 1.06-13 2.801v2.778c3.398-1.598 7.967-2.579 13-2.579s9.602.981 13 2.579v-2.778c-3.13-1.741-8.234-2.801-13-2.801z"/>
+</svg>
diff --git a/public/emoji/1f576_border.svg b/public/emoji/1f576_border.svg
new file mode 100644
index 000000000..4ad1315ef
--- /dev/null
+++ b/public/emoji/1f576_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M1.24 15.018c.24.239 1.438.957 1.677 1.675.24.717.72 5.307 2.158 6.504 1.483 1.232 7.077.773 8.148.24 2.397-1.195 2.691-5.055 3.115-6.745.239-.957 1.677-.957 1.677-.957s1.438 0 1.678.956c.424 1.691.72 5.562 3.115 6.755 1.072.535 6.666.994 8.151-.238 1.436-1.197 1.915-5.799 2.155-6.517.238-.717 1.438-1.435 1.677-1.674.241-.239.241-1.196 0-1.436-.479-.478-6.134-.904-12.223-.239-1.215.133-1.677.478-4.554.478-2.875 0-3.339-.346-4.553-.478-6.085-.664-11.741-.238-12.221.24-.239.239-.239 1.197 0 1.436z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill-rule="evenodd" clip-rule="evenodd" fill="#31373D" d="M1.24 15.018c.24.239 1.438.957 1.677 1.675.24.717.72 5.307 2.158 6.504 1.483 1.232 7.077.773 8.148.24 2.397-1.195 2.691-5.055 3.115-6.745.239-.957 1.677-.957 1.677-.957s1.438 0 1.678.956c.424 1.691.72 5.562 3.115 6.755 1.072.535 6.666.994 8.151-.238 1.436-1.197 1.915-5.799 2.155-6.517.238-.717 1.438-1.435 1.677-1.674.241-.239.241-1.196 0-1.436-.479-.478-6.134-.904-12.223-.239-1.215.133-1.677.478-4.554.478-2.875 0-3.339-.346-4.553-.478-6.085-.664-11.741-.238-12.221.24-.239.239-.239 1.197 0 1.436z"/>
+</svg>
diff --git a/public/emoji/1f577_border.svg b/public/emoji/1f577_border.svg
new file mode 100644
index 000000000..bf3b8c7eb
--- /dev/null
+++ b/public/emoji/1f577_border.svg
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M14.999 17c-.208 0-.419-.065-.599-.2C9.863 13.397 6.959 7.585 7 1.993c.004-.553.412-.975 1.007-.993.553.004.997.455.993 1.007-.037 4.98 2.554 10.159 6.6 13.193.442.331.531.958.2 1.4-.196.262-.497.4-.801.4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 19c-.377 0-9.273-.098-12.919-8.606-.218-.508.018-1.096.525-1.313.508-.218 1.096.018 1.313.525C8.052 16.916 15.677 17 16 17c.552 0 1 .448 1 1 0 .553-.448 1-1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4 29c-.104 0-.211-.017-.316-.052-.524-.174-.807-.74-.632-1.265 1.388-4.164 4.719-9.054 12.71-8.692.102.005.183.009.238.009.552 0 1 .447 1 1s-.448 1-1 1c-.076 0-.187-.005-.328-.011-5.411-.237-9.021 2.222-10.723 7.327-.14.419-.53.684-.949.684z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8 36c-.552 0-1-.447-1-1 0-4.495 3.228-12.703 8.485-15.857.474-.284 1.088-.131 1.372.343s.131 1.088-.343 1.372C11.997 23.568 9 31.165 9 35c0 .553-.448 1-1 1zm13.001-19c-.305 0-.604-.138-.801-.4-.332-.442-.242-1.069.2-1.4 4.046-3.035 6.637-8.213 6.6-13.193-.004-.552.44-1.003.992-1.007H28c.549 0 .996.443 1 .993.042 5.592-2.863 11.404-7.4 14.807-.18.135-.39.2-.599.2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M20 19c-.553 0-1-.447-1-1 0-.552.447-1 1-1 .323 0 7.948-.084 11.081-7.394.218-.507.808-.742 1.312-.525.508.217.743.805.525 1.313C29.272 18.902 20.377 19 20 19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32 29c-.419 0-.809-.265-.948-.684-1.702-5.105-5.293-7.559-10.724-7.327-.141.006-.252.011-.328.011-.553 0-1-.447-1-1s.447-1 1-1c.055 0 .136-.004.238-.009 7.979-.36 11.323 4.528 12.71 8.692.175.524-.108 1.091-.632 1.265-.105.035-.212.052-.316.052z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28 36c-.553 0-1-.447-1-1 0-3.835-2.997-11.432-7.515-14.143-.474-.284-.627-.898-.343-1.372.284-.473.897-.627 1.372-.343C25.771 22.297 29 30.505 29 35c0 .553-.447 1-1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="25.208" rx="6" ry="6.792" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="18" cy="17" rx="4" ry="6" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16 14c-.256 0-.512-.098-.707-.293C14 12.414 14 11.076 14 10c0-.552.448-1 1-1s1 .448 1 1c0 .92 0 1.586.707 2.293.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293zm4 0c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414C20 11.586 20 10.92 20 10c0-.552.447-1 1-1s1 .448 1 1c0 1.076 0 2.414-1.293 3.707-.195.195-.451.293-.707.293z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M14.999 17c-.208 0-.419-.065-.599-.2C9.863 13.397 6.959 7.585 7 1.993c.004-.553.412-.975 1.007-.993.553.004.997.455.993 1.007-.037 4.98 2.554 10.159 6.6 13.193.442.331.531.958.2 1.4-.196.262-.497.4-.801.4z"/>
+  <path fill="#31373D" d="M16 19c-.377 0-9.273-.098-12.919-8.606-.218-.508.018-1.096.525-1.313.508-.218 1.096.018 1.313.525C8.052 16.916 15.677 17 16 17c.552 0 1 .448 1 1 0 .553-.448 1-1 1z"/>
+  <path fill="#31373D" d="M4 29c-.104 0-.211-.017-.316-.052-.524-.174-.807-.74-.632-1.265 1.388-4.164 4.719-9.054 12.71-8.692.102.005.183.009.238.009.552 0 1 .447 1 1s-.448 1-1 1c-.076 0-.187-.005-.328-.011-5.411-.237-9.021 2.222-10.723 7.327-.14.419-.53.684-.949.684z"/>
+  <path fill="#31373D" d="M8 36c-.552 0-1-.447-1-1 0-4.495 3.228-12.703 8.485-15.857.474-.284 1.088-.131 1.372.343s.131 1.088-.343 1.372C11.997 23.568 9 31.165 9 35c0 .553-.448 1-1 1zm13.001-19c-.305 0-.604-.138-.801-.4-.332-.442-.242-1.069.2-1.4 4.046-3.035 6.637-8.213 6.6-13.193-.004-.552.44-1.003.992-1.007H28c.549 0 .996.443 1 .993.042 5.592-2.863 11.404-7.4 14.807-.18.135-.39.2-.599.2z"/>
+  <path fill="#31373D" d="M20 19c-.553 0-1-.447-1-1 0-.552.447-1 1-1 .323 0 7.948-.084 11.081-7.394.218-.507.808-.742 1.312-.525.508.217.743.805.525 1.313C29.272 18.902 20.377 19 20 19z"/>
+  <path fill="#31373D" d="M32 29c-.419 0-.809-.265-.948-.684-1.702-5.105-5.293-7.559-10.724-7.327-.141.006-.252.011-.328.011-.553 0-1-.447-1-1s.447-1 1-1c.055 0 .136-.004.238-.009 7.979-.36 11.323 4.528 12.71 8.692.175.524-.108 1.091-.632 1.265-.105.035-.212.052-.316.052z"/>
+  <path fill="#31373D" d="M28 36c-.553 0-1-.447-1-1 0-3.835-2.997-11.432-7.515-14.143-.474-.284-.627-.898-.343-1.372.284-.473.897-.627 1.372-.343C25.771 22.297 29 30.505 29 35c0 .553-.447 1-1 1z"/>
+  <ellipse fill="#31373D" cx="18" cy="25.208" rx="6" ry="6.792"/>
+  <ellipse fill="#31373D" cx="18" cy="17" rx="4" ry="6"/>
+  <path fill="#31373D" d="M16 14c-.256 0-.512-.098-.707-.293C14 12.414 14 11.076 14 10c0-.552.448-1 1-1s1 .448 1 1c0 .92 0 1.586.707 2.293.391.391.391 1.023 0 1.414-.195.195-.451.293-.707.293zm4 0c-.256 0-.512-.098-.707-.293-.391-.391-.391-1.023 0-1.414C20 11.586 20 10.92 20 10c0-.552.447-1 1-1s1 .448 1 1c0 1.076 0 2.414-1.293 3.707-.195.195-.451.293-.707.293z"/>
+</svg>
diff --git a/public/emoji/1f579_border.svg b/public/emoji/1f579_border.svg
new file mode 100644
index 000000000..f71237315
--- /dev/null
+++ b/public/emoji/1f579_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M16 9h4v17h-4z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 24.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5S4.672 23 5.5 23h3c.828 0 1.5.672 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34 33c0 1.104-.896 2-2 2H4c-1.104 0-2-.896-2-2v-6c0-1.104.896-2 2-2h28c1.104 0 2 .896 2 2v6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M10 34.5c0 .828-.671 1.5-1.5 1.5h-3c-.829 0-1.5-.672-1.5-1.5S4.671 33 5.5 33h3c.829 0 1.5.672 1.5 1.5zm22 0c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5s.672-1.5 1.5-1.5h3c.828 0 1.5.672 1.5 1.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="7" r="5" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25 26c0 1.104-.896 2-2 2H13c-1.104 0-2-.896-2-2v-1c0-1.104 3.896-6 5-6h4c1.104 0 5 4.896 5 6v1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M33 28c0 .553-.447 1-1 1H4c-.552 0-1-.447-1-1 0-.553.448-1 1-1h28c.553 0 1 .447 1 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M16 9h4v17h-4z"/>
+  <path fill="#DA2F47" d="M10 24.5c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5S4.672 23 5.5 23h3c.828 0 1.5.672 1.5 1.5z"/>
+  <path fill="#31373D" d="M34 33c0 1.104-.896 2-2 2H4c-1.104 0-2-.896-2-2v-6c0-1.104.896-2 2-2h28c1.104 0 2 .896 2 2v6z"/>
+  <path fill="#31373D" d="M10 34.5c0 .828-.671 1.5-1.5 1.5h-3c-.829 0-1.5-.672-1.5-1.5S4.671 33 5.5 33h3c.829 0 1.5.672 1.5 1.5zm22 0c0 .828-.672 1.5-1.5 1.5h-3c-.828 0-1.5-.672-1.5-1.5s.672-1.5 1.5-1.5h3c.828 0 1.5.672 1.5 1.5z"/>
+  <circle fill="#DA2F47" cx="18" cy="7" r="5"/>
+  <path fill="#31373D" d="M25 26c0 1.104-.896 2-2 2H13c-1.104 0-2-.896-2-2v-1c0-1.104 3.896-6 5-6h4c1.104 0 5 4.896 5 6v1z"/>
+  <path fill="#66757F" d="M33 28c0 .553-.447 1-1 1H4c-.552 0-1-.447-1-1 0-.553.448-1 1-1h28c.553 0 1 .447 1 1z"/>
+</svg>
diff --git a/public/emoji/1f58a_border.svg b/public/emoji/1f58a_border.svg
new file mode 100644
index 000000000..42a312534
--- /dev/null
+++ b/public/emoji/1f58a_border.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M3.968 33.446C2.211 35.204.47 36.312.079 35.921c-.391-.391.718-2.132 2.475-3.889 1.757-1.758 3.498-2.866 3.889-2.475.39.391-.718 2.131-2.475 3.889z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6.443 29.558l-2.122-2.122s-1.083 1.393-2.284 3.63C1.137 32.742.786 33.8.786 33.8l.707.707.707.707s1.059-.352 2.734-1.251c2.237-1.201 3.629-2.284 3.629-2.284l-2.12-2.121z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M34.02 1.98c-3.535-3.536-18.164 10.297-18.871 11.004-.707.707-1.304 1.348-.928 1.724L12.1 16.829c-2.122 2.122-8.486 9.899-7.779 10.606l2.122 2.122 2.121 2.121c.707.707 8.485-5.657 10.607-7.778l2.121-2.121c.376.376 1.017-.222 1.724-.929.707-.706 14.54-15.334 11.004-18.87z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M23.016 20.851c.085-.084.362-.375.774-.817l-7.823-7.822c-.442.411-.732.689-.817.774-.707.707-1.304 1.348-.928 1.724l3.535 3.536 3.536 3.535c.375.374 1.016-.223 1.723-.93z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.212 2.001C30.285 1.074 29.048.102 27.28.986c-1.768.884-7.313 4.441-9.878 7.005-1.322 1.322-1.247 2.102-.751 2.165.821.106 1.37.088 2.122-.663.75-.751.883-2.033.883-2.033s3.05-2.342 5.458-3.778c2.409-1.437 3.268-1.682 4.11-.84.842.842 1.988-.841 1.988-.841z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M28.87 2.487l4.643 4.643c.353-.709.631-1.384.818-2.011l-3.45-3.45c-.627.188-1.301.466-2.011.818z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#C1694F" d="M3.968 33.446C2.211 35.204.47 36.312.079 35.921c-.391-.391.718-2.132 2.475-3.889 1.757-1.758 3.498-2.866 3.889-2.475.39.391-.718 2.131-2.475 3.889z"/>
+  <path fill="#FFCC4D" d="M6.443 29.558l-2.122-2.122s-1.083 1.393-2.284 3.63C1.137 32.742.786 33.8.786 33.8l.707.707.707.707s1.059-.352 2.734-1.251c2.237-1.201 3.629-2.284 3.629-2.284l-2.12-2.121z"/>
+  <path fill="#31373D" d="M34.02 1.98c-3.535-3.536-18.164 10.297-18.871 11.004-.707.707-1.304 1.348-.928 1.724L12.1 16.829c-2.122 2.122-8.486 9.899-7.779 10.606l2.122 2.122 2.121 2.121c.707.707 8.485-5.657 10.607-7.778l2.121-2.121c.376.376 1.017-.222 1.724-.929.707-.706 14.54-15.334 11.004-18.87z"/>
+  <path fill="#FFCC4D" d="M23.016 20.851c.085-.084.362-.375.774-.817l-7.823-7.822c-.442.411-.732.689-.817.774-.707.707-1.304 1.348-.928 1.724l3.535 3.536 3.536 3.535c.375.374 1.016-.223 1.723-.93z"/>
+  <path fill="#FFAC33" d="M31.212 2.001C30.285 1.074 29.048.102 27.28.986c-1.768.884-7.313 4.441-9.878 7.005-1.322 1.322-1.247 2.102-.751 2.165.821.106 1.37.088 2.122-.663.75-.751.883-2.033.883-2.033s3.05-2.342 5.458-3.778c2.409-1.437 3.268-1.682 4.11-.84.842.842 1.988-.841 1.988-.841z"/>
+  <path fill="#FFAC33" d="M28.87 2.487l4.643 4.643c.353-.709.631-1.384.818-2.011l-3.45-3.45c-.627.188-1.301.466-2.011.818z"/>
+</svg>
diff --git a/public/emoji/1f58b_border.svg b/public/emoji/1f58b_border.svg
new file mode 100644
index 000000000..f0a6459ca
--- /dev/null
+++ b/public/emoji/1f58b_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M4.167 32.729c.292.167.626.271.987.271 1.105 0 2-.896 2-2s-.895-2-2-2-2 .896-2 2c0 .361.103.695.27.987L.278 35.133 1.154 28l9-7 5 5-7 9-7.134.876 3.147-3.147z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M22.511 5.308c-1.151 1.151-1.151 3.016 0 4.167l4.167 4.168c1.151 1.15 3.018 1.15 4.167 0l4.167-4.168c1.15-1.151 1.15-3.016 0-4.167l-4.167-4.167c-1.15-1.151-3.016-1.151-4.167 0l-4.167 4.167z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M9.511 18.309L26.713 1.105l8.333 8.335-17.201 17.203c-1.15 1.15-3.016 1.15-4.168 0l-4.166-4.168c-1.151-1.151-1.151-3.016 0-4.166z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.469 10.35l2.125-2.125 8.334 8.334-2.125 2.125z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M4.167 32.729c.292.167.626.271.987.271 1.105 0 2-.896 2-2s-.895-2-2-2-2 .896-2 2c0 .361.103.695.27.987L.278 35.133 1.154 28l9-7 5 5-7 9-7.134.876 3.147-3.147z"/>
+  <path fill="#66757F" d="M22.511 5.308c-1.151 1.151-1.151 3.016 0 4.167l4.167 4.168c1.151 1.15 3.018 1.15 4.167 0l4.167-4.168c1.15-1.151 1.15-3.016 0-4.167l-4.167-4.167c-1.15-1.151-3.016-1.151-4.167 0l-4.167 4.167z"/>
+  <path fill="#31373D" d="M9.511 18.309L26.713 1.105l8.333 8.335-17.201 17.203c-1.15 1.15-3.016 1.15-4.168 0l-4.166-4.168c-1.151-1.151-1.151-3.016 0-4.166z"/>
+  <path fill="#66757F" d="M17.469 10.35l2.125-2.125 8.334 8.334-2.125 2.125z"/>
+</svg>
diff --git a/public/emoji/1f5a4_border.svg b/public/emoji/1f5a4_border.svg
new file mode 100644
index 000000000..63aa792ce
--- /dev/null
+++ b/public/emoji/1f5a4_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M35.885 11.833c0-5.45-4.418-9.868-9.867-9.868-3.308 0-6.227 1.633-8.018 4.129-1.791-2.496-4.71-4.129-8.017-4.129-5.45 0-9.868 4.417-9.868 9.868 0 .772.098 1.52.266 2.241C1.751 22.587 11.216 31.568 18 34.034c6.783-2.466 16.249-11.447 17.617-19.959.17-.721.268-1.469.268-2.242z"/>
+</svg>
diff --git a/public/emoji/1f5e3_border.svg b/public/emoji/1f5e3_border.svg
new file mode 100644
index 000000000..8920fb239
--- /dev/null
+++ b/public/emoji/1f5e3_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M35.838 23.159c.003.553-.443 1.002-.998 1.003l-5 .013c-.552.002-.999-.446-1-.997-.003-.555.444-1.002.995-1.004l5-.013c.553 0 1.002.445 1.003.998zm-1.587-5.489c.238.499.025 1.095-.475 1.333l-4.517 2.145c-.498.236-1.094.023-1.33-.476-.239-.498-.025-1.094.474-1.333l4.516-2.144c.5-.236 1.095-.024 1.332.475zm.027 10.987c.234-.501.02-1.096-.48-1.33l-4.527-2.122c-.501-.235-1.095-.02-1.33.48-.234.501-.019 1.096.482 1.33l4.526 2.123c.499.234 1.096.019 1.329-.481z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.979 14.875c-1.42-.419-2.693-1.547-3.136-2.25-.76-1.208.157-1.521-.153-4.889C24.405 4.653 20.16 1.337 15 1c-2.346-.153-4.786.326-7.286 1.693-6.42 3.511-8.964 10.932-4.006 18.099 4.47 6.46.276 9.379.276 9.379s.166 1.36 2.914 3.188c2.749 1.827 6.121.588 6.121.588s1.112-3.954 4.748-3.59c2.606.384 6.266-.129 7.191-1.024.865-.837-.151-1.886.539-4.224-2.365-.232-3.665-1.359-3.79-2.948 2.625.255 3.708-.578 4.458-1.495-.021-.54-.075-1.686-.127-2.454 2.322-.672 3.212-2.962 1.941-3.337z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FA743E" d="M35.838 23.159c.003.553-.443 1.002-.998 1.003l-5 .013c-.552.002-.999-.446-1-.997-.003-.555.444-1.002.995-1.004l5-.013c.553 0 1.002.445 1.003.998zm-1.587-5.489c.238.499.025 1.095-.475 1.333l-4.517 2.145c-.498.236-1.094.023-1.33-.476-.239-.498-.025-1.094.474-1.333l4.516-2.144c.5-.236 1.095-.024 1.332.475zm.027 10.987c.234-.501.02-1.096-.48-1.33l-4.527-2.122c-.501-.235-1.095-.02-1.33.48-.234.501-.019 1.096.482 1.33l4.526 2.123c.499.234 1.096.019 1.329-.481z"/>
+  <path fill="#269" d="M27.979 14.875c-1.42-.419-2.693-1.547-3.136-2.25-.76-1.208.157-1.521-.153-4.889C24.405 4.653 20.16 1.337 15 1c-2.346-.153-4.786.326-7.286 1.693-6.42 3.511-8.964 10.932-4.006 18.099 4.47 6.46.276 9.379.276 9.379s.166 1.36 2.914 3.188c2.749 1.827 6.121.588 6.121.588s1.112-3.954 4.748-3.59c2.606.384 6.266-.129 7.191-1.024.865-.837-.151-1.886.539-4.224-2.365-.232-3.665-1.359-3.79-2.948 2.625.255 3.708-.578 4.458-1.495-.021-.54-.075-1.686-.127-2.454 2.322-.672 3.212-2.962 1.941-3.337z"/>
+</svg>
diff --git a/public/emoji/1f983_border.svg b/public/emoji/1f983_border.svg
new file mode 100644
index 000000000..ccd557b04
--- /dev/null
+++ b/public/emoji/1f983_border.svg
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M22.88 33.097c-.098-.18-.25-.302-.418-.391C20.865 31 22 28.999 22 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.486-.263.667-.869.404-1.355zm-7 0c-.097-.18-.25-.302-.417-.391C13.866 31 15 28.999 15 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.485-.263.666-.869.403-1.355z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5.134 7c2 5-3 5-2 7s5-2 3-7-1 0-1 0z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M7 6c0 1.104 1.933 2 0 2S0 7 0 6s1.067-3 3-3 4 1.896 4 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M6 21C6 15 9.209 8 7 8 3 8 3 6.209 3 4s1.791-4 4-4c7 0 6 9 4 13-1.674 3.348-2.022 8-5 8z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M36 17c0 7.959-5 11.3-10 11.249C23.966 30.045 21.073 31 18 31c-6.627 0-12-4.836-12-10.8 0-5.965 5.373-10.8 12-10.8 3-2.7 7-6.5 10-7.4 6 3.6 8 7.8 8 15z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="6" cy="3" r="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M17.984 9.4c-1.626.002-3.174.297-4.585.829 3.914-.229 6.351-.042 9.602 1.552-.923-1.515-3.392-2.381-5.017-2.381zm17.942 5.435c-.086-1.278-.254-2.456-.52-3.545-6.25 1.272-3.404 3.545.52 3.545zm-1.985-7.223c-.676-1.154-1.541-2.205-2.623-3.186-7.162 3.574-3.006 4.73 2.623 3.186zm1.212 14.473c-3.402-1.085-4.247.821-2.215 3.415-2.5-2.344-4.031-1.062-3.344 2-1.469-2.188-2.969-.208-3.594.749 3.761.038 7.52-1.844 9.153-6.164zM31.315 4.424C30.378 3.574 29.286 2.771 28 2c-7 3.688-2 4.406 3.315 2.424zm3.838 17.66C35.691 20.66 36 18.973 36 17c0-.755-.027-1.471-.074-2.163-4.61.382-3.801 2.882.006 3.351-3.557.062-4.181 2.25-.779 3.896zm-1.21-14.469c-6.427 2.385-3.693 4.291 1.462 3.673-.328-1.344-.808-2.557-1.462-3.673z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#FFAC33" d="M22.88 33.097c-.098-.18-.25-.302-.418-.391C20.865 31 22 28.999 22 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.107l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.486-.263.667-.869.404-1.355zm-7 0c-.097-.18-.25-.302-.417-.391C13.866 31 15 28.999 15 28.999c0-.553 1-2 0-2l-1 1c-1 1-1 4-1 4h-2c-.553 0-1 .447-1 1 0 .553.447 1 1 1h1.108l-.222.12c-.486.263-.667.869-.404 1.356.263.486.869.667 1.356.404l2.639-1.427c.485-.263.666-.869.403-1.355z"/>
+  <path fill="#BE1931" d="M5.134 7c2 5-3 5-2 7s5-2 3-7-1 0-1 0z"/>
+  <path fill="#FFAC33" d="M7 6c0 1.104 1.933 2 0 2S0 7 0 6s1.067-3 3-3 4 1.896 4 3z"/>
+  <path fill="#C1694F" d="M6 21C6 15 9.209 8 7 8 3 8 3 6.209 3 4s1.791-4 4-4c7 0 6 9 4 13-1.674 3.348-2.022 8-5 8z"/>
+  <path fill="#31373D" d="M36 17c0 7.959-5 11.3-10 11.249C23.966 30.045 21.073 31 18 31c-6.627 0-12-4.836-12-10.8 0-5.965 5.373-10.8 12-10.8 3-2.7 7-6.5 10-7.4 6 3.6 8 7.8 8 15z"/>
+  <circle fill="#292F33" cx="6" cy="3" r="1"/>
+  <path fill="#66757F" d="M17.984 9.4c-1.626.002-3.174.297-4.585.829 3.914-.229 6.351-.042 9.602 1.552-.923-1.515-3.392-2.381-5.017-2.381zm17.942 5.435c-.086-1.278-.254-2.456-.52-3.545-6.25 1.272-3.404 3.545.52 3.545zm-1.985-7.223c-.676-1.154-1.541-2.205-2.623-3.186-7.162 3.574-3.006 4.73 2.623 3.186zm1.212 14.473c-3.402-1.085-4.247.821-2.215 3.415-2.5-2.344-4.031-1.062-3.344 2-1.469-2.188-2.969-.208-3.594.749 3.761.038 7.52-1.844 9.153-6.164zM31.315 4.424C30.378 3.574 29.286 2.771 28 2c-7 3.688-2 4.406 3.315 2.424zm3.838 17.66C35.691 20.66 36 18.973 36 17c0-.755-.027-1.471-.074-2.163-4.61.382-3.801 2.882.006 3.351-3.557.062-4.181 2.25-.779 3.896zm-1.21-14.469c-6.427 2.385-3.693 4.291 1.462 3.673-.328-1.344-.808-2.557-1.462-3.673z"/>
+</svg>
diff --git a/public/emoji/1f98d_border.svg b/public/emoji/1f98d_border.svg
new file mode 100644
index 000000000..1f022a9ba
--- /dev/null
+++ b/public/emoji/1f98d_border.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M5 16c0-4-5-3-4 1s3 5 3 5l1-6zm26 0c0-4 5-3 4 1s-3 5-3 5l-1-6z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M32.65 21.736c0 10.892-4.691 14.087-14.65 14.087-9.958 0-14.651-3.195-14.651-14.087S8.042.323 18 .323c9.959 0 14.65 10.521 14.65 21.413z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M27.567 23c1.49-4.458 2.088-7.312-.443-7.312H8.876c-2.532 0-1.933 2.854-.444 7.312C3.504 34.201 17.166 34.823 18 34.823S32.303 33.764 27.567 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M15 18.003c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1zm10 0c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <ellipse cx="15.572" cy="23.655" rx="1.428" ry="1" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.856 23.655c0 .553-.639 1-1.428 1-.79 0-1.429-.447-1.429-1 0-.553.639-1 1.429-1s1.428.448 1.428 1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21.02 21.04c-1.965-.26-3.02.834-3.02.834s-1.055-1.094-3.021-.834c-3.156.417-3.285 3.287-1.939 3.105.766-.104.135-.938 1.713-1.556 1.579-.616 3.247.66 3.247.66s1.667-1.276 3.246-.659.947 1.452 1.714 1.556c1.346.181 1.218-2.689-1.94-3.106z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M24.835 30.021c-1.209.323-3.204.596-6.835.596s-5.625-.272-6.835-.596c-3.205-.854-1.923-1.735 0-1.477 1.923.259 3.631.415 6.835.415 3.205 0 4.914-.156 6.835-.415 1.923-.258 3.204.623 0 1.477z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M4.253 16.625c1.403-1.225-1.078-3.766-2.196-2.544-.341.373.921-.188 1.336 1.086.308.942.001 2.208.86 1.458zm27.493 0c-1.402-1.225 1.078-3.766 2.196-2.544.341.373-.921-.188-1.337 1.086-.306.942 0 2.208-.859 1.458z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M5 16c0-4-5-3-4 1s3 5 3 5l1-6zm26 0c0-4 5-3 4 1s-3 5-3 5l-1-6z"/>
+  <path fill="#31373D" d="M32.65 21.736c0 10.892-4.691 14.087-14.65 14.087-9.958 0-14.651-3.195-14.651-14.087S8.042.323 18 .323c9.959 0 14.65 10.521 14.65 21.413z"/>
+  <path fill="#66757F" d="M27.567 23c1.49-4.458 2.088-7.312-.443-7.312H8.876c-2.532 0-1.933 2.854-.444 7.312C3.504 34.201 17.166 34.823 18 34.823S32.303 33.764 27.567 23z"/>
+  <path fill="#31373D" d="M15 18.003c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1zm10 0c0 1.105-.896 2-2 2s-2-.895-2-2c0-1.104.896-1 2-1s2-.105 2 1z"/>
+  <ellipse fill="#31373D" cx="15.572" cy="23.655" rx="1.428" ry="1"/>
+  <path fill="#31373D" d="M21.856 23.655c0 .553-.639 1-1.428 1-.79 0-1.429-.447-1.429-1 0-.553.639-1 1.429-1s1.428.448 1.428 1z"/>
+  <path fill="#99AAB5" d="M21.02 21.04c-1.965-.26-3.02.834-3.02.834s-1.055-1.094-3.021-.834c-3.156.417-3.285 3.287-1.939 3.105.766-.104.135-.938 1.713-1.556 1.579-.616 3.247.66 3.247.66s1.667-1.276 3.246-.659.947 1.452 1.714 1.556c1.346.181 1.218-2.689-1.94-3.106z"/>
+  <path fill="#31373D" d="M24.835 30.021c-1.209.323-3.204.596-6.835.596s-5.625-.272-6.835-.596c-3.205-.854-1.923-1.735 0-1.477 1.923.259 3.631.415 6.835.415 3.205 0 4.914-.156 6.835-.415 1.923-.258 3.204.623 0 1.477z"/>
+  <path fill="#66757F" d="M4.253 16.625c1.403-1.225-1.078-3.766-2.196-2.544-.341.373.921-.188 1.336 1.086.308.942.001 2.208.86 1.458zm27.493 0c-1.402-1.225 1.078-3.766 2.196-2.544.341.373-.921-.188-1.337 1.086-.306.942 0 2.208-.859 1.458z"/>
+</svg>
diff --git a/public/emoji/2122_border.svg b/public/emoji/2122_border.svg
new file mode 100644
index 000000000..f0fbee1b1
--- /dev/null
+++ b/public/emoji/2122_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M5.208 12.674H2.374c-1.248 0-1.768-.91-1.768-1.794 0-.91.65-1.794 1.768-1.794h9.568c1.118 0 1.768.884 1.768 1.794 0 .884-.52 1.794-1.768 1.794H9.108v13.053c0 1.299-.832 2.027-1.95 2.027-1.118 0-1.95-.729-1.95-2.027V12.674zm11.258-1.742c.156-.936 1.17-2.002 2.548-2.002 1.301 0 2.314.937 2.601 1.872l3.066 10.296h.053l3.068-10.296c.285-.936 1.301-1.872 2.6-1.872 1.379 0 2.393 1.066 2.549 2.002l2.418 14.507c.025.156.025.312.025.443 0 1.143-.832 1.871-1.871 1.871-1.326 0-1.848-.598-2.029-1.82l-1.533-10.581h-.053l-3.119 10.894c-.182.623-.676 1.508-2.08 1.508s-1.899-.885-2.08-1.508l-3.121-10.894h-.051l-1.535 10.581c-.182 1.223-.702 1.82-2.028 1.82-1.04 0-1.872-.729-1.872-1.871 0-.131 0-.287.026-.443l2.418-14.507z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path d="M5.208 12.674H2.374c-1.248 0-1.768-.91-1.768-1.794 0-.91.65-1.794 1.768-1.794h9.568c1.118 0 1.768.884 1.768 1.794 0 .884-.52 1.794-1.768 1.794H9.108v13.053c0 1.299-.832 2.027-1.95 2.027-1.118 0-1.95-.729-1.95-2.027V12.674zm11.258-1.742c.156-.936 1.17-2.002 2.548-2.002 1.301 0 2.314.937 2.601 1.872l3.066 10.296h.053l3.068-10.296c.285-.936 1.301-1.872 2.6-1.872 1.379 0 2.393 1.066 2.549 2.002l2.418 14.507c.025.156.025.312.025.443 0 1.143-.832 1.871-1.871 1.871-1.326 0-1.848-.598-2.029-1.82l-1.533-10.581h-.053l-3.119 10.894c-.182.623-.676 1.508-2.08 1.508s-1.899-.885-2.08-1.508l-3.121-10.894h-.051l-1.535 10.581c-.182 1.223-.702 1.82-2.028 1.82-1.04 0-1.872-.729-1.872-1.871 0-.131 0-.287.026-.443l2.418-14.507z" fill="#31373D"/>
+</svg>
diff --git a/public/emoji/25aa_border.svg b/public/emoji/25aa_border.svg
new file mode 100644
index 000000000..220eb4345
--- /dev/null
+++ b/public/emoji/25aa_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z"/>
+</svg>
diff --git a/public/emoji/25ab_border.svg b/public/emoji/25ab_border.svg
new file mode 100644
index 000000000..b51e1a9cc
--- /dev/null
+++ b/public/emoji/25ab_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M25 24c0 .553-.447 1-1 1H12c-.552 0-1-.447-1-1V12c0-.552.448-1 1-1h12c.553 0 1 .448 1 1v12z"/>
+</svg>
diff --git a/public/emoji/25fb_border.svg b/public/emoji/25fb_border.svg
new file mode 100644
index 000000000..24c48e17a
--- /dev/null
+++ b/public/emoji/25fb_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z"/>
+</svg>
diff --git a/public/emoji/25fc_border.svg b/public/emoji/25fc_border.svg
new file mode 100644
index 000000000..345e972ed
--- /dev/null
+++ b/public/emoji/25fc_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M33 30c0 1.657-1.343 3-3 3H6c-1.657 0-3-1.343-3-3V6c0-1.657 1.343-3 3-3h24c1.657 0 3 1.343 3 3v24z"/>
+</svg>
diff --git a/public/emoji/25fd_border.svg b/public/emoji/25fd_border.svg
new file mode 100644
index 000000000..ec7278674
--- /dev/null
+++ b/public/emoji/25fd_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z"/>
+</svg>
diff --git a/public/emoji/25fe_border.svg b/public/emoji/25fe_border.svg
new file mode 100644
index 000000000..775bb6718
--- /dev/null
+++ b/public/emoji/25fe_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M29 27c0 1.104-.896 2-2 2H9c-1.104 0-2-.896-2-2V9c0-1.104.896-2 2-2h18c1.104 0 2 .896 2 2v18z"/>
+</svg>
diff --git a/public/emoji/2601_border.svg b/public/emoji/2601_border.svg
new file mode 100644
index 000000000..6ab20d737
--- /dev/null
+++ b/public/emoji/2601_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M27 8c-.701 0-1.377.106-2.015.298.005-.1.015-.197.015-.298 0-3.313-2.687-6-6-6-2.769 0-5.093 1.878-5.785 4.427C12.529 6.154 11.783 6 11 6c-3.314 0-6 2.686-6 6 0 3.312 2.686 6 6 6 2.769 0 5.093-1.878 5.785-4.428.686.273 1.432.428 2.215.428.375 0 .74-.039 1.096-.104-.058.36-.096.727-.096 1.104 0 3.865 3.135 7 7 7s7-3.135 7-7c0-3.866-3.135-7-7-7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31 22c-.467 0-.91.085-1.339.204.216-.526.339-1.1.339-1.704 0-2.485-2.015-4.5-4.5-4.5-1.019 0-1.947.351-2.701.921C22.093 14.096 19.544 12 16.5 12c-2.838 0-5.245 1.822-6.131 4.357C9.621 16.125 8.825 16 8 16c-4.418 0-8 3.582-8 8 0 4.419 3.582 8 8 8h23c2.762 0 5-2.238 5-5s-2.238-5-5-5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M27 8c-.701 0-1.377.106-2.015.298.005-.1.015-.197.015-.298 0-3.313-2.687-6-6-6-2.769 0-5.093 1.878-5.785 4.427C12.529 6.154 11.783 6 11 6c-3.314 0-6 2.686-6 6 0 3.312 2.686 6 6 6 2.769 0 5.093-1.878 5.785-4.428.686.273 1.432.428 2.215.428.375 0 .74-.039 1.096-.104-.058.36-.096.727-.096 1.104 0 3.865 3.135 7 7 7s7-3.135 7-7c0-3.866-3.135-7-7-7z"/>
+  <path fill="#E1E8ED" d="M31 22c-.467 0-.91.085-1.339.204.216-.526.339-1.1.339-1.704 0-2.485-2.015-4.5-4.5-4.5-1.019 0-1.947.351-2.701.921C22.093 14.096 19.544 12 16.5 12c-2.838 0-5.245 1.822-6.131 4.357C9.621 16.125 8.825 16 8 16c-4.418 0-8 3.582-8 8 0 4.419 3.582 8 8 8h23c2.762 0 5-2.238 5-5s-2.238-5-5-5z"/>
+</svg>
diff --git a/public/emoji/2620_border.svg b/public/emoji/2620_border.svg
new file mode 100644
index 000000000..8878828be
--- /dev/null
+++ b/public/emoji/2620_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M27.865 16.751c0-6.242-4.411-9.988-9.927-9.988s-9.835 3.746-9.835 9.988c0 3.48-.103 6.485 3.897 7.89v2.722c0 1.034.966 1.872 2 1.872 1.035 0 2-.838 2-1.872v-1.97 1.97c0 1.034.965 1.872 2 1.872 1.036 0 2-.838 2-1.872v-1.97 1.97c0 1.034.966 1.872 2 1.872s2-.838 2-1.872v-2.722c4-1.405 3.865-4.41 3.865-7.89z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="13.629" cy="15.503" r="3.121" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M25.488 15.503c0 1.724 0 3.121-3.121 3.121-3.12 0-3.12-1.397-3.12-3.121s1.396-3.121 3.12-3.121c1.725 0 3.121 1.397 3.121 3.121zm-6.301 5.656c-.157-.382-.626-.662-1.189-.662-.561 0-1.031.28-1.188.662-.394.11-.685.469-.685.898 0 .517.419.936.937.936.409 0 .753-.263.88-.628.019 0 .037.004.056.004.019 0 .037-.004.057-.004.128.365.472.628.88.628.517 0 .936-.419.936-.936 0-.429-.291-.786-.684-.898z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M11 27c0-.367.075-.713.195-1.038-.984-.447-1.831-1.082-2.503-1.97-1.107.969-2.163 1.876-3.127 2.695C4.985 26.26 4.275 26 3.5 26 1.567 26 0 27.566 0 29.5c0 1.778 1.33 3.229 3.046 3.454C3.271 34.671 4.722 36 6.5 36c1.933 0 3.5-1.566 3.5-3.5 0-.775-.26-1.485-.686-2.065.6-.706 1.246-1.46 1.931-2.25C11.088 27.821 11 27.421 11 27zm16.872-15.482c.884-.769 1.729-1.495 2.515-2.163.569.403 1.262.645 2.013.645 1.934 0 3.5-1.567 3.5-3.5 0-1.743-1.277-3.177-2.945-3.444C32.735 1.335 31.281 0 29.5 0 27.566 0 26 1.567 26 3.5c0 .775.26 1.485.687 2.065-.594.7-1.233 1.445-1.911 2.227 1.3.871 2.361 2.095 3.096 3.726zM3.5 10c.775 0 1.485-.26 2.065-.687.799.679 1.661 1.419 2.564 2.204.735-1.631 1.795-2.855 3.096-3.726-.679-.781-1.317-1.527-1.912-2.226.427-.58.687-1.29.687-2.065C10 1.567 8.433 0 6.5 0 4.722 0 3.271 1.33 3.046 3.046 1.33 3.271 0 4.722 0 6.5 0 8.433 1.567 10 3.5 10zm28.9 16c-.752 0-1.444.242-2.014.645-.952-.809-1.99-1.701-3.079-2.653-.672.889-1.519 1.523-2.503 1.971.121.324.196.67.196 1.037 0 .421-.088.821-.245 1.185.685.79 1.331 1.544 1.931 2.25-.426.58-.686 1.29-.686 2.065 0 1.934 1.566 3.5 3.5 3.5 1.781 0 3.235-1.334 3.455-3.056 1.668-.267 2.945-1.701 2.945-3.444 0-1.934-1.566-3.5-3.5-3.5z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M27.865 16.751c0-6.242-4.411-9.988-9.927-9.988s-9.835 3.746-9.835 9.988c0 3.48-.103 6.485 3.897 7.89v2.722c0 1.034.966 1.872 2 1.872 1.035 0 2-.838 2-1.872v-1.97 1.97c0 1.034.965 1.872 2 1.872 1.036 0 2-.838 2-1.872v-1.97 1.97c0 1.034.966 1.872 2 1.872s2-.838 2-1.872v-2.722c4-1.405 3.865-4.41 3.865-7.89z"/>
+  <circle fill="#292F33" cx="13.629" cy="15.503" r="3.121"/>
+  <path fill="#292F33" d="M25.488 15.503c0 1.724 0 3.121-3.121 3.121-3.12 0-3.12-1.397-3.12-3.121s1.396-3.121 3.12-3.121c1.725 0 3.121 1.397 3.121 3.121zm-6.301 5.656c-.157-.382-.626-.662-1.189-.662-.561 0-1.031.28-1.188.662-.394.11-.685.469-.685.898 0 .517.419.936.937.936.409 0 .753-.263.88-.628.019 0 .037.004.056.004.019 0 .037-.004.057-.004.128.365.472.628.88.628.517 0 .936-.419.936-.936 0-.429-.291-.786-.684-.898z"/>
+  <path d="M11 27c0-.367.075-.713.195-1.038-.984-.447-1.831-1.082-2.503-1.97-1.107.969-2.163 1.876-3.127 2.695C4.985 26.26 4.275 26 3.5 26 1.567 26 0 27.566 0 29.5c0 1.778 1.33 3.229 3.046 3.454C3.271 34.671 4.722 36 6.5 36c1.933 0 3.5-1.566 3.5-3.5 0-.775-.26-1.485-.686-2.065.6-.706 1.246-1.46 1.931-2.25C11.088 27.821 11 27.421 11 27zm16.872-15.482c.884-.769 1.729-1.495 2.515-2.163.569.403 1.262.645 2.013.645 1.934 0 3.5-1.567 3.5-3.5 0-1.743-1.277-3.177-2.945-3.444C32.735 1.335 31.281 0 29.5 0 27.566 0 26 1.567 26 3.5c0 .775.26 1.485.687 2.065-.594.7-1.233 1.445-1.911 2.227 1.3.871 2.361 2.095 3.096 3.726zM3.5 10c.775 0 1.485-.26 2.065-.687.799.679 1.661 1.419 2.564 2.204.735-1.631 1.795-2.855 3.096-3.726-.679-.781-1.317-1.527-1.912-2.226.427-.58.687-1.29.687-2.065C10 1.567 8.433 0 6.5 0 4.722 0 3.271 1.33 3.046 3.046 1.33 3.271 0 4.722 0 6.5 0 8.433 1.567 10 3.5 10zm28.9 16c-.752 0-1.444.242-2.014.645-.952-.809-1.99-1.701-3.079-2.653-.672.889-1.519 1.523-2.503 1.971.121.324.196.67.196 1.037 0 .421-.088.821-.245 1.185.685.79 1.331 1.544 1.931 2.25-.426.58-.686 1.29-.686 2.065 0 1.934 1.566 3.5 3.5 3.5 1.781 0 3.235-1.334 3.455-3.056 1.668-.267 2.945-1.701 2.945-3.444 0-1.934-1.566-3.5-3.5-3.5z" fill="#AAB8C2"/>
+</svg>
diff --git a/public/emoji/2660_border.svg b/public/emoji/2660_border.svg
new file mode 100644
index 000000000..3ce65b4eb
--- /dev/null
+++ b/public/emoji/2660_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M32.799 20.336C32.799 11.456 18 .198 18 .198S3.201 11.456 3.201 20.336c0 6.946 8.175 10.172 12.766 5.173C15.631 29.688 11.247 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.246 0-8.632-3.312-8.967-7.491 4.591 4.999 12.766 1.773 12.766-5.173z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M32.799 20.336C32.799 11.456 18 .198 18 .198S3.201 11.456 3.201 20.336c0 6.946 8.175 10.172 12.766 5.173C15.631 29.688 11.247 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.246 0-8.632-3.312-8.967-7.491 4.591 4.999 12.766 1.773 12.766-5.173z"/>
+</svg>
diff --git a/public/emoji/2663_border.svg b/public/emoji/2663_border.svg
new file mode 100644
index 000000000..3fcf5c75e
--- /dev/null
+++ b/public/emoji/2663_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M25.5 28c4.143 0 7.5-3.358 7.5-7.5 0-4.142-3.357-7.5-7.5-7.5-1.359 0-2.631.367-3.73 1h-.21c2.047-1.217 3.423-3.445 3.423-6 0-3.857-3.126-6.984-6.983-6.984S11.016 4.143 11.016 8c0 2.555 1.376 4.783 3.423 6h-.208c-1.1-.633-2.371-1-3.731-1C6.358 13 3 16.358 3 20.5c0 4.142 3.358 7.5 7.5 7.5 2.155 0 4.091-.914 5.46-2.368C15.549 29.753 11.205 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.205 0-8.549-3.248-8.959-7.369C21.408 27.086 23.346 28 25.5 28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M25.5 28c4.143 0 7.5-3.358 7.5-7.5 0-4.142-3.357-7.5-7.5-7.5-1.359 0-2.631.367-3.73 1h-.21c2.047-1.217 3.423-3.445 3.423-6 0-3.857-3.126-6.984-6.983-6.984S11.016 4.143 11.016 8c0 2.555 1.376 4.783 3.423 6h-.208c-1.1-.633-2.371-1-3.731-1C6.358 13 3 16.358 3 20.5c0 4.142 3.358 7.5 7.5 7.5 2.155 0 4.091-.914 5.46-2.368C15.549 29.753 11.205 33 7 33h.5c-.829 0-1.5.672-1.5 1.5S6.671 36 7.5 36h21c.828 0 1.5-.672 1.5-1.5s-.672-1.5-1.5-1.5h.5c-4.205 0-8.549-3.248-8.959-7.369C21.408 27.086 23.346 28 25.5 28z"/>
+</svg>
diff --git a/public/emoji/26aa_border.svg b/public/emoji/26aa_border.svg
new file mode 100644
index 000000000..d2cac5cad
--- /dev/null
+++ b/public/emoji/26aa_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E6E7E8" cx="18" cy="18" r="18"/>
+</svg>
diff --git a/public/emoji/26ab_border.svg b/public/emoji/26ab_border.svg
new file mode 100644
index 000000000..617df7493
--- /dev/null
+++ b/public/emoji/26ab_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#31373D" cx="18" cy="18" r="18"/>
+</svg>
diff --git a/public/emoji/26be_border.svg b/public/emoji/26be_border.svg
new file mode 100644
index 000000000..25954deac
--- /dev/null
+++ b/public/emoji/26be_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="18" r="18" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M31.802 29.546C28.792 28.221 27 24.048 27 18c0-6.048 1.792-10.221 4.802-11.546-.445-.531-.926-1.028-1.428-1.504C27.406 6.605 25 10.578 25 18c0 7.421 2.406 11.395 5.374 13.05.502-.477.984-.973 1.428-1.504zM11 18c0-7.421-2.406-11.395-5.374-13.049-.502.476-.984.972-1.428 1.503C7.208 7.78 9 11.952 9 18c0 6.048-1.792 10.22-4.802 11.546.445.531.926 1.027 1.428 1.504C8.593 29.395 11 25.421 11 18z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M5.092 10.164c-.237 0-.457-.02-.651-.056-.543-.102-.9-.624-.799-1.167.102-.543.625-.902 1.167-.799.43.077 2.691.006 3.148-2.276.108-.541.632-.892 1.177-.784.542.108.893.635.784 1.177-.583 2.912-3.139 3.905-4.826 3.905zm1.7 3.961c-.53 0-.952-.323-.978-.859-.026-.551.4-.911.952-.937 0 0 2.564-.035 3.869-2.294.275-.478.886-.63 1.365-.352.478.276.642.894.365 1.373-1.851 3.206-5.557 3.069-5.573 3.069zM9 19.282c-.734 0-1.414-.135-1.928-.378-.499-.236-.712-.833-.476-1.332.237-.5.834-.711 1.332-.476.83.393 2.926.239 3.73-1.012.299-.465.917-.6 1.382-.301.465.299.599.918.301 1.382-.964 1.501-2.776 2.117-4.341 2.117zm1.161 5.525c-1.554 0-2.995-.699-3.926-1.476-.424-.354-.481-.984-.128-1.409.354-.425.984-.48 1.408-.128.194.163 1.952 1.566 3.782.785.507-.215 1.095.021 1.311.53.216.509-.021 1.096-.53 1.312-.639.271-1.288.386-1.917.386zM9.75 30h-.028c-2.504 0-4.679-1.57-5.534-3.108-.269-.482-.094-1.044.388-1.312.483-.269 1.092-.07 1.36.412.484.871 1.996 2.134 3.841 2.185.552.016.987.388.972.939-.015.542-.459.884-.999.884zm17.438.188c-.066 0-.131-.006-.197-.02-.541-.108-.893-.635-.784-1.177.664-3.322 3.894-4.15 5.478-3.849.543.102.9.624.798 1.167-.101.542-.617.903-1.167.798-.425-.08-2.69-.007-3.147 2.276-.096.476-.514.805-.981.805zm-2.564-4.5c-.17 0-.342-.043-.499-.134-.479-.276-.643-.889-.366-1.366 1.852-3.206 3.984-3.304 5.394-3.369l.111-.005c.539-.033 1.021.399 1.047.951.026.552-.399 1.021-.951 1.047l-.115.005c-1.204.056-2.449.112-3.754 2.371-.185.321-.521.5-.867.5zm-1-6.063c-.186 0-.372-.051-.54-.159-.464-.298-.599-.917-.3-1.381 1.415-2.203 4.656-2.501 6.268-1.738.499.236.713.833.476 1.332-.235.5-.834.712-1.331.476-.829-.393-2.926-.239-3.732 1.012-.19.296-.512.458-.841.458zm5.625-5.937c-.226 0-.452-.076-.64-.232-.194-.162-1.952-1.559-3.781-.785-.509.215-1.095-.021-1.312-.53-.216-.508.021-1.096.53-1.311 2.219-.942 4.535-.001 5.844 1.09.424.353.482.984.128 1.408-.198.237-.482.36-.769.36zm1.814-3.938c-.352 0-.692-.186-.875-.514-.484-.872-1.996-2.123-3.841-2.174-.553-.015-.987-.506-.973-1.059.017-.542.461-1.003 1-1.003h.028c2.505 0 4.68 1.694 5.534 3.232.269.483.095 1.108-.389 1.376-.152.086-.319.142-.484.142z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#E1E8ED" cx="18" cy="18" r="18"/>
+  <path fill="#B3BEC4" d="M31.802 29.546C28.792 28.221 27 24.048 27 18c0-6.048 1.792-10.221 4.802-11.546-.445-.531-.926-1.028-1.428-1.504C27.406 6.605 25 10.578 25 18c0 7.421 2.406 11.395 5.374 13.05.502-.477.984-.973 1.428-1.504zM11 18c0-7.421-2.406-11.395-5.374-13.049-.502.476-.984.972-1.428 1.503C7.208 7.78 9 11.952 9 18c0 6.048-1.792 10.22-4.802 11.546.445.531.926 1.027 1.428 1.504C8.593 29.395 11 25.421 11 18z"/>
+  <path d="M5.092 10.164c-.237 0-.457-.02-.651-.056-.543-.102-.9-.624-.799-1.167.102-.543.625-.902 1.167-.799.43.077 2.691.006 3.148-2.276.108-.541.632-.892 1.177-.784.542.108.893.635.784 1.177-.583 2.912-3.139 3.905-4.826 3.905zm1.7 3.961c-.53 0-.952-.323-.978-.859-.026-.551.4-.911.952-.937 0 0 2.564-.035 3.869-2.294.275-.478.886-.63 1.365-.352.478.276.642.894.365 1.373-1.851 3.206-5.557 3.069-5.573 3.069zM9 19.282c-.734 0-1.414-.135-1.928-.378-.499-.236-.712-.833-.476-1.332.237-.5.834-.711 1.332-.476.83.393 2.926.239 3.73-1.012.299-.465.917-.6 1.382-.301.465.299.599.918.301 1.382-.964 1.501-2.776 2.117-4.341 2.117zm1.161 5.525c-1.554 0-2.995-.699-3.926-1.476-.424-.354-.481-.984-.128-1.409.354-.425.984-.48 1.408-.128.194.163 1.952 1.566 3.782.785.507-.215 1.095.021 1.311.53.216.509-.021 1.096-.53 1.312-.639.271-1.288.386-1.917.386zM9.75 30h-.028c-2.504 0-4.679-1.57-5.534-3.108-.269-.482-.094-1.044.388-1.312.483-.269 1.092-.07 1.36.412.484.871 1.996 2.134 3.841 2.185.552.016.987.388.972.939-.015.542-.459.884-.999.884zm17.438.188c-.066 0-.131-.006-.197-.02-.541-.108-.893-.635-.784-1.177.664-3.322 3.894-4.15 5.478-3.849.543.102.9.624.798 1.167-.101.542-.617.903-1.167.798-.425-.08-2.69-.007-3.147 2.276-.096.476-.514.805-.981.805zm-2.564-4.5c-.17 0-.342-.043-.499-.134-.479-.276-.643-.889-.366-1.366 1.852-3.206 3.984-3.304 5.394-3.369l.111-.005c.539-.033 1.021.399 1.047.951.026.552-.399 1.021-.951 1.047l-.115.005c-1.204.056-2.449.112-3.754 2.371-.185.321-.521.5-.867.5zm-1-6.063c-.186 0-.372-.051-.54-.159-.464-.298-.599-.917-.3-1.381 1.415-2.203 4.656-2.501 6.268-1.738.499.236.713.833.476 1.332-.235.5-.834.712-1.331.476-.829-.393-2.926-.239-3.732 1.012-.19.296-.512.458-.841.458zm5.625-5.937c-.226 0-.452-.076-.64-.232-.194-.162-1.952-1.559-3.781-.785-.509.215-1.095-.021-1.312-.53-.216-.508.021-1.096.53-1.311 2.219-.942 4.535-.001 5.844 1.09.424.353.482.984.128 1.408-.198.237-.482.36-.769.36zm1.814-3.938c-.352 0-.692-.186-.875-.514-.484-.872-1.996-2.123-3.841-2.174-.553-.015-.987-.506-.973-1.059.017-.542.461-1.003 1-1.003h.028c2.505 0 4.68 1.694 5.534 3.232.269.483.095 1.108-.389 1.376-.152.086-.319.142-.484.142z" fill="#DD2E44"/>
+</svg>
diff --git a/public/emoji/26f8_border.svg b/public/emoji/26f8_border.svg
new file mode 100644
index 000000000..0df7ff2ff
--- /dev/null
+++ b/public/emoji/26f8_border.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M26 33c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3zm-14 0c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M30 36H2c-1.104 0-2.104-3-1-3h28c3 0 3-3 4-4 5 3 2 7-3 7z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M1 28c0-9 2-14 2-21 0-2.279 13-2 13 0s-1.5 10 5 13c6.268 2.893 15 2 15 8H1z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M36 28c-24 0-19.001-1-25-1H1v1c0 1.104.896 2 2 2h8c2.333 0 .398-2.041 3-1 5 2 20 1 20 1 1.104 0 2-.896 2-2z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M16.312 20.75c-.25 0-.5-.093-.694-.28-.398-.383-.409-1.017-.025-1.414l1.688-1.75c.384-.396 1.017-.408 1.414-.025.398.383.409 1.016.025 1.414l-1.688 1.75c-.196.202-.458.305-.72.305zM19.999 23c-.15 0-.303-.034-.446-.105-.494-.247-.694-.848-.447-1.342l1-2c.248-.494.848-.692 1.342-.447.494.247.694.848.447 1.342l-1 2c-.176.35-.529.552-.896.552zm4.002 1c-.047 0-.095-.003-.143-.01-.547-.079-.927-.585-.849-1.132l.209-1.458c.079-.547.587-.923 1.132-.849.547.079.927.585.849 1.132l-.209 1.458c-.072.5-.5.859-.989.859z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M26 33c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3zm-14 0c2 2-11 2-9 0 3 0 3-3 3-3h3s0 3 3 3z"/>
+  <path fill="#99AAB5" d="M30 36H2c-1.104 0-2.104-3-1-3h28c3 0 3-3 4-4 5 3 2 7-3 7z"/>
+  <path fill="#E6E7E8" d="M1 28c0-9 2-14 2-21 0-2.279 13-2 13 0s-1.5 10 5 13c6.268 2.893 15 2 15 8H1z"/>
+  <path fill="#E6E7E8" d="M36 28c-24 0-19.001-1-25-1H1v1c0 1.104.896 2 2 2h8c2.333 0 .398-2.041 3-1 5 2 20 1 20 1 1.104 0 2-.896 2-2z"/>
+  <path fill="#DD2E44" d="M16.312 20.75c-.25 0-.5-.093-.694-.28-.398-.383-.409-1.017-.025-1.414l1.688-1.75c.384-.396 1.017-.408 1.414-.025.398.383.409 1.016.025 1.414l-1.688 1.75c-.196.202-.458.305-.72.305zM19.999 23c-.15 0-.303-.034-.446-.105-.494-.247-.694-.848-.447-1.342l1-2c.248-.494.848-.692 1.342-.447.494.247.694.848.447 1.342l-1 2c-.176.35-.529.552-.896.552zm4.002 1c-.047 0-.095-.003-.143-.01-.547-.079-.927-.585-.849-1.132l.209-1.458c.079-.547.587-.923 1.132-.849.547.079.927.585.849 1.132l-.209 1.458c-.072.5-.5.859-.989.859z"/>
+</svg>
diff --git a/public/emoji/2712_border.svg b/public/emoji/2712_border.svg
new file mode 100644
index 000000000..6e9e1c019
--- /dev/null
+++ b/public/emoji/2712_border.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M31.986 32.729c-.292.167-.626.271-.987.271-1.104 0-2-.896-2-2s.896-2 2-2 2 .896 2 2c0 .361-.104.695-.271.987l3.146 3.146L34.999 28l-9-7-5 5 7 9 7.134.876-3.147-3.147z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M13.643 5.308c1.151 1.151 1.151 3.016 0 4.167l-4.167 4.168c-1.151 1.15-3.018 1.15-4.167 0L1.141 9.475c-1.15-1.151-1.15-3.016 0-4.167l4.167-4.167c1.15-1.151 3.016-1.151 4.167 0l4.168 4.167z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M26.643 18.309L9.44 1.105 1.107 9.44l17.202 17.202c1.15 1.15 3.016 1.15 4.168 0l4.166-4.168c1.15-1.15 1.15-3.015 0-4.165z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M8.225 16.56l8.334-8.335 2.124 2.125-8.333 8.334z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#99AAB5" d="M31.986 32.729c-.292.167-.626.271-.987.271-1.104 0-2-.896-2-2s.896-2 2-2 2 .896 2 2c0 .361-.104.695-.271.987l3.146 3.146L34.999 28l-9-7-5 5 7 9 7.134.876-3.147-3.147z"/>
+  <path fill="#66757F" d="M13.643 5.308c1.151 1.151 1.151 3.016 0 4.167l-4.167 4.168c-1.151 1.15-3.018 1.15-4.167 0L1.141 9.475c-1.15-1.151-1.15-3.016 0-4.167l4.167-4.167c1.15-1.151 3.016-1.151 4.167 0l4.168 4.167z"/>
+  <path fill="#31373D" d="M26.643 18.309L9.44 1.105 1.107 9.44l17.202 17.202c1.15 1.15 3.016 1.15 4.168 0l4.166-4.168c1.15-1.15 1.15-3.015 0-4.165z"/>
+  <path fill="#66757F" d="M8.225 16.56l8.334-8.335 2.124 2.125-8.333 8.334z"/>
+</svg>
diff --git a/public/emoji/2714_border.svg b/public/emoji/2714_border.svg
new file mode 100644
index 000000000..a90dd10eb
--- /dev/null
+++ b/public/emoji/2714_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34.459 1.375c-1.391-.902-3.248-.506-4.149.884L13.5 28.17l-8.198-7.58c-1.217-1.125-3.114-1.051-4.239.166-1.125 1.216-1.051 3.115.166 4.239l10.764 9.952s.309.266.452.359c.504.328 1.07.484 1.63.484.982 0 1.945-.482 2.52-1.368L35.343 5.524c.902-1.39.506-3.248-.884-4.149z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34.459 1.375c-1.391-.902-3.248-.506-4.149.884L13.5 28.17l-8.198-7.58c-1.217-1.125-3.114-1.051-4.239.166-1.125 1.216-1.051 3.115.166 4.239l10.764 9.952s.309.266.452.359c.504.328 1.07.484 1.63.484.982 0 1.945-.482 2.52-1.368L35.343 5.524c.902-1.39.506-3.248-.884-4.149z"/>
+</svg>
diff --git a/public/emoji/2716_border.svg b/public/emoji/2716_border.svg
new file mode 100644
index 000000000..d5701be65
--- /dev/null
+++ b/public/emoji/2716_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M22.238 18.004l9.883-9.883c1.172-1.171 1.172-3.071 0-4.243-1.172-1.171-3.07-1.171-4.242 0l-9.883 9.883-9.883-9.882c-1.171-1.172-3.071-1.172-4.243 0-1.171 1.171-1.171 3.071 0 4.243l9.883 9.882-9.907 9.907c-1.171 1.171-1.171 3.071 0 4.242.585.586 1.354.879 2.121.879s1.536-.293 2.122-.879l9.906-9.906 9.882 9.882c.586.586 1.354.879 2.121.879s1.535-.293 2.121-.879c1.172-1.171 1.172-3.071 0-4.242l-9.881-9.883z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M22.238 18.004l9.883-9.883c1.172-1.171 1.172-3.071 0-4.243-1.172-1.171-3.07-1.171-4.242 0l-9.883 9.883-9.883-9.882c-1.171-1.172-3.071-1.172-4.243 0-1.171 1.171-1.171 3.071 0 4.243l9.883 9.882-9.907 9.907c-1.171 1.171-1.171 3.071 0 4.242.585.586 1.354.879 2.121.879s1.536-.293 2.122-.879l9.906-9.906 9.882 9.882c.586.586 1.354.879 2.121.879s1.535-.293 2.121-.879c1.172-1.171 1.172-3.071 0-4.242l-9.881-9.883z"/>
+</svg>
diff --git a/public/emoji/2734_border.svg b/public/emoji/2734_border.svg
new file mode 100644
index 000000000..c74c6a511
--- /dev/null
+++ b/public/emoji/2734_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M13.574 11.235c1.335.971 2.631.43 2.882-1.201l1.088-7.069c.251-1.631.661-1.631.912 0l1.088 7.069c.251 1.631 1.548 2.171 2.882 1.201l6.148-4.471c1.334-.971 1.632-.673.661.662l-4.471 6.147c-.971 1.335-.431 2.631 1.2 2.882l7.07 1.088c1.631.251 1.631.661 0 .912l-7.07 1.088c-1.631.251-2.171 1.548-1.2 2.882l4.471 6.148c.971 1.334.673 1.632-.661.661l-6.148-4.471c-1.334-.971-2.631-.431-2.882 1.2l-1.088 7.07c-.251 1.631-.661 1.631-.912 0l-1.088-7.07c-.251-1.631-1.548-2.171-2.882-1.2l-6.147 4.471c-1.334.971-1.581.713-.546-.573l5.085-6.324c1.034-1.286.542-2.523-1.092-2.748l-8.057-1.113c-1.634-.226-1.638-.62-.008-.876l7.228-1.135c1.63-.256 2.17-1.558 1.199-2.892L6.765 7.426c-.971-1.334-.673-1.632.661-.661l6.148 4.47z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M13.574 11.235c1.335.971 2.631.43 2.882-1.201l1.088-7.069c.251-1.631.661-1.631.912 0l1.088 7.069c.251 1.631 1.548 2.171 2.882 1.201l6.148-4.471c1.334-.971 1.632-.673.661.662l-4.471 6.147c-.971 1.335-.431 2.631 1.2 2.882l7.07 1.088c1.631.251 1.631.661 0 .912l-7.07 1.088c-1.631.251-2.171 1.548-1.2 2.882l4.471 6.148c.971 1.334.673 1.632-.661.661l-6.148-4.471c-1.334-.971-2.631-.431-2.882 1.2l-1.088 7.07c-.251 1.631-.661 1.631-.912 0l-1.088-7.07c-.251-1.631-1.548-2.171-2.882-1.2l-6.147 4.471c-1.334.971-1.581.713-.546-.573l5.085-6.324c1.034-1.286.542-2.523-1.092-2.748l-8.057-1.113c-1.634-.226-1.638-.62-.008-.876l7.228-1.135c1.63-.256 2.17-1.558 1.199-2.892L6.765 7.426c-.971-1.334-.673-1.632.661-.661l6.148 4.47z"/>
+</svg>
diff --git a/public/emoji/2754_border.svg b/public/emoji/2754_border.svg
new file mode 100644
index 000000000..1d6c4ecda
--- /dev/null
+++ b/public/emoji/2754_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M17 27c-1.657 0-3-1.343-3-3v-4c0-1.657 1.343-3 3-3 .603-.006 6-1 6-5 0-2-2-4-5-4-2.441 0-4 2-4 3 0 1.657-1.343 3-3 3s-3-1.343-3-3c0-4.878 4.58-9 10-9 8 0 11 5.982 11 11 0 4.145-2.277 7.313-6.413 8.92-.9.351-1.79.587-2.587.747V24c0 1.657-1.343 3-3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="17" cy="32" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#CCD6DD" d="M17 27c-1.657 0-3-1.343-3-3v-4c0-1.657 1.343-3 3-3 .603-.006 6-1 6-5 0-2-2-4-5-4-2.441 0-4 2-4 3 0 1.657-1.343 3-3 3s-3-1.343-3-3c0-4.878 4.58-9 10-9 8 0 11 5.982 11 11 0 4.145-2.277 7.313-6.413 8.92-.9.351-1.79.587-2.587.747V24c0 1.657-1.343 3-3 3z"/>
+  <circle fill="#CCD6DD" cx="17" cy="32" r="3"/>
+</svg>
diff --git a/public/emoji/2755_border.svg b/public/emoji/2755_border.svg
new file mode 100644
index 000000000..65ec57082
--- /dev/null
+++ b/public/emoji/2755_border.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <circle cx="18" cy="32" r="3" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <path d="M21 24c0 1.657-1.343 3-3 3s-3-1.343-3-3V5c0-1.657 1.343-3 3-3s3 1.343 3 3v19z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <circle fill="#CCD6DD" cx="18" cy="32" r="3"/>
+  <path fill="#CCD6DD" d="M21 24c0 1.657-1.343 3-3 3s-3-1.343-3-3V5c0-1.657 1.343-3 3-3s3 1.343 3 3v19z"/>
+</svg>
diff --git a/public/emoji/2795_border.svg b/public/emoji/2795_border.svg
new file mode 100644
index 000000000..14c2cf69b
--- /dev/null
+++ b/public/emoji/2795_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M31 15H21V5c0-1.657-1.343-3-3-3s-3 1.343-3 3v10H5c-1.657 0-3 1.343-3 3s1.343 3 3 3h10v10c0 1.657 1.343 3 3 3s3-1.343 3-3V21h10c1.657 0 3-1.343 3-3s-1.343-3-3-3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M31 15H21V5c0-1.657-1.343-3-3-3s-3 1.343-3 3v10H5c-1.657 0-3 1.343-3 3s1.343 3 3 3h10v10c0 1.657 1.343 3 3 3s3-1.343 3-3V21h10c1.657 0 3-1.343 3-3s-1.343-3-3-3z"/>
+</svg>
diff --git a/public/emoji/2796_border.svg b/public/emoji/2796_border.svg
new file mode 100644
index 000000000..6ee64cae2
--- /dev/null
+++ b/public/emoji/2796_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z"/>
+</svg>
diff --git a/public/emoji/2797_border.svg b/public/emoji/2797_border.svg
new file mode 100644
index 000000000..0bbf13ba2
--- /dev/null
+++ b/public/emoji/2797_border.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="7" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+    <circle cx="18" cy="29" r="4" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M34 18c0 1.657-1.343 3-3 3H5c-1.657 0-3-1.343-3-3s1.343-3 3-3h26c1.657 0 3 1.343 3 3z"/>
+  <circle fill="#31373D" cx="18" cy="7" r="4"/>
+  <circle fill="#31373D" cx="18" cy="29" r="4"/>
+</svg>
diff --git a/public/emoji/27b0_border.svg b/public/emoji/27b0_border.svg
new file mode 100644
index 000000000..dec79f5c6
--- /dev/null
+++ b/public/emoji/27b0_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M18 32.625c-5.09 0-10.5-3.965-10.5-11.312 0-4.877 3.365-9.178 7.591-12.272C12.393 7.739 9.756 7 8 7c-2.708 0-5.499.914-5.527.923-.79.258-1.635-.165-1.896-.951-.261-.785.163-1.633.949-1.895C1.658 5.033 4.793 4 8 4c2.695 0 6.449 1.158 10.01 3.162C21.565 5.158 25.31 4 28 4c3.207 0 6.222 1.559 6.344 1.625.781.422 1.312.699 1.125 1.266-.182.551-.891.328-1.75.234-.029-.003-2.156-.391-5.688-.391-1.752 0-4.41 1.003-7.1 2.304 4.215 3.083 7.568 7.36 7.568 12.212C28.5 28.639 23.09 32.625 18 32.625zm.013-21.954c-4.03 2.585-7.513 6.345-7.513 10.642 0 6.056 4.6 8.312 7.5 8.312 2.899 0 7.5-2.273 7.5-8.375 0-4.27-3.468-8.005-7.487-10.579z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M18 32.625c-5.09 0-10.5-3.965-10.5-11.312 0-4.877 3.365-9.178 7.591-12.272C12.393 7.739 9.756 7 8 7c-2.708 0-5.499.914-5.527.923-.79.258-1.635-.165-1.896-.951-.261-.785.163-1.633.949-1.895C1.658 5.033 4.793 4 8 4c2.695 0 6.449 1.158 10.01 3.162C21.565 5.158 25.31 4 28 4c3.207 0 6.222 1.559 6.344 1.625.781.422 1.312.699 1.125 1.266-.182.551-.891.328-1.75.234-.029-.003-2.156-.391-5.688-.391-1.752 0-4.41 1.003-7.1 2.304 4.215 3.083 7.568 7.36 7.568 12.212C28.5 28.639 23.09 32.625 18 32.625zm.013-21.954c-4.03 2.585-7.513 6.345-7.513 10.642 0 6.056 4.6 8.312 7.5 8.312 2.899 0 7.5-2.273 7.5-8.375 0-4.27-3.468-8.005-7.487-10.579z"/>
+</svg>
diff --git a/public/emoji/2b1b_border.svg b/public/emoji/2b1b_border.svg
new file mode 100644
index 000000000..b622c3510
--- /dev/null
+++ b/public/emoji/2b1b_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#31373D" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/>
+</svg>
diff --git a/public/emoji/2b1c_border.svg b/public/emoji/2b1c_border.svg
new file mode 100644
index 000000000..c633cc3de
--- /dev/null
+++ b/public/emoji/2b1c_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40">
+  <g>
+    <path d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#E6E7E8" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/>
+</svg>
diff --git a/public/emoji/3030_border.svg b/public/emoji/3030_border.svg
new file mode 100644
index 000000000..635214d15
--- /dev/null
+++ b/public/emoji/3030_border.svg
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2 -2 40 40" style="background: black;">
+  <g>
+    <path d="M27 23c-2.589 0-4.005-2.549-5.374-5.014C20.537 16.026 19.411 14 18 14c-1.412 0-2.537 2.026-3.626 3.986C13.004 20.451 11.588 23 9 23c-2.65 0-3.853-2.706-4.914-5.094C3.038 15.546 2.256 14 1 14c-.552 0-1-.448-1-1s.448-1 1-1c2.65 0 3.853 2.706 4.914 5.094C6.962 19.453 7.744 21 9 21c1.412 0 2.537-2.026 3.626-3.986C13.996 14.549 15.412 12 18 12c2.589 0 4.005 2.549 5.374 5.014C24.463 18.974 25.589 21 27 21c1.256 0 2.037-1.547 3.086-3.906C31.147 14.706 32.351 12 35 12c.553 0 1 .448 1 1s-.447 1-1 1c-1.256 0-2.037 1.546-3.086 3.906C30.853 20.294 29.649 23 27 23z" stroke="white" stroke-linejoin="round" stroke-width="4px"/>
+  </g>
+  <path fill="#292F33" d="M27 23c-2.589 0-4.005-2.549-5.374-5.014C20.537 16.026 19.411 14 18 14c-1.412 0-2.537 2.026-3.626 3.986C13.004 20.451 11.588 23 9 23c-2.65 0-3.853-2.706-4.914-5.094C3.038 15.546 2.256 14 1 14c-.552 0-1-.448-1-1s.448-1 1-1c2.65 0 3.853 2.706 4.914 5.094C6.962 19.453 7.744 21 9 21c1.412 0 2.537-2.026 3.626-3.986C13.996 14.549 15.412 12 18 12c2.589 0 4.005 2.549 5.374 5.014C24.463 18.974 25.589 21 27 21c1.256 0 2.037-1.547 3.086-3.906C31.147 14.706 32.351 12 35 12c.553 0 1 .448 1 1s-.447 1-1 1c-1.256 0-2.037 1.546-3.086 3.906C30.853 20.294 29.649 23 27 23z"/>
+</svg>
diff --git a/spec/controllers/activitypub/replies_controller_spec.rb b/spec/controllers/activitypub/replies_controller_spec.rb
index a5ed14180..d956e1b35 100644
--- a/spec/controllers/activitypub/replies_controller_spec.rb
+++ b/spec/controllers/activitypub/replies_controller_spec.rb
@@ -4,6 +4,7 @@ require 'rails_helper'
 
 RSpec.describe ActivityPub::RepliesController, type: :controller do
   let(:status) { Fabricate(:status, visibility: parent_visibility) }
+  let(:remote_reply_id) { nil }
   let(:remote_account) { nil }
 
   before do
@@ -14,6 +15,8 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
     Fabricate(:status, thread: status, visibility: :private)
     Fabricate(:status, account: status.account, thread: status, visibility: :public)
     Fabricate(:status, account: status.account, thread: status, visibility: :private)
+
+    Fabricate(:status, account: remote_account, thread: status, visibility: :public, uri: remote_reply_id) if remote_reply_id
   end
 
   describe 'GET #index' do
@@ -110,6 +113,20 @@ RSpec.describe ActivityPub::RepliesController, type: :controller do
               expect(json[:first][:items].size).to eq 2
               expect(json[:first][:items].all? { |item| item[:to].include?(ActivityPub::TagManager::COLLECTIONS[:public]) || item[:cc].include?(ActivityPub::TagManager::COLLECTIONS[:public]) }).to be true
             end
+
+            context 'with remote responses' do
+              let(:remote_reply_id) { 'foo' }
+
+              it 'returned items are all inlined local toots or are ids' do
+                json = body_as_json
+
+                expect(json[:first]).to be_a Hash
+                expect(json[:first][:items]).to be_an Array
+                expect(json[:first][:items].size).to eq 3
+                expect(json[:first][:items].all? { |item| item.is_a?(Hash) ? ActivityPub::TagManager.instance.local_uri?(item[:id]) : item.is_a?(String) }).to be true
+                expect(json[:first][:items]).to include remote_reply_id
+              end
+            end
           end
         end
 
diff --git a/spec/controllers/auth/sessions_controller_spec.rb b/spec/controllers/auth/sessions_controller_spec.rb
index 1950c173a..c387842cd 100644
--- a/spec/controllers/auth/sessions_controller_spec.rb
+++ b/spec/controllers/auth/sessions_controller_spec.rb
@@ -215,7 +215,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using a valid OTP' do
         before do
-          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id }
         end
 
         it 'redirects to home' do
@@ -230,7 +230,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
       context 'when the server has an decryption error' do
         before do
           allow_any_instance_of(User).to receive(:validate_and_consume_otp!).and_raise(OpenSSL::Cipher::CipherError)
-          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: user.current_otp } }, session: { attempt_user_id: user.id }
         end
 
         it 'shows a login error' do
@@ -244,7 +244,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using a valid recovery code' do
         before do
-          post :create, params: { user: { otp_attempt: recovery_codes.first } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: recovery_codes.first } }, session: { attempt_user_id: user.id }
         end
 
         it 'redirects to home' do
@@ -258,7 +258,7 @@ RSpec.describe Auth::SessionsController, type: :controller do
 
       context 'using an invalid OTP' do
         before do
-          post :create, params: { user: { otp_attempt: 'wrongotp' } }, session: { otp_user_id: user.id }
+          post :create, params: { user: { otp_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id }
         end
 
         it 'shows a login error' do
@@ -270,5 +270,63 @@ RSpec.describe Auth::SessionsController, type: :controller do
         end
       end
     end
+
+    context 'when 2FA is disabled and IP is unfamiliar' do
+      let!(:user) { Fabricate(:user, email: 'x@y.com', password: 'abcdefgh', current_sign_in_at: 3.weeks.ago, current_sign_in_ip: '0.0.0.0') }
+
+      before do
+        request.remote_ip  = '10.10.10.10'
+        request.user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0'
+
+        allow(UserMailer).to receive(:sign_in_token).and_return(double('email', deliver_later!: nil))
+      end
+
+      context 'using email and password' do
+        before do
+          post :create, params: { user: { email: user.email, password: user.password } }
+        end
+
+        it 'renders sign in token authentication page' do
+          expect(controller).to render_template("sign_in_token")
+        end
+
+        it 'generates sign in token' do
+          expect(user.reload.sign_in_token).to_not be_nil
+        end
+
+        it 'sends sign in token e-mail' do
+          expect(UserMailer).to have_received(:sign_in_token)
+        end
+      end
+
+      context 'using a valid sign in token' do
+        before do
+          user.generate_sign_in_token && user.save
+          post :create, params: { user: { sign_in_token_attempt: user.sign_in_token } }, session: { attempt_user_id: user.id }
+        end
+
+        it 'redirects to home' do
+          expect(response).to redirect_to(root_path)
+        end
+
+        it 'logs the user in' do
+          expect(controller.current_user).to eq user
+        end
+      end
+
+      context 'using an invalid sign in token' do
+        before do
+          post :create, params: { user: { sign_in_token_attempt: 'wrongotp' } }, session: { attempt_user_id: user.id }
+        end
+
+        it 'shows a login error' do
+          expect(flash[:alert]).to match I18n.t('users.invalid_sign_in_token')
+        end
+
+        it "doesn't log the user in" do
+          expect(controller.current_user).to be_nil
+        end
+      end
+    end
   end
 end
diff --git a/spec/fabricators/device_fabricator.rb b/spec/fabricators/device_fabricator.rb
new file mode 100644
index 000000000..b15d8248f
--- /dev/null
+++ b/spec/fabricators/device_fabricator.rb
@@ -0,0 +1,8 @@
+Fabricator(:device) do
+  access_token
+  account
+  device_id        { Faker::Number.number(digits: 5) }
+  name             { Faker::App.name }
+  fingerprint_key  { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+  identity_key     { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+end
diff --git a/spec/fabricators/encrypted_message_fabricator.rb b/spec/fabricators/encrypted_message_fabricator.rb
new file mode 100644
index 000000000..e65f66302
--- /dev/null
+++ b/spec/fabricators/encrypted_message_fabricator.rb
@@ -0,0 +1,8 @@
+Fabricator(:encrypted_message) do
+  device
+  from_account
+  from_device_id   { Faker::Number.number(digits: 5) }
+  type             0
+  body             ""
+  message_franking ""
+end
diff --git a/spec/fabricators/one_time_key_fabricator.rb b/spec/fabricators/one_time_key_fabricator.rb
new file mode 100644
index 000000000..8794baeb5
--- /dev/null
+++ b/spec/fabricators/one_time_key_fabricator.rb
@@ -0,0 +1,11 @@
+Fabricator(:one_time_key) do
+  device
+  key_id { Faker::Alphanumeric.alphanumeric(number: 10) }
+  key    { Base64.strict_encode64(Ed25519::SigningKey.generate.verify_key.to_bytes) }
+
+  signature do |attrs|
+    signing_key = Ed25519::SigningKey.generate
+    attrs[:device].update(fingerprint_key: Base64.strict_encode64(signing_key.verify_key.to_bytes))
+    Base64.strict_encode64(signing_key.sign(attrs[:key]))
+  end
+end
diff --git a/spec/fabricators/system_key_fabricator.rb b/spec/fabricators/system_key_fabricator.rb
new file mode 100644
index 000000000..f808495e0
--- /dev/null
+++ b/spec/fabricators/system_key_fabricator.rb
@@ -0,0 +1,3 @@
+Fabricator(:system_key) do
+
+end
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index 5220deabb..2ac4acc12 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -579,6 +579,62 @@ RSpec.describe ActivityPub::Activity::Create do
       end
     end
 
+    context 'with an encrypted message' do
+      let(:recipient) { Fabricate(:account) }
+      let(:target_device) { Fabricate(:device, account: recipient) }
+
+      subject { described_class.new(json, sender, delivery: true, delivered_to_account_id: recipient.id) }
+
+      let(:object_json) do
+        {
+          id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+          type: 'EncryptedMessage',
+          attributedTo: {
+            type: 'Device',
+            deviceId: '1234',
+          },
+          to: {
+            type: 'Device',
+            deviceId: target_device.device_id,
+          },
+          messageType: 1,
+          cipherText: 'Foo',
+          messageFranking: 'Baz678',
+          digest: {
+            digestAlgorithm: 'Bar456',
+            digestValue: 'Foo123',
+          },
+        }
+      end
+
+      before do
+        subject.perform
+      end
+
+      it 'creates an encrypted message' do
+        encrypted_message = target_device.encrypted_messages.reload.first
+
+        expect(encrypted_message).to_not be_nil
+        expect(encrypted_message.from_device_id).to eq '1234'
+        expect(encrypted_message.from_account).to eq sender
+        expect(encrypted_message.type).to eq 1
+        expect(encrypted_message.body).to eq 'Foo'
+        expect(encrypted_message.digest).to eq 'Foo123'
+      end
+
+      it 'creates a message franking' do
+        encrypted_message = target_device.encrypted_messages.reload.first
+        message_franking  = encrypted_message.message_franking
+
+        crypt = ActiveSupport::MessageEncryptor.new(SystemKey.current_key, serializer: Oj)
+        json  = crypt.decrypt_and_verify(message_franking)
+
+        expect(json['source_account_id']).to eq sender.id
+        expect(json['target_account_id']).to eq recipient.id
+        expect(json['original_franking']).to eq 'Baz678'
+      end
+    end
+
     context 'when sender is followed by local users' do
       subject { described_class.new(json, sender, delivery: true) }
 
diff --git a/spec/mailers/previews/user_mailer_preview.rb b/spec/mailers/previews/user_mailer_preview.rb
index 464f177d0..313666412 100644
--- a/spec/mailers/previews/user_mailer_preview.rb
+++ b/spec/mailers/previews/user_mailer_preview.rb
@@ -59,4 +59,9 @@ class UserMailerPreview < ActionMailer::Preview
   def warning
     UserMailer.warning(User.first, AccountWarning.new(text: '', action: :silence), [Status.first.id])
   end
+
+  # Preview this email at http://localhost:3000/rails/mailers/user_mailer/sign_in_token
+  def sign_in_token
+    UserMailer.sign_in_token(User.first.tap { |user| user.generate_sign_in_token }, '127.0.0.1', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0', Time.now.utc)
+  end
 end
diff --git a/spec/models/device_spec.rb b/spec/models/device_spec.rb
new file mode 100644
index 000000000..f56fbf978
--- /dev/null
+++ b/spec/models/device_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Device, type: :model do
+
+end
diff --git a/spec/models/encrypted_message_spec.rb b/spec/models/encrypted_message_spec.rb
new file mode 100644
index 000000000..1238d57b6
--- /dev/null
+++ b/spec/models/encrypted_message_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe EncryptedMessage, type: :model do
+
+end
diff --git a/spec/models/one_time_key_spec.rb b/spec/models/one_time_key_spec.rb
new file mode 100644
index 000000000..34598334c
--- /dev/null
+++ b/spec/models/one_time_key_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe OneTimeKey, type: :model do
+
+end
diff --git a/spec/models/system_key_spec.rb b/spec/models/system_key_spec.rb
new file mode 100644
index 000000000..a138bc131
--- /dev/null
+++ b/spec/models/system_key_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe SystemKey, type: :model do
+
+end
diff --git a/spec/services/clear_domain_media_service_spec.rb b/spec/services/clear_domain_media_service_spec.rb
new file mode 100644
index 000000000..8e58c6039
--- /dev/null
+++ b/spec/services/clear_domain_media_service_spec.rb
@@ -0,0 +1,23 @@
+require 'rails_helper'
+
+RSpec.describe ClearDomainMediaService, type: :service do
+  let!(:bad_account) { Fabricate(:account, username: 'badguy666', domain: 'evil.org') }
+  let!(:bad_status1) { Fabricate(:status, account: bad_account, text: 'You suck') }
+  let!(:bad_status2) { Fabricate(:status, account: bad_account, text: 'Hahaha') }
+  let!(:bad_attachment) { Fabricate(:media_attachment, account: bad_account, status: bad_status2, file: attachment_fixture('attachment.jpg')) }
+
+  subject { ClearDomainMediaService.new }
+
+  describe 'for a silence with reject media' do
+    before do
+      subject.call(DomainBlock.create!(domain: 'evil.org', severity: :silence, reject_media: true))
+    end
+
+    it 'leaves the domains status and attachements, but clears media' do
+      expect { bad_status1.reload }.not_to raise_error
+      expect { bad_status2.reload }.not_to raise_error
+      expect { bad_attachment.reload }.not_to raise_error
+      expect(bad_attachment.file.exists?).to be false
+    end
+  end
+end
diff --git a/spec/workers/domain_block_worker_spec.rb b/spec/workers/domain_block_worker_spec.rb
index 48b3e38c4..bd8fc4a62 100644
--- a/spec/workers/domain_block_worker_spec.rb
+++ b/spec/workers/domain_block_worker_spec.rb
@@ -8,7 +8,7 @@ describe DomainBlockWorker do
   describe 'perform' do
     let(:domain_block) { Fabricate(:domain_block) }
 
-    it 'returns true for non-existent domain block' do
+    it 'calls domain block service for relevant domain block' do
       service = double(call: nil)
       allow(BlockDomainService).to receive(:new).and_return(service)
       result = subject.perform(domain_block.id)
@@ -17,7 +17,7 @@ describe DomainBlockWorker do
       expect(service).to have_received(:call).with(domain_block, false)
     end
 
-    it 'calls domain block service for relevant domain block' do
+    it 'returns true for non-existent domain block' do
       result = subject.perform('aaa')
 
       expect(result).to eq(true)
diff --git a/spec/workers/domain_clear_media_worker_spec.rb b/spec/workers/domain_clear_media_worker_spec.rb
new file mode 100644
index 000000000..36251b1ec
--- /dev/null
+++ b/spec/workers/domain_clear_media_worker_spec.rb
@@ -0,0 +1,26 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe DomainClearMediaWorker do
+  subject { described_class.new }
+
+  describe 'perform' do
+    let(:domain_block) { Fabricate(:domain_block, severity: :silence, reject_media: true) }
+
+    it 'calls domain clear media service for relevant domain block' do
+      service = double(call: nil)
+      allow(ClearDomainMediaService).to receive(:new).and_return(service)
+      result = subject.perform(domain_block.id)
+
+      expect(result).to be_nil
+      expect(service).to have_received(:call).with(domain_block)
+    end
+
+    it 'returns true for non-existent domain block' do
+      result = subject.perform('aaa')
+
+      expect(result).to eq(true)
+    end
+  end
+end
diff --git a/streaming/index.js b/streaming/index.js
index b70339c30..f1d0ed5c0 100644
--- a/streaming/index.js
+++ b/streaming/index.js
@@ -144,13 +144,21 @@ const startWorker = (workerId) => {
     callbacks.forEach(callback => callback(message));
   });
 
-  const subscriptionHeartbeat = (channel) => {
-    const interval = 6*60;
+  const subscriptionHeartbeat = channels => {
+    if (!Array.isArray(channels)) {
+      channels = [channels];
+    }
+
+    const interval = 6 * 60;
+
     const tellSubscribed = () => {
-      redisClient.set(`${redisPrefix}subscribed:${channel}`, '1', 'EX', interval*3);
+      channels.forEach(channel => redisClient.set(`${redisPrefix}subscribed:${channel}`, '1', 'EX', interval * 3));
     };
+
     tellSubscribed();
-    const heartbeat = setInterval(tellSubscribed, interval*1000);
+
+    const heartbeat = setInterval(tellSubscribed, interval * 1000);
+
     return () => {
       clearInterval(heartbeat);
     };
@@ -203,7 +211,7 @@ const startWorker = (workerId) => {
         return;
       }
 
-      client.query('SELECT oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token], (err, result) => {
+      client.query('SELECT oauth_access_tokens.resource_owner_id, users.account_id, users.chosen_languages, oauth_access_tokens.scopes, devices.device_id FROM oauth_access_tokens INNER JOIN users ON oauth_access_tokens.resource_owner_id = users.id LEFT OUTER JOIN devices ON oauth_access_tokens.id = devices.access_token_id WHERE oauth_access_tokens.token = $1 AND oauth_access_tokens.revoked_at IS NULL LIMIT 1', [token], (err, result) => {
         done();
 
         if (err) {
@@ -232,6 +240,7 @@ const startWorker = (workerId) => {
         req.accountId = result.rows[0].account_id;
         req.chosenLanguages = result.rows[0].chosen_languages;
         req.allowNotifications = scopes.some(scope => ['read', 'read:notifications'].includes(scope));
+        req.deviceId = result.rows[0].device_id;
 
         next();
       });
@@ -353,11 +362,15 @@ const startWorker = (workerId) => {
     });
   };
 
-  const streamFrom = (id, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false) => {
-    const accountId = req.accountId || req.remoteAddress;
-
+  const streamFrom = (ids, req, output, attachCloseHandler, needsFiltering = false, notificationOnly = false) => {
+    const accountId  = req.accountId || req.remoteAddress;
     const streamType = notificationOnly ? ' (notification)' : '';
-    log.verbose(req.requestId, `Starting stream from ${id} for ${accountId}${streamType}`);
+
+    if (!Array.isArray(ids)) {
+      ids = [ids];
+    }
+
+    log.verbose(req.requestId, `Starting stream from ${ids.join(', ')} for ${accountId}${streamType}`);
 
     const listener = message => {
       const { event, payload, queued_at } = JSON.parse(message);
@@ -436,8 +449,11 @@ const startWorker = (workerId) => {
       });
     };
 
-    subscribe(`${redisPrefix}${id}`, listener);
-    attachCloseHandler(`${redisPrefix}${id}`, listener);
+    ids.forEach(id => {
+      subscribe(`${redisPrefix}${id}`, listener);
+    });
+
+    attachCloseHandler(ids.map(id => `${redisPrefix}${id}`), listener);
   };
 
   // Setup stream output to HTTP
@@ -464,9 +480,16 @@ const startWorker = (workerId) => {
   };
 
   // Setup stream end for HTTP
-  const streamHttpEnd = (req, closeHandler = false) => (id, listener) => {
+  const streamHttpEnd = (req, closeHandler = false) => (ids, listener) => {
+    if (!Array.isArray(ids)) {
+      ids = [ids];
+    }
+
     req.on('close', () => {
-      unsubscribe(id, listener);
+      ids.forEach(id => {
+        unsubscribe(id, listener);
+      });
+
       if (closeHandler) {
         closeHandler();
       }
@@ -522,8 +545,13 @@ const startWorker = (workerId) => {
   app.use(errorMiddleware);
 
   app.get('/api/v1/streaming/user', (req, res) => {
-    const channel = `timeline:${req.accountId}`;
-    streamFrom(channel, req, streamToHttp(req, res), streamHttpEnd(req, subscriptionHeartbeat(channel)));
+    const channels = [`timeline:${req.accountId}`];
+
+    if (req.deviceId) {
+      channels.push(`timeline:${req.accountId}:${req.deviceId}`);
+    }
+
+    streamFrom(channels, req, streamToHttp(req, res), streamHttpEnd(req, subscriptionHeartbeat(channels)));
   });
 
   app.get('/api/v1/streaming/user/notification', (req, res) => {
@@ -603,7 +631,12 @@ const startWorker = (workerId) => {
 
     switch(location.query.stream) {
     case 'user':
-      channel = `timeline:${req.accountId}`;
+      channel = [`timeline:${req.accountId}`];
+
+      if (req.deviceId) {
+        channel.push(`timeline:${req.accountId}:${req.deviceId}`);
+      }
+
       streamFrom(channel, req, streamToWs(req, ws), streamWsEnd(req, ws, subscriptionHeartbeat(channel)));
       break;
     case 'user:notification':
diff --git a/yarn.lock b/yarn.lock
index 08dfacf7a..e910604c6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,35 +2,35 @@
 # yarn lockfile v1
 
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
-  integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz#d5481c5095daa1c57e16e54c6f9198443afb49ff"
+  integrity sha512-IGhtTmpjGbYzcEDOw7DcQtbQSXcG9ftmAXtWTu9V936vDye4xjjekktFAtgZsWpzTj/X01jocB46mTywm/4SZw==
   dependencies:
-    "@babel/highlight" "^7.8.3"
+    "@babel/highlight" "^7.10.1"
 
-"@babel/compat-data@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b"
-  integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g==
+"@babel/compat-data@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz#b1085ffe72cd17bf2c0ee790fc09f9626011b2db"
+  integrity sha512-CHvCj7So7iCkGKPRFUfryXIkU2gSBw7VSZFYLsqVhrS47269VK2Hfi9S/YcublPMW8k1u2bQBlbDruoQEm4fgw==
   dependencies:
-    browserslist "^4.11.1"
+    browserslist "^4.12.0"
     invariant "^2.2.4"
     semver "^5.5.0"
 
-"@babel/core@^7.1.0", "@babel/core@^7.7.2", "@babel/core@^7.7.5", "@babel/core@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376"
-  integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/generator" "^7.9.6"
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helpers" "^7.9.6"
-    "@babel/parser" "^7.9.6"
-    "@babel/template" "^7.8.6"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+"@babel/core@^7.1.0", "@babel/core@^7.10.2", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz#bd6786046668a925ac2bd2fd95b579b92a23b36a"
+  integrity sha512-KQmV9yguEjQsXqyOUGKjS4+3K8/DlOCE2pZcq4augdQmtTy5iv5EHtmMSJ7V4c1BIPjuwtZYqYLCq9Ga+hGBRQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/generator" "^7.10.2"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helpers" "^7.10.1"
+    "@babel/parser" "^7.10.2"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.2"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.1"
@@ -40,59 +40,71 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43"
-  integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==
+"@babel/generator@^7.10.1", "@babel/generator@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz#0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9"
+  integrity sha512-AxfBNHNu99DTMvlUPlt1h2+Hn7knPpH5ayJ8OqDWSeLld+Fi2AYBTC/IejWDM9Edcii4UzZRCsbUt0WlSDsDsA==
   dependencies:
-    "@babel/types" "^7.9.6"
+    "@babel/types" "^7.10.2"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
 
-"@babel/helper-annotate-as-pure@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee"
-  integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==
+"@babel/helper-annotate-as-pure@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz#f6d08acc6f70bbd59b436262553fb2e259a1a268"
+  integrity sha512-ewp3rvJEwLaHgyWGe4wQssC2vjks3E80WiUe2BpMb0KhreTjMROCbxXcEovTrbeGVdQct5VjQfrv9EgC+xMzCw==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz#c84097a427a061ac56a1c30ebf54b7b22d241503"
-  integrity sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz#0ec7d9be8174934532661f87783eb18d72290059"
+  integrity sha512-cQpVq48EkYxUU0xozpGCLla3wlkdRRqLWu1ksFMXA9CM5KQmyyRpSEsYXbao7JUkOw/tAaYKCaYyZq6HOFYtyw==
   dependencies:
-    "@babel/helper-explode-assignable-expression" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-explode-assignable-expression" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-builder-react-jsx-experimental@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43"
-  integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ==
+"@babel/helper-builder-react-jsx-experimental@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.1.tgz#9a7d58ad184d3ac3bafb1a452cec2bad7e4a0bc8"
+  integrity sha512-irQJ8kpQUV3JasXPSFQ+LCCtJSc5ceZrPFVj6TElR6XCHssi3jV8ch3odIrNtjJFRZZVbrOEfJMI79TPU/h1pQ==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/types" "^7.9.0"
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-builder-react-jsx@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32"
-  integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==
+"@babel/helper-builder-react-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.1.tgz#a327f0cf983af5554701b1215de54a019f09b532"
+  integrity sha512-KXzzpyWhXgzjXIlJU1ZjIXzUPdej1suE6vzqgImZ/cpAsR/CC8gUcX4EWRmDfWz/cs6HOCPMBIJ3nKoXt3BFuw==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/types" "^7.9.0"
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-compilation-targets@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a"
-  integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw==
+"@babel/helper-compilation-targets@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz#a17d9723b6e2c750299d2a14d4637c76936d8285"
+  integrity sha512-hYgOhF4To2UTB4LTaZepN/4Pl9LD4gfbJx8A34mqoluT8TLbof1mhUlYuNWTEebONa8+UlCC4X0TEXu7AOUyGA==
   dependencies:
-    "@babel/compat-data" "^7.9.6"
-    browserslist "^4.11.1"
+    "@babel/compat-data" "^7.10.1"
+    browserslist "^4.12.0"
     invariant "^2.2.4"
     levenary "^1.1.1"
     semver "^5.5.0"
 
+"@babel/helper-create-class-features-plugin@^7.10.1":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz#7474295770f217dbcf288bf7572eb213db46ee67"
+  integrity sha512-5C/QhkGFh1vqcziq1vAL6SI9ymzUp8BCYjFpvYVhWP4DlATIb3u5q3iUd35mvlyGs8fO7hckkW7i0tmH+5+bvQ==
+  dependencies:
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-member-expression-to-functions" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+
 "@babel/helper-create-class-features-plugin@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz#5b94be88c255f140fd2c10dd151e7f98f4bff397"
@@ -105,6 +117,15 @@
     "@babel/helper-replace-supers" "^7.8.3"
     "@babel/helper-split-export-declaration" "^7.8.3"
 
+"@babel/helper-create-regexp-features-plugin@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz#1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd"
+  integrity sha512-Rx4rHS0pVuJn5pJOqaqcZR4XSgeF9G/pO/79t+4r7380tXFJdzImFnxMU19f83wjSrmKHq6myrM10pFHTGzkUA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-regex" "^7.10.1"
+    regexpu-core "^4.7.0"
+
 "@babel/helper-create-regexp-features-plugin@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz#c774268c95ec07ee92476a3862b75cc2839beb79"
@@ -113,31 +134,31 @@
     "@babel/helper-regex" "^7.8.3"
     regexpu-core "^4.6.0"
 
-"@babel/helper-create-regexp-features-plugin@^7.8.8":
-  version "7.8.8"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz#5d84180b588f560b7864efaeea89243e58312087"
-  integrity sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==
+"@babel/helper-define-map@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz#5e69ee8308648470dd7900d159c044c10285221d"
+  integrity sha512-+5odWpX+OnvkD0Zmq7panrMuAGQBu6aPUgvMzuMGo4R+jUOvealEj2hiqI6WhxgKrTpFoFj0+VdsuA8KDxHBDg==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-regex" "^7.8.3"
-    regexpu-core "^4.7.0"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/types" "^7.10.1"
+    lodash "^4.17.13"
 
-"@babel/helper-define-map@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15"
-  integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==
+"@babel/helper-explode-assignable-expression@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz#e9d76305ee1162ca467357ae25df94f179af2b7e"
+  integrity sha512-vcUJ3cDjLjvkKzt6rHrl767FeE7pMEYfPanq5L16GRtrXIoznc0HykNW2aEYkcnP76P0isoqJ34dDMFZwzEpJg==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/types" "^7.8.3"
-    lodash "^4.17.13"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-explode-assignable-expression@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz#a728dc5b4e89e30fc2dfc7d04fa28a930653f982"
-  integrity sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==
+"@babel/helper-function-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz#92bd63829bfc9215aca9d9defa85f56b539454f4"
+  integrity sha512-fcpumwhs3YyZ/ttd5Rz0xn0TpIwVkN7X0V38B9TWNfVF42KEkhkAAuPCQ3oXmtTRtiPJrmZ0TrfS0GKF0eMaRQ==
   dependencies:
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-function-name@^7.8.3":
   version "7.8.3"
@@ -148,14 +169,12 @@
     "@babel/template" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-function-name@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c"
-  integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==
+"@babel/helper-get-function-arity@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz#7303390a81ba7cb59613895a192b93850e373f7d"
+  integrity sha512-F5qdXkYGOQUb0hpRaPoetF9AnsXknKjWMZ+wmsIRsp5ge5sFh4c3h1eH2pRTTuy9KKAA2+TTYomGXAtEL2fQEw==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/types" "^7.9.5"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-get-function-arity@^7.8.3":
   version "7.8.3"
@@ -164,12 +183,19 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-hoist-variables@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz#1dbe9b6b55d78c9b4183fc8cdc6e30ceb83b7134"
-  integrity sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==
+"@babel/helper-hoist-variables@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz#7e77c82e5dcae1ebf123174c385aaadbf787d077"
+  integrity sha512-vLm5srkU8rI6X3+aQ1rQJyfjvCBLXP8cAGeuw04zeAM2ItKb1e7pmVmLyHb4sDaAYnLL13RHOZPLEtcGZ5xvjg==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
+
+"@babel/helper-member-expression-to-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz#432967fd7e12a4afef66c4687d4ca22bc0456f15"
+  integrity sha512-u7XLXeM2n50gb6PWJ9hoO5oO7JFPaZtrh35t8RqKLT1jFKj9IWeD1zrcrYp1q1qiZTdEarfDWfTIP8nGsu0h5g==
+  dependencies:
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-member-expression-to-functions@^7.8.3":
   version "7.8.3"
@@ -178,26 +204,33 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498"
-  integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz#dd331bd45bccc566ce77004e9d05fe17add13876"
+  integrity sha512-SFxgwYmZ3HZPyZwJRiVNLRHWuW2OgE5k2nrVs6D9Iv4PPnXVffuEHy83Sfx/l4SqF+5kyJXjAyUmrG7tNm+qVg==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-module-transforms@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5"
-  integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==
+"@babel/helper-module-transforms@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz#24e2f08ee6832c60b157bb0936c86bef7210c622"
+  integrity sha512-RLHRCAzyJe7Q7sF4oy2cB+kRnU4wDZY/H2xJFGof+M+SJEGhZsb+GFj5j1AD8NiSaVBJ+Pf0/WObiXu/zxWpFg==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.6"
-    "@babel/helper-simple-access" "^7.8.3"
-    "@babel/helper-split-export-declaration" "^7.8.3"
-    "@babel/template" "^7.8.6"
-    "@babel/types" "^7.9.0"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-simple-access" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
     lodash "^4.17.13"
 
+"@babel/helper-optimise-call-expression@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz#b4a1f2561870ce1247ceddb02a3860fa96d72543"
+  integrity sha512-a0DjNS1prnBsoKx83dP2falChcs7p3i8VMzdrSbfLhuQra/2ENC4sbri34dz/rWmDADsmF1q5GbfaXydh0Jbjg==
+  dependencies:
+    "@babel/types" "^7.10.1"
+
 "@babel/helper-optimise-call-expression@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
@@ -205,10 +238,17 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
-  integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.1", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz#ec5a5cf0eec925b66c60580328b122c01230a127"
+  integrity sha512-fvoGeXt0bJc7VMWZGCAEBEMo/HAjW2mP8apF5eXK0wSqwLAVHAISCWRoLMBMUs2kqeaG77jltVqu4Hn8Egl3nA==
+
+"@babel/helper-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz#021cf1a7ba99822f993222a001cc3fec83255b96"
+  integrity sha512-7isHr19RsIJWWLLFn21ubFt223PjQyg1HY7CZEMRr820HttHPpVvrsIN3bUOo44DEfFV4kBXO7Abbn9KTUZV7g==
+  dependencies:
+    lodash "^4.17.13"
 
 "@babel/helper-regex@^7.8.3":
   version "7.8.3"
@@ -217,16 +257,26 @@
   dependencies:
     lodash "^4.17.13"
 
-"@babel/helper-remap-async-to-generator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz#273c600d8b9bf5006142c1e35887d555c12edd86"
-  integrity sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==
+"@babel/helper-remap-async-to-generator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz#bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432"
+  integrity sha512-RfX1P8HqsfgmJ6CwaXGKMAqbYdlleqglvVtht0HGPMSsy2V6MqLlOJVF/0Qyb/m2ZCi2z3q3+s6Pv7R/dQuZ6A==
   dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-wrap-function" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-wrap-function" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
+
+"@babel/helper-replace-supers@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz#ec6859d20c5d8087f6a2dc4e014db7228975f13d"
+  integrity sha512-SOwJzEfpuQwInzzQJGjGaiG578UYmyi2Xw668klPWV5n07B73S0a9btjLk/52Mlcxa+5AdIYqws1KyXRfMoB7A==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-replace-supers@^7.8.3":
   version "7.8.3"
@@ -238,23 +288,20 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-replace-supers@^7.8.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444"
-  integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA==
+"@babel/helper-simple-access@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz#08fb7e22ace9eb8326f7e3920a1c2052f13d851e"
+  integrity sha512-VSWpWzRzn9VtgMJBIWTZ+GP107kZdQ4YplJlCmIrjoLVSi/0upixezHCDG8kpPVTBJpKfxTH01wDhh+jS2zKbw==
   dependencies:
-    "@babel/helper-member-expression-to-functions" "^7.8.3"
-    "@babel/helper-optimise-call-expression" "^7.8.3"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+    "@babel/template" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helper-simple-access@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
-  integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==
+"@babel/helper-split-export-declaration@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz#c6f4be1cbc15e3a868e4c64a17d5d31d754da35f"
+  integrity sha512-UQ1LVBPrYdbchNhLwj6fetj46BcFwfS4NllJo/1aJsT+1dLTEnXJL0qHqtY7gPzF8S2fXBJamf1biAXV3X077g==
   dependencies:
-    "@babel/template" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.1"
 
 "@babel/helper-split-export-declaration@^7.8.3":
   version "7.8.3"
@@ -263,60 +310,60 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80"
-  integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==
+"@babel/helper-validator-identifier@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz#5770b0c1a826c4f53f5ede5e153163e0318e94b5"
+  integrity sha512-5vW/JXLALhczRCWP0PnFDMCJAchlBvM7f4uk/jXritBnIa6E1KmqmtrS3yn1LAnxFBypQ3eneLuXjsnfQsgILw==
 
-"@babel/helper-wrap-function@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz#9dbdb2bb55ef14aaa01fe8c99b629bd5352d8610"
-  integrity sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==
+"@babel/helper-wrap-function@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz#956d1310d6696257a7afd47e4c42dfda5dfcedc9"
+  integrity sha512-C0MzRGteVDn+H32/ZgbAv5r56f2o1fZSA/rj/TYo8JEJNHg+9BdSmKBUND0shxWRztWhjlT2cvHYuynpPsVJwQ==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/helpers@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580"
-  integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw==
+"@babel/helpers@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz#a6827b7cb975c9d9cef5fd61d919f60d8844a973"
+  integrity sha512-muQNHF+IdU6wGgkaJyhhEmI54MOZBKsFfsXFhboz1ybwJ1Kl7IHlbm2a++4jwrmY5UYsgitt5lfqo1wMFcHmyw==
   dependencies:
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.9.6"
-    "@babel/types" "^7.9.6"
+    "@babel/template" "^7.10.1"
+    "@babel/traverse" "^7.10.1"
+    "@babel/types" "^7.10.1"
 
-"@babel/highlight@^7.8.3":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079"
-  integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==
+"@babel/highlight@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz#841d098ba613ba1a427a2b383d79e35552c38ae0"
+  integrity sha512-8rMof+gVP8mxYZApLF/JgNDAkdKa+aJt3ZYxF8z6+j/hpeXL7iMsKCPHa2jNMHu/qqBwzQF4OHNoYi8dMA/rYg==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.9.0"
+    "@babel/helper-validator-identifier" "^7.10.1"
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7"
-  integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==
+"@babel/parser@^7.1.0", "@babel/parser@^7.10.1", "@babel/parser@^7.10.2", "@babel/parser@^7.7.0":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz#871807f10442b92ff97e4783b9b54f6a0ca812d0"
+  integrity sha512-PApSXlNMJyB4JiGVhCOlzKIif+TKFTvu0aQAhnTvfP/z3vVSN6ZypH5bfUNwFXXjRQtUEBNFd2PtmCmG2Py3qQ==
 
-"@babel/plugin-proposal-async-generator-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
-  integrity sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==
+"@babel/plugin-proposal-async-generator-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz#6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55"
+  integrity sha512-vzZE12ZTdB336POZjmpblWfNNRpMSua45EYnRigE2XsZxcXcIyly2ixnTJasJE4Zq3U7t2d8rRF7XRUuzHxbOw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-remap-async-to-generator" "^7.10.1"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
 
-"@babel/plugin-proposal-class-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e"
-  integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==
+"@babel/plugin-proposal-class-properties@^7.10.1", "@babel/plugin-proposal-class-properties@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz#046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01"
+  integrity sha512-sqdGWgoXlnOdgMXU+9MbhzwFRgxVLeiGBqTrnuS7LC2IBU31wSsESbTUreT2O418obpfPdGUR2GbEufZF1bpqw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-class-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-proposal-decorators@^7.8.3":
   version "7.8.3"
@@ -327,70 +374,78 @@
     "@babel/helper-plugin-utils" "^7.8.3"
     "@babel/plugin-syntax-decorators" "^7.8.3"
 
-"@babel/plugin-proposal-dynamic-import@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz#38c4fe555744826e97e2ae930b0fb4cc07e66054"
-  integrity sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==
+"@babel/plugin-proposal-dynamic-import@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz#e36979dc1dc3b73f6d6816fc4951da2363488ef0"
+  integrity sha512-Cpc2yUVHTEGPlmiQzXj026kqwjEQAD9I4ZC16uzdbgWgitg/UHKHLffKNCQZ5+y8jpIZPJcKcwsr2HwPh+w3XA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
 
-"@babel/plugin-proposal-json-strings@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz#da5216b238a98b58a1e05d6852104b10f9a70d6b"
-  integrity sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==
+"@babel/plugin-proposal-json-strings@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz#b1e691ee24c651b5a5e32213222b2379734aff09"
+  integrity sha512-m8r5BmV+ZLpWPtMY2mOKN7wre6HIO4gfIiV+eOmsnZABNenrt/kzYBwrh+KOfgumSWpnlGs5F70J8afYMSJMBg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
 
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2"
-  integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz#02dca21673842ff2fe763ac253777f235e9bbf78"
+  integrity sha512-56cI/uHYgL2C8HVuHOuvVowihhX0sxb3nnfVRzUeVHTWmRHTZrKuAh/OBIMggGU/S1g/1D2CRCXqP+3u7vX7iA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
 
-"@babel/plugin-proposal-numeric-separator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz#5d6769409699ec9b3b68684cd8116cedff93bad8"
-  integrity sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==
+"@babel/plugin-proposal-numeric-separator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz#a9a38bc34f78bdfd981e791c27c6fdcec478c123"
+  integrity sha512-jjfym4N9HtCiNfyyLAVD8WqPYeHUrw4ihxuAynWj6zzp2gf9Ey2f7ImhFm6ikB3CLf5Z/zmcJDri6B4+9j9RsA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
 
-"@babel/plugin-proposal-object-rest-spread@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63"
-  integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A==
+"@babel/plugin-proposal-object-rest-spread@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz#cba44908ac9f142650b4a65b8aa06bf3478d5fb6"
+  integrity sha512-Z+Qri55KiQkHh7Fc4BW6o+QBuTagbOp9txE+4U1i79u9oWlf2npkiDx+Rf3iK3lbcHBuNy9UOkwuR5wOMH3LIQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
-    "@babel/plugin-transform-parameters" "^7.9.5"
+    "@babel/plugin-transform-parameters" "^7.10.1"
 
-"@babel/plugin-proposal-optional-catch-binding@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz#9dee96ab1650eed88646ae9734ca167ac4a9c5c9"
-  integrity sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==
+"@babel/plugin-proposal-optional-catch-binding@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz#c9f86d99305f9fa531b568ff5ab8c964b8b223d2"
+  integrity sha512-VqExgeE62YBqI3ogkGoOJp1R6u12DFZjqwJhqtKc2o5m1YTUuUWnos7bZQFBhwkxIFpWYJ7uB75U7VAPPiKETA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
 
-"@babel/plugin-proposal-optional-chaining@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58"
-  integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==
+"@babel/plugin-proposal-optional-chaining@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz#15f5d6d22708629451a91be28f8facc55b0e818c"
+  integrity sha512-dqQj475q8+/avvok72CF3AOSV/SGEcH29zT5hhohqqvvZ2+boQoOr7iGldBG5YXTO2qgCgc2B3WvVLUdbeMlGA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3":
-  version "7.8.8"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz#ee3a95e90cdc04fe8cd92ec3279fa017d68a0d1d"
-  integrity sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==
+"@babel/plugin-proposal-private-methods@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz#ed85e8058ab0fe309c3f448e5e1b73ca89cdb598"
+  integrity sha512-RZecFFJjDiQ2z6maFprLgrdnm0OzoC23Mx89xf1CcEsxmHuzuXOdniEuI+S3v7vjQG4F5sa6YtUp+19sZuSxHg==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.8"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-class-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.10.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz#dc04feb25e2dd70c12b05d680190e138fa2c0c6f"
+  integrity sha512-JjfngYRvwmPwmnbRZyNiPFI8zxCZb8euzbCG/LxyKdeTb59tVciKo9GK9bi6JYKInk1H11Dq9j/zRqIH4KigfQ==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4":
   version "7.8.4"
@@ -406,12 +461,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-class-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7"
-  integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg==
+"@babel/plugin-syntax-class-properties@^7.10.1", "@babel/plugin-syntax-class-properties@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz#d5bc0645913df5b17ad7eda0fa2308330bde34c5"
+  integrity sha512-Gf2Yx/iRs1JREDtVZ56OrjjgFHCaldpTnuy9BHla10qyVT3YkIIGEtoDWhyop0ksu1GvNjHIoYRBqm3zoR1jyQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-decorators@^7.8.3":
   version "7.8.3"
@@ -434,19 +489,19 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
-  integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==
+"@babel/plugin-syntax-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz#0ae371134a42b91d5418feb3c8c8d43e1565d2da"
+  integrity sha512-+OxyOArpVFXQeXKLO9o+r2I4dIoVoy6+Uu0vKELrlweDM3QJADZj+Z+5ERansZqIZBcLj42vHnDI8Rz9BnRIuQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897"
-  integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg==
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.1.tgz#fffee77b4934ce77f3b427649ecdddbec1958550"
+  integrity sha512-XyHIFa9kdrgJS91CUH+ccPVTnJShr8nLGc5bG2IhGXv5p1Rd+8BleGE5yzIg2Nc1QZAdHDa0Qp4m6066OL96Iw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
   version "7.8.3"
@@ -455,12 +510,12 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-numeric-separator@^7.8.0", "@babel/plugin-syntax-numeric-separator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f"
-  integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==
+"@babel/plugin-syntax-numeric-separator@^7.10.1", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz#25761ee7410bc8cf97327ba741ee94e4a61b7d99"
+  integrity sha512-uTd0OsHrpe3tH5gRPTxG8Voh99/WCU78vIm5NMRYPAqC8lR4vajt6KkCAknCHrx24vkPdd/05yfdGSB4EIY2mg==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3":
   version "7.8.3"
@@ -483,160 +538,160 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-top-level-await@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz#3acdece695e6b13aaf57fc291d1a800950c71391"
-  integrity sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==
+"@babel/plugin-syntax-top-level-await@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz#8b8733f8c57397b3eaa47ddba8841586dcaef362"
+  integrity sha512-hgA5RYkmZm8FTFT3yu2N9Bx7yVVOKYT6yEdXXo6j2JTm0wNxgqaGeQVaSHRjhfnQbX91DtjFB6McRFSlcJH3xQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-arrow-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6"
-  integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==
+"@babel/plugin-transform-arrow-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz#cb5ee3a36f0863c06ead0b409b4cc43a889b295b"
+  integrity sha512-6AZHgFJKP3DJX0eCNJj01RpytUa3SOGawIxweHkNX2L6PYikOZmoh5B0d7hIHaIgveMjX990IAa/xK7jRTN8OA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-async-to-generator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
-  integrity sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==
+"@babel/plugin-transform-async-to-generator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz#e5153eb1a3e028f79194ed8a7a4bf55f862b2062"
+  integrity sha512-XCgYjJ8TY2slj6SReBUyamJn3k2JLUIiiR5b6t1mNCMSvv7yx+jJpaewakikp0uWFQSF7ChPPoe3dHmXLpISkg==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-remap-async-to-generator" "^7.8.3"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-remap-async-to-generator" "^7.10.1"
 
-"@babel/plugin-transform-block-scoped-functions@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3"
-  integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==
+"@babel/plugin-transform-block-scoped-functions@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz#146856e756d54b20fff14b819456b3e01820b85d"
+  integrity sha512-B7K15Xp8lv0sOJrdVAoukKlxP9N59HS48V1J3U/JGj+Ad+MHq+am6xJVs85AgXrQn4LV8vaYFOB+pr/yIuzW8Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-block-scoping@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
-  integrity sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==
+"@babel/plugin-transform-block-scoping@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz#47092d89ca345811451cd0dc5d91605982705d5e"
+  integrity sha512-8bpWG6TtF5akdhIm/uWTyjHqENpy13Fx8chg7pFH875aNLwX8JxIxqm08gmAT+Whe6AOmaTeLPe7dpLbXt+xUw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
     lodash "^4.17.13"
 
-"@babel/plugin-transform-classes@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c"
-  integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-define-map" "^7.8.3"
-    "@babel/helper-function-name" "^7.9.5"
-    "@babel/helper-optimise-call-expression" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.6"
-    "@babel/helper-split-export-declaration" "^7.8.3"
+"@babel/plugin-transform-classes@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz#6e11dd6c4dfae70f540480a4702477ed766d733f"
+  integrity sha512-P9V0YIh+ln/B3RStPoXpEQ/CoAxQIhRSUn7aXqQ+FZJ2u8+oCtjIXR3+X0vsSD8zv+mb56K7wZW1XiDTDGiDRQ==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-define-map" "^7.10.1"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-optimise-call-expression" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
     globals "^11.1.0"
 
-"@babel/plugin-transform-computed-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b"
-  integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==
+"@babel/plugin-transform-computed-properties@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz#59aa399064429d64dce5cf76ef9b90b7245ebd07"
+  integrity sha512-mqSrGjp3IefMsXIenBfGcPXxJxweQe2hEIwMQvjtiDQ9b1IBvDUjkAtV/HMXX47/vXf14qDNedXsIiNd1FmkaQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-destructuring@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50"
-  integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==
+"@babel/plugin-transform-destructuring@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz#abd58e51337815ca3a22a336b85f62b998e71907"
+  integrity sha512-V/nUc4yGWG71OhaTH705pU8ZSdM6c1KmmLP8ys59oOYbT7RpMYAR3MsVOt6OHL0WzG7BlTU076va9fjJyYzJMA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz#c3c6ec5ee6125c6993c5cbca20dc8621a9ea7a6e"
-  integrity sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==
+"@babel/plugin-transform-dotall-regex@^7.10.1", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz#920b9fec2d78bb57ebb64a644d5c2ba67cc104ee"
+  integrity sha512-19VIMsD1dp02RvduFUmfzj8uknaO3uiHHF0s3E1OHnVsNj8oge8EQ5RzHRbJjGSetRnkEuBYO7TG1M5kKjGLOA==
   dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-duplicate-keys@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz#8d12df309aa537f272899c565ea1768e286e21f1"
-  integrity sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==
+"@babel/plugin-transform-duplicate-keys@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz#c900a793beb096bc9d4d0a9d0cde19518ffc83b9"
+  integrity sha512-wIEpkX4QvX8Mo9W6XF3EdGttrIPZWozHfEaDTU0WJD/TDnXMvdDh30mzUl/9qWhnf7naicYartcEfUghTCSNpA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-exponentiation-operator@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz#581a6d7f56970e06bf51560cd64f5e947b70d7b7"
-  integrity sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==
+"@babel/plugin-transform-exponentiation-operator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz#279c3116756a60dd6e6f5e488ba7957db9c59eb3"
+  integrity sha512-lr/przdAbpEA2BUzRvjXdEDLrArGRRPwbaF9rvayuHRvdQ7lUTTkZnhZrJ4LE2jvgMRFF4f0YuPQ20vhiPYxtA==
   dependencies:
-    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-for-of@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz#0f260e27d3e29cd1bb3128da5e76c761aa6c108e"
-  integrity sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==
+"@babel/plugin-transform-for-of@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz#ff01119784eb0ee32258e8646157ba2501fcfda5"
+  integrity sha512-US8KCuxfQcn0LwSCMWMma8M2R5mAjJGsmoCBVwlMygvmDUMkTCykc84IqN1M7t+agSfOmLYTInLCHJM+RUoz+w==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-function-name@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b"
-  integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==
+"@babel/plugin-transform-function-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz#4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d"
+  integrity sha512-//bsKsKFBJfGd65qSNNh1exBy5Y9gD9ZN+DvrJ8f7HXr4avE5POW6zB7Rj6VnqHV33+0vXWUwJT0wSHubiAQkw==
   dependencies:
-    "@babel/helper-function-name" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1"
-  integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==
+"@babel/plugin-transform-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz#5794f8da82846b22e4e6631ea1658bce708eb46a"
+  integrity sha512-qi0+5qgevz1NHLZroObRm5A+8JJtibb7vdcPQF1KQE12+Y/xxl8coJ+TpPW9iRq+Mhw/NKLjm+5SHtAHCC7lAw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-member-expression-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410"
-  integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==
+"@babel/plugin-transform-member-expression-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz#90347cba31bca6f394b3f7bd95d2bbfd9fce2f39"
+  integrity sha512-UmaWhDokOFT2GcgU6MkHC11i0NQcL63iqeufXWfRy6pUOGYeCGEKhvfFO6Vz70UfYJYHwveg62GS83Rvpxn+NA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-modules-amd@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e"
-  integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw==
+"@babel/plugin-transform-modules-amd@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz#65950e8e05797ebd2fe532b96e19fc5482a1d52a"
+  integrity sha512-31+hnWSFRI4/ACFr1qkboBbrTxoBIzj7qA69qlq8HY8p7+YCzkCT6/TvQ1a4B0z27VeWtAeJd6pr5G04dc1iHw==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277"
-  integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ==
+"@babel/plugin-transform-modules-commonjs@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz#d5ff4b4413ed97ffded99961056e1fb980fb9301"
+  integrity sha512-AQG4fc3KOah0vdITwt7Gi6hD9BtQP/8bhem7OjbaMoRNCH5Djx42O2vYMfau7QnAzQCa+RJnhJBmFFMGpQEzrg==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-simple-access" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-simple-access" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-systemjs@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4"
-  integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg==
+"@babel/plugin-transform-modules-systemjs@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz#9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6"
+  integrity sha512-ewNKcj1TQZDL3YnO85qh9zo1YF1CHgmSTlRQgHqe63oTrMI85cthKtZjAiZSsSNjPQ5NCaYo5QkbYqEw1ZBgZA==
   dependencies:
-    "@babel/helper-hoist-variables" "^7.8.3"
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-hoist-variables" "^7.10.1"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-umd@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz#e909acae276fec280f9b821a5f38e1f08b480697"
-  integrity sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==
+"@babel/plugin-transform-modules-umd@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz#ea080911ffc6eb21840a5197a39ede4ee67b1595"
+  integrity sha512-EIuiRNMd6GB6ulcYlETnYYfgv4AxqrswghmBRQbWLHZxN4s7mupxzglnHqk9ZiUpDI4eRWewedJJNj67PWOXKA==
   dependencies:
-    "@babel/helper-module-transforms" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-transforms" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
 "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3":
   version "7.8.3"
@@ -645,216 +700,235 @@
   dependencies:
     "@babel/helper-create-regexp-features-plugin" "^7.8.3"
 
-"@babel/plugin-transform-new-target@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz#60cc2ae66d85c95ab540eb34babb6434d4c70c43"
-  integrity sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==
+"@babel/plugin-transform-new-target@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz#6ee41a5e648da7632e22b6fb54012e87f612f324"
+  integrity sha512-MBlzPc1nJvbmO9rPr1fQwXOM2iGut+JC92ku6PbiJMMK7SnQc1rytgpopveE3Evn47gzvGYeCdgfCDbZo0ecUw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-object-super@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725"
-  integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==
+"@babel/plugin-transform-object-super@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz#2e3016b0adbf262983bf0d5121d676a5ed9c4fde"
+  integrity sha512-WnnStUDN5GL+wGQrJylrnnVlFhFmeArINIR9gjhSeYyvroGhBrSAXYg/RHsnfzmsa+onJrTJrEClPzgNmmQ4Gw==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-replace-supers" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-replace-supers" "^7.10.1"
 
-"@babel/plugin-transform-parameters@^7.9.5":
-  version "7.9.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795"
-  integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==
+"@babel/plugin-transform-parameters@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz#b25938a3c5fae0354144a720b07b32766f683ddd"
+  integrity sha512-tJ1T0n6g4dXMsL45YsSzzSDZCxiHXAQp/qHrucOq5gEHncTA3xDxnd5+sZcoQp+N1ZbieAaB8r/VUCG0gqseOg==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-property-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263"
-  integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==
+"@babel/plugin-transform-property-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz#cffc7315219230ed81dc53e4625bf86815b6050d"
+  integrity sha512-Kr6+mgag8auNrgEpbfIWzdXYOvqDHZOF0+Bx2xh4H2EDNwcbRb9lY6nkZg8oSjsX+DH9Ebxm9hOqtKW+gRDeNA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-react-display-name@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5"
-  integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==
+"@babel/plugin-transform-react-display-name@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.1.tgz#e6a33f6d48dfb213dda5e007d0c7ff82b6a3d8ef"
+  integrity sha512-rBjKcVwjk26H3VX8pavMxGf33LNlbocMHdSeldIEswtQ/hrjyTG8fKKILW1cSkODyRovckN/uZlGb2+sAV9JUQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-react-inline-elements@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.9.0.tgz#19a39843431803765c9976132198bd8dee3d8058"
-  integrity sha512-iqqKXtOfVZpbgJ+9D4TG+JO/vgxa29FlpPUSIATzIcopKMUd3/bdwIjrrEneNp+SeiJs74nqKfUFYAUPDEu/qw==
+"@babel/plugin-transform-react-inline-elements@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-inline-elements/-/plugin-transform-react-inline-elements-7.10.1.tgz#14c1179cfda904d430109ed27a167e54c7565d68"
+  integrity sha512-lV/H9X6MaIfyzOVZnC4tZzMUnU9hGujmOuQhlGyDHOZbqAHv7dL24yXG1vOn8kA43CVL4bretUnGfV9IyjgqWA==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-builder-react-jsx" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx-development@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.9.0.tgz#3c2a130727caf00c2a293f0aed24520825dbf754"
-  integrity sha512-tK8hWKrQncVvrhvtOiPpKrQjfNX3DtkNLSX4ObuGcpS9p0QrGetKmlySIGR07y48Zft8WVgPakqd/bk46JrMSw==
+"@babel/plugin-transform-react-jsx-development@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.1.tgz#1ac6300d8b28ef381ee48e6fec430cc38047b7f3"
+  integrity sha512-XwDy/FFoCfw9wGFtdn5Z+dHh6HXKHkC6DwKNWpN74VWinUagZfDcEJc3Y8Dn5B3WMVnAllX8Kviaw7MtC5Epwg==
   dependencies:
-    "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx-self@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.9.0.tgz#f4f26a325820205239bb915bad8e06fcadabb49b"
-  integrity sha512-K2ObbWPKT7KUTAoyjCsFilOkEgMvFG+y0FqOl6Lezd0/13kMkkjHskVsZvblRPj1PHA44PrToaZANrryppzTvQ==
+"@babel/plugin-transform-react-jsx-self@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.1.tgz#22143e14388d72eb88649606bb9e46f421bc3821"
+  integrity sha512-4p+RBw9d1qV4S749J42ZooeQaBomFPrSxa9JONLHJ1TxCBo3TzJ79vtmG2S2erUT8PDDrPdw4ZbXGr2/1+dILA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx-source@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.9.0.tgz#89ef93025240dd5d17d3122294a093e5e0183de0"
-  integrity sha512-K6m3LlSnTSfRkM6FcRk8saNEeaeyG5k7AVkBU2bZK3+1zdkSED3qNdsWrUgQBeTVD2Tp3VMmerxVO2yM5iITmw==
+"@babel/plugin-transform-react-jsx-source@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.1.tgz#30db3d4ee3cdebbb26a82a9703673714777a4273"
+  integrity sha512-neAbaKkoiL+LXYbGDvh6PjPG+YeA67OsZlE78u50xbWh2L1/C81uHiNP5d1fw+uqUIoiNdCC8ZB+G4Zh3hShJA==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-react-jsx@^7.9.4":
-  version "7.9.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f"
-  integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw==
+"@babel/plugin-transform-react-jsx@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.1.tgz#91f544248ba131486decb5d9806da6a6e19a2896"
+  integrity sha512-MBVworWiSRBap3Vs39eHt+6pJuLUAaK4oxGc8g+wY+vuSJvLiEQjW1LSTqKb8OUPtDvHCkdPhk7d6sjC19xyFw==
   dependencies:
-    "@babel/helper-builder-react-jsx" "^7.9.0"
-    "@babel/helper-builder-react-jsx-experimental" "^7.9.0"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-syntax-jsx" "^7.8.3"
+    "@babel/helper-builder-react-jsx" "^7.10.1"
+    "@babel/helper-builder-react-jsx-experimental" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-syntax-jsx" "^7.10.1"
 
-"@babel/plugin-transform-regenerator@^7.8.7":
-  version "7.8.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz#5e46a0dca2bee1ad8285eb0527e6abc9c37672f8"
-  integrity sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==
+"@babel/plugin-transform-react-pure-annotations@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.10.1.tgz#f5e7c755d3e7614d4c926e144f501648a5277b70"
+  integrity sha512-mfhoiai083AkeewsBHUpaS/FM1dmUENHBMpS/tugSJ7VXqXO5dCN1Gkint2YvM1Cdv1uhmAKt1ZOuAjceKmlLA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-regenerator@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz#10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490"
+  integrity sha512-B3+Y2prScgJ2Bh/2l9LJxKbb8C8kRfsG4AdPT+n7ixBHIxJaIG8bi8tgjxUMege1+WqSJ+7gu1YeoMVO3gPWzw==
   dependencies:
     regenerator-transform "^0.14.2"
 
-"@babel/plugin-transform-reserved-words@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz#9a0635ac4e665d29b162837dd3cc50745dfdf1f5"
-  integrity sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==
+"@babel/plugin-transform-reserved-words@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz#0fc1027312b4d1c3276a57890c8ae3bcc0b64a86"
+  integrity sha512-qN1OMoE2nuqSPmpTqEM7OvJ1FkMEV+BjVeZZm9V9mq/x1JLKQ4pcv8riZJMNN3u2AUGl0ouOMjRr2siecvHqUQ==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-plugin-utils" "^7.10.1"
 
-"@babel/plugin-transform-runtime@^7.9.0":
-  version "7.9.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz#45468c0ae74cc13204e1d3b1f4ce6ee83258af0b"
-  integrity sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==
+"@babel/plugin-transform-runtime@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz#fd1887f749637fb2ed86dc278e79eb41df37f4b1"
+  integrity sha512-4w2tcglDVEwXJ5qxsY++DgWQdNJcCCsPxfT34wCUwIf2E7dI7pMpH8JczkMBbgBTNzBX62SZlNJ9H+De6Zebaw==
   dependencies:
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
     resolve "^1.8.1"
     semver "^5.5.1"
 
-"@babel/plugin-transform-shorthand-properties@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8"
-  integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-spread@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz#9c8ffe8170fdfb88b114ecb920b82fb6e95fe5e8"
-  integrity sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-sticky-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz#be7a1290f81dae767475452199e1f76d6175b100"
-  integrity sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/helper-regex" "^7.8.3"
-
-"@babel/plugin-transform-template-literals@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80"
-  integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==
-  dependencies:
-    "@babel/helper-annotate-as-pure" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-typeof-symbol@^7.8.4":
-  version "7.8.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz#ede4062315ce0aaf8a657a920858f1a2f35fc412"
-  integrity sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/plugin-transform-unicode-regex@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad"
-  integrity sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==
-  dependencies:
-    "@babel/helper-create-regexp-features-plugin" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-
-"@babel/preset-env@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6"
-  integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ==
-  dependencies:
-    "@babel/compat-data" "^7.9.6"
-    "@babel/helper-compilation-targets" "^7.9.6"
-    "@babel/helper-module-imports" "^7.8.3"
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-proposal-async-generator-functions" "^7.8.3"
-    "@babel/plugin-proposal-dynamic-import" "^7.8.3"
-    "@babel/plugin-proposal-json-strings" "^7.8.3"
-    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3"
-    "@babel/plugin-proposal-numeric-separator" "^7.8.3"
-    "@babel/plugin-proposal-object-rest-spread" "^7.9.6"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.8.3"
-    "@babel/plugin-proposal-optional-chaining" "^7.9.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.8.3"
+"@babel/plugin-transform-shorthand-properties@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz#e8b54f238a1ccbae482c4dce946180ae7b3143f3"
+  integrity sha512-AR0E/lZMfLstScFwztApGeyTHJ5u3JUKMjneqRItWeEqDdHWZwAOKycvQNCasCK/3r5YXsuNG25funcJDu7Y2g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-spread@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz#0c6d618a0c4461a274418460a28c9ccf5239a7c8"
+  integrity sha512-8wTPym6edIrClW8FI2IoaePB91ETOtg36dOkj3bYcNe7aDMN2FXEoUa+WrmPc4xa1u2PQK46fUX2aCb+zo9rfw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-sticky-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz#90fc89b7526228bed9842cff3588270a7a393b00"
+  integrity sha512-j17ojftKjrL7ufX8ajKvwRilwqTok4q+BjkknmQw9VNHnItTyMP5anPFzxFJdCQs7clLcWpCV3ma+6qZWLnGMA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/helper-regex" "^7.10.1"
+
+"@babel/plugin-transform-template-literals@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz#914c7b7f4752c570ea00553b4284dad8070e8628"
+  integrity sha512-t7B/3MQf5M1T9hPCRG28DNGZUuxAuDqLYS03rJrIk2prj/UV7Z6FOneijhQhnv/Xa039vidXeVbvjK2SK5f7Gg==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-typeof-symbol@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz#60c0239b69965d166b80a84de7315c1bc7e0bb0e"
+  integrity sha512-qX8KZcmbvA23zDi+lk9s6hC1FM7jgLHYIjuLgULgc8QtYnmB3tAVIYkNoKRQ75qWBeyzcoMoK8ZQmogGtC/w0g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-unicode-escapes@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz#add0f8483dab60570d9e03cecef6c023aa8c9940"
+  integrity sha512-zZ0Poh/yy1d4jeDWpx/mNwbKJVwUYJX73q+gyh4bwtG0/iUlzdEu0sLMda8yuDFS6LBQlT/ST1SJAR6zYwXWgw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/plugin-transform-unicode-regex@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz#6b58f2aea7b68df37ac5025d9c88752443a6b43f"
+  integrity sha512-Y/2a2W299k0VIUdbqYm9X2qS6fE0CUBhhiPpimK6byy7OJ/kORLlIX+J6UrjgNu5awvs62k+6RSslxhcvVw2Tw==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+
+"@babel/preset-env@^7.10.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz#715930f2cf8573b0928005ee562bed52fb65fdfb"
+  integrity sha512-MjqhX0RZaEgK/KueRzh+3yPSk30oqDKJ5HP5tqTSB1e2gzGS3PLy7K0BIpnp78+0anFuSwOeuCf1zZO7RzRvEA==
+  dependencies:
+    "@babel/compat-data" "^7.10.1"
+    "@babel/helper-compilation-targets" "^7.10.2"
+    "@babel/helper-module-imports" "^7.10.1"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-proposal-async-generator-functions" "^7.10.1"
+    "@babel/plugin-proposal-class-properties" "^7.10.1"
+    "@babel/plugin-proposal-dynamic-import" "^7.10.1"
+    "@babel/plugin-proposal-json-strings" "^7.10.1"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.10.1"
+    "@babel/plugin-proposal-numeric-separator" "^7.10.1"
+    "@babel/plugin-proposal-object-rest-spread" "^7.10.1"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.10.1"
+    "@babel/plugin-proposal-optional-chaining" "^7.10.1"
+    "@babel/plugin-proposal-private-methods" "^7.10.1"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.10.1"
     "@babel/plugin-syntax-async-generators" "^7.8.0"
+    "@babel/plugin-syntax-class-properties" "^7.10.1"
     "@babel/plugin-syntax-dynamic-import" "^7.8.0"
     "@babel/plugin-syntax-json-strings" "^7.8.0"
     "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0"
-    "@babel/plugin-syntax-numeric-separator" "^7.8.0"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.1"
     "@babel/plugin-syntax-object-rest-spread" "^7.8.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.0"
     "@babel/plugin-syntax-optional-chaining" "^7.8.0"
-    "@babel/plugin-syntax-top-level-await" "^7.8.3"
-    "@babel/plugin-transform-arrow-functions" "^7.8.3"
-    "@babel/plugin-transform-async-to-generator" "^7.8.3"
-    "@babel/plugin-transform-block-scoped-functions" "^7.8.3"
-    "@babel/plugin-transform-block-scoping" "^7.8.3"
-    "@babel/plugin-transform-classes" "^7.9.5"
-    "@babel/plugin-transform-computed-properties" "^7.8.3"
-    "@babel/plugin-transform-destructuring" "^7.9.5"
-    "@babel/plugin-transform-dotall-regex" "^7.8.3"
-    "@babel/plugin-transform-duplicate-keys" "^7.8.3"
-    "@babel/plugin-transform-exponentiation-operator" "^7.8.3"
-    "@babel/plugin-transform-for-of" "^7.9.0"
-    "@babel/plugin-transform-function-name" "^7.8.3"
-    "@babel/plugin-transform-literals" "^7.8.3"
-    "@babel/plugin-transform-member-expression-literals" "^7.8.3"
-    "@babel/plugin-transform-modules-amd" "^7.9.6"
-    "@babel/plugin-transform-modules-commonjs" "^7.9.6"
-    "@babel/plugin-transform-modules-systemjs" "^7.9.6"
-    "@babel/plugin-transform-modules-umd" "^7.9.0"
+    "@babel/plugin-syntax-top-level-await" "^7.10.1"
+    "@babel/plugin-transform-arrow-functions" "^7.10.1"
+    "@babel/plugin-transform-async-to-generator" "^7.10.1"
+    "@babel/plugin-transform-block-scoped-functions" "^7.10.1"
+    "@babel/plugin-transform-block-scoping" "^7.10.1"
+    "@babel/plugin-transform-classes" "^7.10.1"
+    "@babel/plugin-transform-computed-properties" "^7.10.1"
+    "@babel/plugin-transform-destructuring" "^7.10.1"
+    "@babel/plugin-transform-dotall-regex" "^7.10.1"
+    "@babel/plugin-transform-duplicate-keys" "^7.10.1"
+    "@babel/plugin-transform-exponentiation-operator" "^7.10.1"
+    "@babel/plugin-transform-for-of" "^7.10.1"
+    "@babel/plugin-transform-function-name" "^7.10.1"
+    "@babel/plugin-transform-literals" "^7.10.1"
+    "@babel/plugin-transform-member-expression-literals" "^7.10.1"
+    "@babel/plugin-transform-modules-amd" "^7.10.1"
+    "@babel/plugin-transform-modules-commonjs" "^7.10.1"
+    "@babel/plugin-transform-modules-systemjs" "^7.10.1"
+    "@babel/plugin-transform-modules-umd" "^7.10.1"
     "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3"
-    "@babel/plugin-transform-new-target" "^7.8.3"
-    "@babel/plugin-transform-object-super" "^7.8.3"
-    "@babel/plugin-transform-parameters" "^7.9.5"
-    "@babel/plugin-transform-property-literals" "^7.8.3"
-    "@babel/plugin-transform-regenerator" "^7.8.7"
-    "@babel/plugin-transform-reserved-words" "^7.8.3"
-    "@babel/plugin-transform-shorthand-properties" "^7.8.3"
-    "@babel/plugin-transform-spread" "^7.8.3"
-    "@babel/plugin-transform-sticky-regex" "^7.8.3"
-    "@babel/plugin-transform-template-literals" "^7.8.3"
-    "@babel/plugin-transform-typeof-symbol" "^7.8.4"
-    "@babel/plugin-transform-unicode-regex" "^7.8.3"
+    "@babel/plugin-transform-new-target" "^7.10.1"
+    "@babel/plugin-transform-object-super" "^7.10.1"
+    "@babel/plugin-transform-parameters" "^7.10.1"
+    "@babel/plugin-transform-property-literals" "^7.10.1"
+    "@babel/plugin-transform-regenerator" "^7.10.1"
+    "@babel/plugin-transform-reserved-words" "^7.10.1"
+    "@babel/plugin-transform-shorthand-properties" "^7.10.1"
+    "@babel/plugin-transform-spread" "^7.10.1"
+    "@babel/plugin-transform-sticky-regex" "^7.10.1"
+    "@babel/plugin-transform-template-literals" "^7.10.1"
+    "@babel/plugin-transform-typeof-symbol" "^7.10.1"
+    "@babel/plugin-transform-unicode-escapes" "^7.10.1"
+    "@babel/plugin-transform-unicode-regex" "^7.10.1"
     "@babel/preset-modules" "^0.1.3"
-    "@babel/types" "^7.9.6"
-    browserslist "^4.11.1"
+    "@babel/types" "^7.10.2"
+    browserslist "^4.12.0"
     core-js-compat "^3.6.2"
     invariant "^2.2.2"
     levenary "^1.1.1"
@@ -871,17 +945,18 @@
     "@babel/types" "^7.4.4"
     esutils "^2.0.2"
 
-"@babel/preset-react@^7.9.4":
-  version "7.9.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.9.4.tgz#c6c97693ac65b6b9c0b4f25b948a8f665463014d"
-  integrity sha512-AxylVB3FXeOTQXNXyiuAQJSvss62FEotbX2Pzx3K/7c+MKJMdSg6Ose6QYllkdCFA8EInCJVw7M/o5QbLuA4ZQ==
+"@babel/preset-react@^7.10.1":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.10.1.tgz#e2ab8ae9a363ec307b936589f07ed753192de041"
+  integrity sha512-Rw0SxQ7VKhObmFjD/cUcKhPTtzpeviEFX1E6PgP+cYOhQ98icNqtINNFANlsdbQHrmeWnqdxA4Tmnl1jy5tp3Q==
   dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-    "@babel/plugin-transform-react-display-name" "^7.8.3"
-    "@babel/plugin-transform-react-jsx" "^7.9.4"
-    "@babel/plugin-transform-react-jsx-development" "^7.9.0"
-    "@babel/plugin-transform-react-jsx-self" "^7.9.0"
-    "@babel/plugin-transform-react-jsx-source" "^7.9.0"
+    "@babel/helper-plugin-utils" "^7.10.1"
+    "@babel/plugin-transform-react-display-name" "^7.10.1"
+    "@babel/plugin-transform-react-jsx" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-development" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-self" "^7.10.1"
+    "@babel/plugin-transform-react-jsx-source" "^7.10.1"
+    "@babel/plugin-transform-react-pure-annotations" "^7.10.1"
 
 "@babel/runtime-corejs3@^7.8.3":
   version "7.8.7"
@@ -898,50 +973,43 @@
   dependencies:
     regenerator-runtime "^0.12.0"
 
-"@babel/runtime@7.2.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f"
-  integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg==
-  dependencies:
-    regenerator-runtime "^0.12.0"
-
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
-  integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
+  integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
   dependencies:
     regenerator-runtime "^0.13.4"
 
-"@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
-  version "7.8.6"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b"
-  integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/parser" "^7.8.6"
-    "@babel/types" "^7.8.6"
-
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442"
-  integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/generator" "^7.9.6"
-    "@babel/helper-function-name" "^7.9.5"
-    "@babel/helper-split-export-declaration" "^7.8.3"
-    "@babel/parser" "^7.9.6"
-    "@babel/types" "^7.9.6"
+"@babel/template@^7.10.1", "@babel/template@^7.3.3", "@babel/template@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz#e167154a94cb5f14b28dc58f5356d2162f539811"
+  integrity sha512-OQDg6SqvFSsc9A0ej6SKINWrpJiNonRIniYondK2ViKhB06i3c0s+76XUft71iqBEe9S1OKsHwPAjfHnuvnCig==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/parser" "^7.10.1"
+    "@babel/types" "^7.10.1"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.1", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3":
+  version "7.10.1"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz#bbcef3031e4152a6c0b50147f4958df54ca0dd27"
+  integrity sha512-C/cTuXeKt85K+p08jN6vMDz8vSV0vZcI0wmQ36o6mjbuo++kPMdpOYw23W2XH04dbRt9/nMEfA4W3eR21CD+TQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.1"
+    "@babel/generator" "^7.10.1"
+    "@babel/helper-function-name" "^7.10.1"
+    "@babel/helper-split-export-declaration" "^7.10.1"
+    "@babel/parser" "^7.10.1"
+    "@babel/types" "^7.10.1"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6":
-  version "7.9.6"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7"
-  integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==
+"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.10.1", "@babel/types@^7.10.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.8.3":
+  version "7.10.2"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz#30283be31cad0dbf6fb00bd40641ca0ea675172d"
+  integrity sha512-AD3AwWBSz0AWF0AkCN9VPiWrvldXq+/e3cHa4J89vo4ymjz1XwrBFFVZmkJTsQIPNk+ZVomPSXUJqq8yyjZsng==
   dependencies:
-    "@babel/helper-validator-identifier" "^7.9.5"
+    "@babel/helper-validator-identifier" "^7.10.1"
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
@@ -1063,12 +1131,13 @@
   integrity sha512-J3n5SKim+ZoLbe44hRGI/VYAwSMCeIJuBy+FfP6EZaujEpNchPRFcIsVQLWAwpU1bP2Ji63rC+rEUOd1vjUB6Q==
 
 "@istanbuljs/load-nyc-config@^1.0.0":
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b"
-  integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg==
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+  integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
   dependencies:
     camelcase "^5.3.1"
     find-up "^4.1.0"
+    get-package-type "^0.1.0"
     js-yaml "^3.13.1"
     resolve-from "^5.0.0"
 
@@ -1077,142 +1146,142 @@
   resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd"
   integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==
 
-"@jest/console@^25.4.0", "@jest/console@^25.5.0":
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/console/-/console-25.5.0.tgz#770800799d510f37329c508a9edd0b7b447d9abb"
-  integrity sha512-T48kZa6MK1Y6k4b89sexwmSF4YLeZS/Udqg3Jj3jG/cHH+N/sLFCEoXEDMOKugJQ9FxPN1osxIknvKkxt6MKyw==
+"@jest/console@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.0.1.tgz#62b3b2fa8990f3cbffbef695c42ae9ddbc8f4b39"
+  integrity sha512-9t1KUe/93coV1rBSxMmBAOIK3/HVpwxArCA1CxskKyRiv6o8J70V8C/V3OJminVCTa2M0hQI9AWRd5wxu2dAHw==
   dependencies:
-    "@jest/types" "^25.5.0"
-    chalk "^3.0.0"
-    jest-message-util "^25.5.0"
-    jest-util "^25.5.0"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
+    jest-message-util "^26.0.1"
+    jest-util "^26.0.1"
     slash "^3.0.0"
 
-"@jest/core@^25.4.0":
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/@jest/core/-/core-25.4.0.tgz#cc1fe078df69b8f0fbb023bb0bcee23ef3b89411"
-  integrity sha512-h1x9WSVV0+TKVtATGjyQIMJENs8aF6eUjnCoi4jyRemYZmekLr8EJOGQqTWEX8W6SbZ6Skesy9pGXrKeAolUJw==
+"@jest/core@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.0.1.tgz#aa538d52497dfab56735efb00e506be83d841fae"
+  integrity sha512-Xq3eqYnxsG9SjDC+WLeIgf7/8KU6rddBxH+SCt18gEpOhAGYC/Mq+YbtlNcIdwjnnT+wDseXSbU0e5X84Y4jTQ==
   dependencies:
-    "@jest/console" "^25.4.0"
-    "@jest/reporters" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/transform" "^25.4.0"
-    "@jest/types" "^25.4.0"
+    "@jest/console" "^26.0.1"
+    "@jest/reporters" "^26.0.1"
+    "@jest/test-result" "^26.0.1"
+    "@jest/transform" "^26.0.1"
+    "@jest/types" "^26.0.1"
     ansi-escapes "^4.2.1"
-    chalk "^3.0.0"
+    chalk "^4.0.0"
     exit "^0.1.2"
-    graceful-fs "^4.2.3"
-    jest-changed-files "^25.4.0"
-    jest-config "^25.4.0"
-    jest-haste-map "^25.4.0"
-    jest-message-util "^25.4.0"
-    jest-regex-util "^25.2.6"
-    jest-resolve "^25.4.0"
-    jest-resolve-dependencies "^25.4.0"
-    jest-runner "^25.4.0"
-    jest-runtime "^25.4.0"
-    jest-snapshot "^25.4.0"
-    jest-util "^25.4.0"
-    jest-validate "^25.4.0"
-    jest-watcher "^25.4.0"
+    graceful-fs "^4.2.4"
+    jest-changed-files "^26.0.1"
+    jest-config "^26.0.1"
+    jest-haste-map "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-regex-util "^26.0.0"
+    jest-resolve "^26.0.1"
+    jest-resolve-dependencies "^26.0.1"
+    jest-runner "^26.0.1"
+    jest-runtime "^26.0.1"
+    jest-snapshot "^26.0.1"
+    jest-util "^26.0.1"
+    jest-validate "^26.0.1"
+    jest-watcher "^26.0.1"
     micromatch "^4.0.2"
     p-each-series "^2.1.0"
-    realpath-native "^2.0.0"
     rimraf "^3.0.0"
     slash "^3.0.0"
     strip-ansi "^6.0.0"
 
-"@jest/environment@^25.4.0", "@jest/environment@^25.5.0":
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-25.5.0.tgz#aa33b0c21a716c65686638e7ef816c0e3a0c7b37"
-  integrity sha512-U2VXPEqL07E/V7pSZMSQCvV5Ea4lqOlT+0ZFijl/i316cRMHvZ4qC+jBdryd+lmRetjQo0YIQr6cVPNxxK87mA==
+"@jest/environment@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.0.1.tgz#82f519bba71959be9b483675ee89de8c8f72a5c8"
+  integrity sha512-xBDxPe8/nx251u0VJ2dFAFz2H23Y98qdIaNwnMK6dFQr05jc+Ne/2np73lOAx+5mSBO/yuQldRrQOf6hP1h92g==
   dependencies:
-    "@jest/fake-timers" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    jest-mock "^25.5.0"
+    "@jest/fake-timers" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    jest-mock "^26.0.1"
 
-"@jest/fake-timers@^25.5.0":
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-25.5.0.tgz#46352e00533c024c90c2bc2ad9f2959f7f114185"
-  integrity sha512-9y2+uGnESw/oyOI3eww9yaxdZyHq7XvprfP/eeoCsjqKYts2yRlsHS/SgjPDV8FyMfn2nbMy8YzUk6nyvdLOpQ==
+"@jest/fake-timers@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.0.1.tgz#f7aeff13b9f387e9d0cac9a8de3bba538d19d796"
+  integrity sha512-Oj/kCBnTKhm7CR+OJSjZty6N1bRDr9pgiYQr4wY221azLz5PHi08x/U+9+QpceAYOWheauLP8MhtSVFrqXQfhg==
   dependencies:
-    "@jest/types" "^25.5.0"
-    jest-message-util "^25.5.0"
-    jest-mock "^25.5.0"
-    jest-util "^25.5.0"
-    lolex "^5.0.0"
+    "@jest/types" "^26.0.1"
+    "@sinonjs/fake-timers" "^6.0.1"
+    jest-message-util "^26.0.1"
+    jest-mock "^26.0.1"
+    jest-util "^26.0.1"
 
-"@jest/globals@^25.5.2":
-  version "25.5.2"
-  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-25.5.2.tgz#5e45e9de8d228716af3257eeb3991cc2e162ca88"
-  integrity sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==
+"@jest/globals@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.0.1.tgz#3f67b508a7ce62b6e6efc536f3d18ec9deb19a9c"
+  integrity sha512-iuucxOYB7BRCvT+TYBzUqUNuxFX1hqaR6G6IcGgEqkJ5x4htNKo1r7jk1ji9Zj8ZMiMw0oB5NaA7k5Tx6MVssA==
   dependencies:
-    "@jest/environment" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    expect "^25.5.0"
+    "@jest/environment" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    expect "^26.0.1"
 
-"@jest/reporters@^25.4.0":
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-25.4.0.tgz#836093433b32ce4e866298af2d6fcf6ed351b0b0"
-  integrity sha512-bhx/buYbZgLZm4JWLcRJ/q9Gvmd3oUh7k2V7gA4ZYBx6J28pIuykIouclRdiAC6eGVX1uRZT+GK4CQJLd/PwPg==
+"@jest/reporters@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.0.1.tgz#14ae00e7a93e498cec35b0c00ab21c375d9b078f"
+  integrity sha512-NWWy9KwRtE1iyG/m7huiFVF9YsYv/e+mbflKRV84WDoJfBqUrNRyDbL/vFxQcYLl8IRqI4P3MgPn386x76Gf2g==
   dependencies:
     "@bcoe/v8-coverage" "^0.2.3"
-    "@jest/console" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/transform" "^25.4.0"
-    "@jest/types" "^25.4.0"
-    chalk "^3.0.0"
+    "@jest/console" "^26.0.1"
+    "@jest/test-result" "^26.0.1"
+    "@jest/transform" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
     collect-v8-coverage "^1.0.0"
     exit "^0.1.2"
     glob "^7.1.2"
+    graceful-fs "^4.2.4"
     istanbul-lib-coverage "^3.0.0"
     istanbul-lib-instrument "^4.0.0"
     istanbul-lib-report "^3.0.0"
     istanbul-lib-source-maps "^4.0.0"
     istanbul-reports "^3.0.2"
-    jest-haste-map "^25.4.0"
-    jest-resolve "^25.4.0"
-    jest-util "^25.4.0"
-    jest-worker "^25.4.0"
+    jest-haste-map "^26.0.1"
+    jest-resolve "^26.0.1"
+    jest-util "^26.0.1"
+    jest-worker "^26.0.0"
     slash "^3.0.0"
     source-map "^0.6.0"
-    string-length "^3.1.0"
+    string-length "^4.0.1"
     terminal-link "^2.0.0"
     v8-to-istanbul "^4.1.3"
   optionalDependencies:
-    node-notifier "^6.0.0"
+    node-notifier "^7.0.0"
 
-"@jest/source-map@^25.5.0":
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-25.5.0.tgz#df5c20d6050aa292c2c6d3f0d2c7606af315bd1b"
-  integrity sha512-eIGx0xN12yVpMcPaVpjXPnn3N30QGJCJQSkEDUt9x1fI1Gdvb07Ml6K5iN2hG7NmMP6FDmtPEssE3z6doOYUwQ==
+"@jest/source-map@^26.0.0":
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.0.0.tgz#fd7706484a7d3faf7792ae29783933bbf48a4749"
+  integrity sha512-S2Z+Aj/7KOSU2TfW0dyzBze7xr95bkm5YXNUqqCek+HE0VbNNSNzrRwfIi5lf7wvzDTSS0/ib8XQ1krFNyYgbQ==
   dependencies:
     callsites "^3.0.0"
     graceful-fs "^4.2.4"
     source-map "^0.6.0"
 
-"@jest/test-result@^25.4.0", "@jest/test-result@^25.5.0":
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-25.5.0.tgz#139a043230cdeffe9ba2d8341b27f2efc77ce87c"
-  integrity sha512-oV+hPJgXN7IQf/fHWkcS99y0smKLU2czLBJ9WA0jHITLst58HpQMtzSYxzaBvYc6U5U6jfoMthqsUlUlbRXs0A==
+"@jest/test-result@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.0.1.tgz#1ffdc1ba4bc289919e54b9414b74c9c2f7b2b718"
+  integrity sha512-oKwHvOI73ICSYRPe8WwyYPTtiuOAkLSbY8/MfWF3qDEd/sa8EDyZzin3BaXTqufir/O/Gzea4E8Zl14XU4Mlyg==
   dependencies:
-    "@jest/console" "^25.5.0"
-    "@jest/types" "^25.5.0"
+    "@jest/console" "^26.0.1"
+    "@jest/types" "^26.0.1"
     "@types/istanbul-lib-coverage" "^2.0.0"
     collect-v8-coverage "^1.0.0"
 
-"@jest/test-sequencer@^25.5.4":
-  version "25.5.4"
-  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-25.5.4.tgz#9b4e685b36954c38d0f052e596d28161bdc8b737"
-  integrity sha512-pTJGEkSeg1EkCO2YWq6hbFvKNXk8ejqlxiOg1jBNLnWrgXOkdY6UmqZpwGFXNnRt9B8nO1uWMzLLZ4eCmhkPNA==
+"@jest/test-sequencer@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.0.1.tgz#b0563424728f3fe9e75d1442b9ae4c11da73f090"
+  integrity sha512-ssga8XlwfP8YjbDcmVhwNlrmblddMfgUeAkWIXts1V22equp2GMIHxm7cyeD5Q/B0ZgKPK/tngt45sH99yLLGg==
   dependencies:
-    "@jest/test-result" "^25.5.0"
+    "@jest/test-result" "^26.0.1"
     graceful-fs "^4.2.4"
-    jest-haste-map "^25.5.1"
-    jest-runner "^25.5.4"
-    jest-runtime "^25.5.4"
+    jest-haste-map "^26.0.1"
+    jest-runner "^26.0.1"
+    jest-runtime "^26.0.1"
 
-"@jest/transform@^25.2.4", "@jest/transform@^25.4.0", "@jest/transform@^25.5.1":
+"@jest/transform@^25.2.4":
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-25.5.1.tgz#0469ddc17699dd2bf985db55fa0fb9309f5c2db3"
   integrity sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==
@@ -1234,7 +1303,28 @@
     source-map "^0.6.1"
     write-file-atomic "^3.0.0"
 
-"@jest/types@^25.2.3", "@jest/types@^25.4.0", "@jest/types@^25.5.0":
+"@jest/transform@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.0.1.tgz#0e3ecbb34a11cd4b2080ed0a9c4856cf0ceb0639"
+  integrity sha512-pPRkVkAQ91drKGbzCfDOoHN838+FSbYaEAvBXvKuWeeRRUD8FjwXkqfUNUZL6Ke48aA/1cqq/Ni7kVMCoqagWA==
+  dependencies:
+    "@babel/core" "^7.1.0"
+    "@jest/types" "^26.0.1"
+    babel-plugin-istanbul "^6.0.0"
+    chalk "^4.0.0"
+    convert-source-map "^1.4.0"
+    fast-json-stable-stringify "^2.0.0"
+    graceful-fs "^4.2.4"
+    jest-haste-map "^26.0.1"
+    jest-regex-util "^26.0.0"
+    jest-util "^26.0.1"
+    micromatch "^4.0.2"
+    pirates "^4.0.1"
+    slash "^3.0.0"
+    source-map "^0.6.1"
+    write-file-atomic "^3.0.0"
+
+"@jest/types@^25.2.3", "@jest/types@^25.5.0":
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d"
   integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==
@@ -1244,19 +1334,64 @@
     "@types/yargs" "^15.0.0"
     chalk "^3.0.0"
 
+"@jest/types@^26.0.1":
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.0.1.tgz#b78333fbd113fa7aec8d39de24f88de8686dac67"
+  integrity sha512-IbtjvqI9+eS1qFnOIEL7ggWmT+iK/U+Vde9cGWtYb/b6XgKb3X44ZAe/z9YZzoAAZ/E92m0DqrilF934IGNnQA==
+  dependencies:
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "@types/istanbul-reports" "^1.1.1"
+    "@types/yargs" "^15.0.0"
+    chalk "^4.0.0"
+
+"@nodelib/fs.scandir@2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
+  integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.3"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
+  integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.4"
+  resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
+  integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.3"
+    fastq "^1.6.0"
+
+"@npmcli/move-file@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.0.1.tgz#de103070dac0f48ce49cf6693c23af59c0f70464"
+  integrity sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==
+  dependencies:
+    mkdirp "^1.0.4"
+
 "@rails/ujs@^6.0.3":
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/@rails/ujs/-/ujs-6.0.3.tgz#e68a03278e30daea6a110aac5dfa33c60c53055d"
   integrity sha512-CM9OEvoN9eXkaX7PXEnbsQLULJ97b9rVmwliZbz/iBOERLJ68Rk3ClJe+fQEMKU4CBZfky2lIRnfslOdUs9SLQ==
 
 "@sinonjs/commons@^1.7.0":
-  version "1.7.2"
-  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2"
-  integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d"
+  integrity sha512-wEj54PfsZ5jGSwMX68G8ZXFawcSglQSXqCftWX3ec8MDUzQdHgcKvw97awHbY0efQEL5iKUOAmmVtoYgmrSG4Q==
   dependencies:
     type-detect "4.0.8"
 
-"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.3", "@types/babel__core@^7.1.7":
+"@sinonjs/fake-timers@^6.0.1":
+  version "6.0.1"
+  resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
+  integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
+  dependencies:
+    "@sinonjs/commons" "^1.7.0"
+
+"@types/babel__core@^7.1.0", "@types/babel__core@^7.1.3":
   version "7.1.7"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.7.tgz#1dacad8840364a57c98d0dd4855c6dd3752c6b89"
   integrity sha512-RL62NqSFPCDK2FM1pSDH0scHpJvsXtZNiYlMB73DgPBaG1E38ZYVL+ei5EkWRbr+KC4YNiAUNBnRj+bgwpgjMw==
@@ -1267,6 +1402,17 @@
     "@types/babel__template" "*"
     "@types/babel__traverse" "*"
 
+"@types/babel__core@^7.1.7":
+  version "7.1.8"
+  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.8.tgz#057f725aca3641f49fc11c7a87a9de5ec588a5d7"
+  integrity sha512-KXBiQG2OXvaPWFPDS1rD8yV9vO0OuWIqAEqLsbfX0oU2REN5KuoMnZ1gClWcBhO5I3n6oTVAmrMufOvRqdmFTQ==
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+    "@types/babel__generator" "*"
+    "@types/babel__template" "*"
+    "@types/babel__traverse" "*"
+
 "@types/babel__generator@*":
   version "7.6.1"
   resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04"
@@ -1283,9 +1429,9 @@
     "@babel/types" "^7.0.0"
 
 "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
-  version "7.0.11"
-  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18"
-  integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q==
+  version "7.0.12"
+  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.12.tgz#22f49a028e69465390f87bb103ebd61bd086b8f5"
+  integrity sha512-t4CoEokHTfcyfb4hUaF9oOHu9RmmNWnm1CP0YmMqOOfClKascOmvlEM736vlqeScuGvBDsHkf8R2INd4DWreQA==
   dependencies:
     "@babel/types" "^7.3.0"
 
@@ -1335,15 +1481,25 @@
     "@types/istanbul-lib-coverage" "*"
     "@types/istanbul-lib-report" "*"
 
+"@types/json-schema@^7.0.4":
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
+  integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA==
+
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
   integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
 
 "@types/node@*":
-  version "13.13.5"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.5.tgz#96ec3b0afafd64a4ccea9107b75bf8489f0e5765"
-  integrity sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==
+  version "14.0.11"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.11.tgz#61d4886e2424da73b7b25547f59fdcb534c165a3"
+  integrity sha512-lCvvI24L21ZVeIiyIUHZ5Oflv1hhHQ5E1S25IRlKIXaRkVgmXpJMI3wUJkmym2bTbCe+WoIibQnMVAU3FguaOg==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
@@ -1355,23 +1511,16 @@
   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
-"@types/prettier@^1.19.0":
-  version "1.19.1"
-  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.19.1.tgz#33509849f8e679e4add158959fdb086440e9553f"
-  integrity sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==
+"@types/prettier@^2.0.0":
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz#b6e98083f13faa1e5231bfa3bdb1b0feff536b6d"
+  integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ==
 
 "@types/q@^1.5.1":
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
   integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
 
-"@types/react@16.4.6":
-  version "16.4.6"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.4.6.tgz#5024957c6bcef4f02823accf5974faba2e54fada"
-  integrity sha512-9LDZdhsuKSc+DjY65SjBkA958oBWcTWSVWAd2cD9XqKBjhGw1KzAkRhWRw2eIsXvaIE/TOTjjKMFVC+JA1iU4g==
-  dependencies:
-    csstype "^2.2.0"
-
 "@types/schema-utils@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/schema-utils/-/schema-utils-1.0.0.tgz#295d36f01e2cb8bc3207ca1d9a68e210db6b40cb"
@@ -1549,7 +1698,7 @@
   resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
   integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 
-abab@^2.0.0:
+abab@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
   integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
@@ -1562,13 +1711,13 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
     mime-types "~2.1.24"
     negotiator "0.6.2"
 
-acorn-globals@^4.3.2:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
-  integrity sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==
+acorn-globals@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+  integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
   dependencies:
-    acorn "^6.0.1"
-    acorn-walk "^6.0.1"
+    acorn "^7.1.1"
+    acorn-walk "^7.1.1"
 
 acorn-jsx@^3.0.0:
   version "3.0.1"
@@ -1582,11 +1731,6 @@ acorn-jsx@^5.1.0:
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
   integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==
 
-acorn-walk@^6.0.1:
-  version "6.2.0"
-  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
-  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
-
 acorn-walk@^7.1.1:
   version "7.1.1"
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e"
@@ -1602,7 +1746,7 @@ acorn@^5.5.0:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.4.1:
+acorn@^6.4.1:
   version "6.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
   integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
@@ -1659,7 +1803,7 @@ ajv@^4.7.0:
     co "^4.6.0"
     json-stable-stringify "^1.0.1"
 
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5, ajv@^6.9.1:
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.5, ajv@^6.9.1:
   version "6.12.2"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
   integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
@@ -1795,11 +1939,6 @@ arr-union@^3.1.0:
   resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
   integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
 
-array-equal@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
-  integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-
 array-filter@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83"
@@ -1831,6 +1970,11 @@ array-union@^1.0.1:
   dependencies:
     array-uniq "^1.0.1"
 
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
 array-uniq@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
@@ -1849,7 +1993,7 @@ array.prototype.find@^2.1.0:
     define-properties "^1.1.3"
     es-abstract "^1.17.4"
 
-array.prototype.flat@^1.2.1, array.prototype.flat@^1.2.3:
+array.prototype.flat@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
   integrity sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==
@@ -1938,18 +2082,18 @@ atrament@0.2.4:
   resolved "https://registry.yarnpkg.com/atrament/-/atrament-0.2.4.tgz#6f78196edfcd194e568b7c0b9c88201ec371ac66"
   integrity sha512-hSA9VwW6COMwvRhSEO4uZweZ91YGOdHqwvslNyrJZG+8mzc4qx/qMsDZBuAeXFeWZO/QKtRjIXguOUy1aNMl3A==
 
-autoprefixer@^9.7.6:
-  version "9.7.6"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4"
-  integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==
+autoprefixer@^9.8.0:
+  version "9.8.0"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511"
+  integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A==
   dependencies:
-    browserslist "^4.11.1"
-    caniuse-lite "^1.0.30001039"
+    browserslist "^4.12.0"
+    caniuse-lite "^1.0.30001061"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.27"
-    postcss-value-parser "^4.0.3"
+    postcss "^7.0.30"
+    postcss-value-parser "^4.1.0"
 
 aws-sign2@~0.7.0:
   version "0.7.0"
@@ -1957,9 +2101,9 @@ aws-sign2@~0.7.0:
   integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
 aws4@^1.8.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
-  integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
+  integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
 
 axios@^0.19.2:
   version "0.19.2"
@@ -1973,15 +2117,15 @@ axobject-query@^2.0.2:
   resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
   integrity sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ==
 
-babel-eslint@^10.0.3:
-  version "10.0.3"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
-  integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
+babel-eslint@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.0.0"
-    "@babel/traverse" "^7.0.0"
-    "@babel/types" "^7.0.0"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
     eslint-visitor-keys "^1.0.0"
     resolve "^1.12.0"
 
@@ -1998,17 +2142,17 @@ babel-jest@^25.2.4:
     chalk "^3.0.0"
     slash "^3.0.0"
 
-babel-jest@^25.5.1:
-  version "25.5.1"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-25.5.1.tgz#bc2e6101f849d6f6aec09720ffc7bc5332e62853"
-  integrity sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==
+babel-jest@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.0.1.tgz#450139ce4b6c17174b136425bda91885c397bc46"
+  integrity sha512-Z4GGmSNQ8pX3WS1O+6v3fo41YItJJZsVxG5gIQ+HuB/iuAQBJxMTHTwz292vuYws1LnHfwSRgoqI+nxdy/pcvw==
   dependencies:
-    "@jest/transform" "^25.5.1"
-    "@jest/types" "^25.5.0"
+    "@jest/transform" "^26.0.1"
+    "@jest/types" "^26.0.1"
     "@types/babel__core" "^7.1.7"
     babel-plugin-istanbul "^6.0.0"
-    babel-preset-jest "^25.5.0"
-    chalk "^3.0.0"
+    babel-preset-jest "^26.0.0"
+    chalk "^4.0.0"
     graceful-fs "^4.2.4"
     slash "^3.0.0"
 
@@ -2066,6 +2210,15 @@ babel-plugin-jest-hoist@^25.5.0:
     "@babel/types" "^7.3.3"
     "@types/babel__traverse" "^7.0.6"
 
+babel-plugin-jest-hoist@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.0.0.tgz#fd1d35f95cf8849fc65cb01b5e58aedd710b34a8"
+  integrity sha512-+AuoehOrjt9irZL7DOt2+4ZaTM6dlu1s5TTS46JBa0/qem4dy7VNW3tMb96qeEqcIh20LD73TVNtmVEeymTG7w==
+  dependencies:
+    "@babel/template" "^7.3.3"
+    "@babel/types" "^7.3.3"
+    "@types/babel__traverse" "^7.0.6"
+
 babel-plugin-lodash@^3.3.4:
   version "3.3.4"
   resolved "https://registry.yarnpkg.com/babel-plugin-lodash/-/babel-plugin-lodash-3.3.4.tgz#4f6844358a1340baed182adbeffa8df9967bc196"
@@ -2134,7 +2287,7 @@ babel-preset-current-node-syntax@^0.1.2:
     "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
 
-babel-preset-jest@^25.2.1, babel-preset-jest@^25.5.0:
+babel-preset-jest@^25.2.1:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-25.5.0.tgz#c1d7f191829487a907764c65307faa0e66590b49"
   integrity sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==
@@ -2142,6 +2295,14 @@ babel-preset-jest@^25.2.1, babel-preset-jest@^25.5.0:
     babel-plugin-jest-hoist "^25.5.0"
     babel-preset-current-node-syntax "^0.1.2"
 
+babel-preset-jest@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.0.0.tgz#1eac82f513ad36c4db2e9263d7c485c825b1faa6"
+  integrity sha512-9ce+DatAa31DpR4Uir8g4Ahxs5K4W4L8refzt+qHWQANb6LhGcAEfIFgLUwk67oya2cCUd6t4eUMtO/z64ocNw==
+  dependencies:
+    babel-plugin-jest-hoist "^26.0.0"
+    babel-preset-current-node-syntax "^0.1.2"
+
 babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
@@ -2328,13 +2489,6 @@ browser-process-hrtime@^1.0.0:
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
   integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
 
-browser-resolve@^1.11.3:
-  version "1.11.3"
-  resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
-  integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
-  dependencies:
-    resolve "1.1.7"
-
 browserify-aes@^1.0.0, browserify-aes@^1.0.4:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
@@ -2396,7 +2550,7 @@ browserify-zlib@^0.2.0:
   dependencies:
     pako "~1.0.5"
 
-browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.8.5:
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.8.5:
   version "4.12.0"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d"
   integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==
@@ -2457,7 +2611,7 @@ bytes@3.1.0:
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
   integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
 
-cacache@^12.0.2, cacache@^12.0.3:
+cacache@^12.0.2:
   version "12.0.4"
   resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
   integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
@@ -2478,11 +2632,12 @@ cacache@^12.0.2, cacache@^12.0.3:
     unique-filename "^1.1.1"
     y18n "^4.0.0"
 
-cacache@^15.0.3:
-  version "15.0.3"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.3.tgz#2225c2d1dd8e872339950d6a39c051e0e9334392"
-  integrity sha512-bc3jKYjqv7k4pWh7I/ixIjfcjPul4V4jme/WbjvwGS5LzoPL/GzXr4C5EgPNLO/QEZl9Oi61iGitYEdwcrwLCQ==
+cacache@^15.0.3, cacache@^15.0.4:
+  version "15.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.0.4.tgz#b2c23cf4ac4f5ead004fb15a0efb0a20340741f1"
+  integrity sha512-YlnKQqTbD/6iyoJvEY3KJftjrdBYroCbxxYXzhOzsFLWlp6KX4BOlEf4mTx0cMUfVaTS3ENL2QtDWeRYoGLkkw==
   dependencies:
+    "@npmcli/move-file" "^1.0.1"
     chownr "^2.0.0"
     fs-minipass "^2.0.0"
     glob "^7.1.4"
@@ -2493,7 +2648,6 @@ cacache@^15.0.3:
     minipass-flush "^1.0.5"
     minipass-pipeline "^1.2.2"
     mkdirp "^1.0.3"
-    move-file "^2.0.0"
     p-map "^4.0.0"
     promise-inflight "^1.0.1"
     rimraf "^3.0.2"
@@ -2557,6 +2711,11 @@ camelcase@^5.0.0, camelcase@^5.3.1:
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
   integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
+camelcase@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e"
+  integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==
+
 caniuse-api@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
@@ -2567,10 +2726,10 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001043:
-  version "1.0.30001061"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001061.tgz#80ca87ef14eb543a7458e7fd2b5e2face3458c9f"
-  integrity sha512-SMICCeiNvMZnyXpuoO+ot7FHpMVPlrsR+HmfByj6nY4xYDHXLqMTbgH7ecEkDNXWkH1vaip+ZS0D7VTXwM1KYQ==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061:
+  version "1.0.30001078"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001078.tgz#e1b6e2ae327b6a1ec11f65ec7a0dde1e7093074c"
+  integrity sha512-sF12qXe9VMm32IEf/+NDvmTpwJaaU7N1igpiH2FdI4DyABJSsOqG3ZAcFvszLkoLoo1y6VJLMYivukUAxaMASw==
 
 capture-exit@^2.0.0:
   version "2.0.0"
@@ -2612,6 +2771,14 @@ chalk@^3.0.0:
     ansi-styles "^4.1.0"
     supports-color "^7.1.0"
 
+chalk@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+  integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
 char-regex@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
@@ -2839,9 +3006,9 @@ color-string@^1.5.2:
     simple-swizzle "^0.2.2"
 
 color@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/color/-/color-3.1.0.tgz#d8e9fb096732875774c84bf922815df0308d0ffc"
-  integrity sha512-CwyopLkuRYO5ei2EpzpIh6LqJMt6Mt+jZhO5VI5f/wJLZriXQE32/SSqzmrh+QB+AZT81Cj8yv+7zwToW8ahZg==
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
+  integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
   dependencies:
     color-convert "^1.9.1"
     color-string "^1.5.2"
@@ -2985,23 +3152,22 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-copy-webpack-plugin@^5.1.1:
-  version "5.1.1"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88"
-  integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==
+copy-webpack-plugin@^6.0.2:
+  version "6.0.2"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.0.2.tgz#10efc6ad219a61acbf2f5fb50af83da38431bc34"
+  integrity sha512-9Gm8X0c6eXlKnmltMPFCBeGOKjtcRIyTt4VaO3k1TkNgVTe5Ov2lYsYVuyLp0kp8DItO3apewflM+1GYgh6V2Q==
   dependencies:
-    cacache "^12.0.3"
-    find-cache-dir "^2.1.0"
-    glob-parent "^3.1.0"
-    globby "^7.1.1"
-    is-glob "^4.0.1"
-    loader-utils "^1.2.3"
-    minimatch "^3.0.4"
+    cacache "^15.0.4"
+    fast-glob "^3.2.2"
+    find-cache-dir "^3.3.1"
+    glob-parent "^5.1.1"
+    globby "^11.0.1"
+    loader-utils "^2.0.0"
     normalize-path "^3.0.0"
-    p-limit "^2.2.1"
-    schema-utils "^1.0.0"
-    serialize-javascript "^2.1.2"
-    webpack-log "^2.0.0"
+    p-limit "^2.3.0"
+    schema-utils "^2.7.0"
+    serialize-javascript "^3.1.0"
+    webpack-sources "^1.4.3"
 
 core-js-compat@^3.6.2:
   version "3.6.5"
@@ -3026,24 +3192,14 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
-cosmiconfig@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc"
-  integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==
-  dependencies:
-    is-directory "^0.3.1"
-    js-yaml "^3.9.0"
-    parse-json "^4.0.0"
-    require-from-string "^2.0.1"
-
 cosmiconfig@^5.0.0:
-  version "5.0.7"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
-  integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
   dependencies:
     import-fresh "^2.0.0"
     is-directory "^0.3.1"
-    js-yaml "^3.9.0"
+    js-yaml "^3.13.1"
     parse-json "^4.0.0"
 
 cosmiconfig@^6.0.0:
@@ -3107,9 +3263,9 @@ cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
     which "^1.2.9"
 
 cross-spawn@^7.0.0:
-  version "7.0.2"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6"
-  integrity sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
   dependencies:
     path-key "^3.1.0"
     shebang-command "^2.0.0"
@@ -3186,23 +3342,23 @@ css-list-helpers@^1.0.1:
   dependencies:
     tcomb "^2.5.0"
 
-css-loader@^3.5.3:
-  version "3.5.3"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf"
-  integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==
+css-loader@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.6.0.tgz#2e4b2c7e6e2d27f8c8f28f61bffcd2e6c91ef645"
+  integrity sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==
   dependencies:
     camelcase "^5.3.1"
     cssesc "^3.0.0"
     icss-utils "^4.1.1"
     loader-utils "^1.2.3"
     normalize-path "^3.0.0"
-    postcss "^7.0.27"
+    postcss "^7.0.32"
     postcss-modules-extract-imports "^2.0.0"
     postcss-modules-local-by-default "^3.0.2"
     postcss-modules-scope "^2.2.0"
     postcss-modules-values "^3.0.0"
-    postcss-value-parser "^4.0.3"
-    schema-utils "^2.6.6"
+    postcss-value-parser "^4.1.0"
+    schema-utils "^2.7.0"
     semver "^6.3.0"
 
 css-select-base-adapter@^0.1.1:
@@ -3341,7 +3497,7 @@ csso@^4.0.2:
   dependencies:
     css-tree "1.0.0-alpha.39"
 
-cssom@^0.4.1:
+cssom@^0.4.4:
   version "0.4.4"
   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
   integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
@@ -3351,14 +3507,14 @@ cssom@~0.3.6:
   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
   integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
 
-cssstyle@^2.0.0:
+cssstyle@^2.2.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
   integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
   dependencies:
     cssom "~0.3.6"
 
-csstype@^2.2.0, csstype@^2.5.7, csstype@^2.6.7:
+csstype@^2.5.7, csstype@^2.6.7:
   version "2.6.10"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
   integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
@@ -3388,14 +3544,14 @@ dashdash@^1.12.0:
   dependencies:
     assert-plus "^1.0.0"
 
-data-urls@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
-  integrity sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==
+data-urls@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+  integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
   dependencies:
-    abab "^2.0.0"
-    whatwg-mimetype "^2.2.0"
-    whatwg-url "^7.0.0"
+    abab "^2.0.3"
+    whatwg-mimetype "^2.3.0"
+    whatwg-url "^8.0.0"
 
 debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9:
   version "2.6.9"
@@ -3430,6 +3586,11 @@ decamelize@^1.2.0:
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
 
+decimal.js@^10.2.0:
+  version "10.2.0"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
+  integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
+
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -3565,10 +3726,10 @@ detect-passive-events@^1.0.2:
   resolved "https://registry.yarnpkg.com/detect-passive-events/-/detect-passive-events-1.0.4.tgz#6ed477e6e5bceb79079735dcd357789d37f9a91a"
   integrity sha1-btR35uW863kHlzXc01d4nTf5qRo=
 
-diff-sequences@^25.2.6:
-  version "25.2.6"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd"
-  integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==
+diff-sequences@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.0.0.tgz#0760059a5c287637b842bd7085311db7060e88a6"
+  integrity sha512-JC/eHYEC3aSS0vZGjuoc4vHA0yAQTzhQQldXMeMF+JlxLGJlCO38Gma82NV9gk1jGFz8mDzUMeaKXvjRRdJ2dg==
 
 diffie-hellman@^5.0.0:
   version "5.0.3"
@@ -3579,12 +3740,12 @@ diffie-hellman@^5.0.0:
     miller-rabin "^4.0.0"
     randombytes "^2.0.0"
 
-dir-glob@^2.0.0:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
-  integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
   dependencies:
-    path-type "^3.0.0"
+    path-type "^4.0.0"
 
 discontinuous-range@1.0.0:
   version "1.0.0"
@@ -3679,12 +3840,12 @@ domelementtype@^2.0.1:
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
   integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
 
-domexception@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
-  integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
+domexception@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+  integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
   dependencies:
-    webidl-conversions "^4.0.2"
+    webidl-conversions "^5.0.0"
 
 domhandler@^2.3.0:
   version "2.4.2"
@@ -3750,9 +3911,9 @@ ee-first@1.1.1:
   integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
 ejs@^2.3.4, ejs@^2.6.1:
-  version "2.7.1"
-  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228"
-  integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==
+  version "2.7.4"
+  resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
 electron-to-chromium@^1.3.413:
   version "1.3.448"
@@ -3911,7 +4072,24 @@ error-stack-parser@^2.0.6:
   dependencies:
     stackframe "^1.1.1"
 
-es-abstract@^1.17.0, es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5:
+es-abstract@^1.17.0, es-abstract@^1.17.5:
+  version "1.17.6"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
+  integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
+  dependencies:
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+    is-callable "^1.2.0"
+    is-regex "^1.1.0"
+    object-inspect "^1.7.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.0"
+    string.prototype.trimend "^1.0.1"
+    string.prototype.trimstart "^1.0.1"
+
+es-abstract@^1.17.0-next.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4:
   version "1.17.5"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9"
   integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==
@@ -4014,10 +4192,15 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escodegen@^1.11.1:
-  version "1.14.1"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
-  integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
+escape-string-regexp@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+  integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escodegen@^1.14.1:
+  version "1.14.2"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.2.tgz#14ab71bf5026c2aa08173afba22c6f3173284a84"
+  integrity sha512-InuOIiKk8wwuOFg6x9BQXbzjrQhtyXh46K9bqVTPzSo2FnyMBaYGBMC6PhQy7yxxil9vIedFBweQBMK74/7o8A==
   dependencies:
     esprima "^4.0.1"
     estraverse "^4.2.0"
@@ -4036,7 +4219,7 @@ escope@^3.6.0:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
 
-eslint-import-resolver-node@^0.3.2:
+eslint-import-resolver-node@^0.3.3:
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz#dbaa52b6b2816b50bc6711af75422de808e98404"
   integrity sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==
@@ -4044,7 +4227,7 @@ eslint-import-resolver-node@^0.3.2:
     debug "^2.6.9"
     resolve "^1.13.1"
 
-eslint-module-utils@^2.4.1:
+eslint-module-utils@^2.6.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6"
   integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==
@@ -4052,23 +4235,24 @@ eslint-module-utils@^2.4.1:
     debug "^2.6.9"
     pkg-dir "^2.0.0"
 
-eslint-plugin-import@~2.20.2:
-  version "2.20.2"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz#91fc3807ce08be4837141272c8b99073906e588d"
-  integrity sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==
+eslint-plugin-import@~2.21.2:
+  version "2.21.2"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.21.2.tgz#8fef77475cc5510801bedc95f84b932f7f334a7c"
+  integrity sha512-FEmxeGI6yaz+SnEB6YgNHlQK1Bs2DKLM+YF+vuTk5H8J9CLbJLtlPvRFgZZ2+sXiKAlN5dpdlrWOjK8ZoZJpQA==
   dependencies:
-    array-includes "^3.0.3"
-    array.prototype.flat "^1.2.1"
+    array-includes "^3.1.1"
+    array.prototype.flat "^1.2.3"
     contains-path "^0.1.0"
     debug "^2.6.9"
     doctrine "1.5.0"
-    eslint-import-resolver-node "^0.3.2"
-    eslint-module-utils "^2.4.1"
+    eslint-import-resolver-node "^0.3.3"
+    eslint-module-utils "^2.6.0"
     has "^1.0.3"
     minimatch "^3.0.4"
-    object.values "^1.1.0"
+    object.values "^1.1.1"
     read-pkg-up "^2.0.0"
-    resolve "^1.12.0"
+    resolve "^1.17.0"
+    tsconfig-paths "^3.9.0"
 
 eslint-plugin-jsx-a11y@~6.2.3:
   version "6.2.3"
@@ -4090,10 +4274,10 @@ eslint-plugin-promise@~4.2.1:
   resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz#845fd8b2260ad8f82564c1222fce44ad71d9418a"
   integrity sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==
 
-eslint-plugin-react@~7.19.0:
-  version "7.19.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
-  integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
+eslint-plugin-react@~7.20.0:
+  version "7.20.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3"
+  integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA==
   dependencies:
     array-includes "^3.1.1"
     doctrine "^2.1.0"
@@ -4104,7 +4288,6 @@ eslint-plugin-react@~7.19.0:
     object.values "^1.1.1"
     prop-types "^15.7.2"
     resolve "^1.15.1"
-    semver "^6.3.0"
     string.prototype.matchall "^4.0.2"
     xregexp "^4.3.0"
 
@@ -4241,11 +4424,11 @@ esprima@^4.0.0, esprima@^4.0.1:
   integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
 esquery@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
-  integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+  integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
   dependencies:
-    estraverse "^4.0.0"
+    estraverse "^5.1.0"
 
 esrecurse@^4.1.0:
   version "4.2.1"
@@ -4254,11 +4437,16 @@ esrecurse@^4.1.0:
   dependencies:
     estraverse "^4.1.0"
 
-estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
   integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
 
+estraverse@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+  integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
+
 esutils@^2.0.2:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@@ -4320,10 +4508,10 @@ execa@^1.0.0:
     signal-exit "^3.0.0"
     strip-eof "^1.0.0"
 
-execa@^3.2.0:
-  version "3.4.0"
-  resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89"
-  integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==
+execa@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-4.0.2.tgz#ad87fb7b2d9d564f70d2b62d511bee41d5cbb240"
+  integrity sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==
   dependencies:
     cross-spawn "^7.0.0"
     get-stream "^5.0.0"
@@ -4332,7 +4520,6 @@ execa@^3.2.0:
     merge-stream "^2.0.0"
     npm-run-path "^4.0.0"
     onetime "^5.1.0"
-    p-finally "^2.0.0"
     signal-exit "^3.0.2"
     strip-final-newline "^2.0.0"
 
@@ -4371,17 +4558,17 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
   dependencies:
     homedir-polyfill "^1.0.1"
 
-expect@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-25.5.0.tgz#f07f848712a2813bb59167da3fb828ca21f58bba"
-  integrity sha512-w7KAXo0+6qqZZhovCaBVPSIqQp7/UTcx4M9uKt2m6pd2VB1voyC8JizLRqeEqud3AAVP02g+hbErDu5gu64tlA==
+expect@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-26.0.1.tgz#18697b9611a7e2725e20ba3ceadda49bc9865421"
+  integrity sha512-QcCy4nygHeqmbw564YxNbHTJlXh47dVID2BUP52cZFpLU9zHViMFK6h07cC1wf7GYCTIigTdAXhVua8Yl1FkKg==
   dependencies:
-    "@jest/types" "^25.5.0"
+    "@jest/types" "^26.0.1"
     ansi-styles "^4.0.0"
-    jest-get-type "^25.2.6"
-    jest-matcher-utils "^25.5.0"
-    jest-message-util "^25.5.0"
-    jest-regex-util "^25.2.6"
+    jest-get-type "^26.0.0"
+    jest-matcher-utils "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-regex-util "^26.0.0"
 
 express@^4.16.3, express@^4.17.1:
   version "4.17.1"
@@ -4484,6 +4671,18 @@ fast-deep-equal@^3.1.1:
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
   integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==
 
+fast-glob@^3.1.1, fast-glob@^3.2.2:
+  version "3.2.2"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d"
+  integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -4499,6 +4698,13 @@ favico.js@^0.3.10:
   resolved "https://registry.yarnpkg.com/favico.js/-/favico.js-0.3.10.tgz#80586e27a117f24a8d51c18a99bdc714d4339301"
   integrity sha1-gFhuJ6EX8kqNUcGKmb3HFNQzkwE=
 
+fastq@^1.6.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481"
+  integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==
+  dependencies:
+    reusify "^1.0.4"
+
 faye-websocket@^0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
@@ -4555,13 +4761,13 @@ file-entry-cache@^5.0.1:
   dependencies:
     flat-cache "^2.0.1"
 
-file-loader@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8"
-  integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==
+file-loader@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.0.0.tgz#97bbfaab7a2460c07bcbd72d3a6922407f67649f"
+  integrity sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==
   dependencies:
-    loader-utils "^1.4.0"
-    schema-utils "^2.5.0"
+    loader-utils "^2.0.0"
+    schema-utils "^2.6.5"
 
 file-type@^12.4.1:
   version "12.4.2"
@@ -4703,9 +4909,9 @@ follow-redirects@1.5.10:
     debug "=3.1.0"
 
 follow-redirects@^1.0.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.9.0.tgz#8d5bcdc65b7108fe1508649c79c12d732dcedb4f"
-  integrity sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==
+  version "1.11.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz#afa14f08ba12a52963140fe43212658897bc0ecb"
+  integrity sha512-KZm0V+ll8PfBrKwMzdo5D13b1bur9Iq9Zd/RMmAoQQcl2PxxFml8cxXPaaPYVbV0RjNjq1CU7zIzAOqtUPudmA==
   dependencies:
     debug "^3.0.0"
 
@@ -4885,6 +5091,11 @@ get-caller-file@^2.0.1:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
+get-package-type@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+  integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
 get-stream@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -4919,14 +5130,7 @@ glob-parent@^3.1.0:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
 
-glob-parent@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.0.0.tgz#1dc99f0f39b006d3e92c2c284068382f0c20e954"
-  integrity sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==
-  dependencies:
-    is-glob "^4.0.1"
-
-glob-parent@~5.1.0:
+glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
   integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@@ -4998,6 +5202,18 @@ globals@^9.2.0:
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
   integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
 
+globby@^11.0.1:
+  version "11.0.1"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz#9a2bf107a068f3ffeabc49ad702c79ede8cfd357"
+  integrity sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.1.1"
+    ignore "^5.1.4"
+    merge2 "^1.3.0"
+    slash "^3.0.0"
+
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5009,18 +5225,6 @@ globby@^6.1.0:
     pify "^2.0.0"
     pinkie-promise "^2.0.0"
 
-globby@^7.1.1:
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
-  integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA=
-  dependencies:
-    array-union "^1.0.1"
-    dir-glob "^2.0.0"
-    glob "^7.1.2"
-    ignore "^3.3.5"
-    pify "^3.0.0"
-    slash "^1.0.0"
-
 globule@^1.0.0:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/globule/-/globule-1.3.1.tgz#90a25338f22b7fbeb527cee63c629aea754d33b9"
@@ -5037,7 +5241,7 @@ gonzales-pe-sl@^4.2.3:
   dependencies:
     minimist "1.1.x"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.3, graceful-fs@^4.2.4:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
   version "4.2.4"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
   integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
@@ -5258,12 +5462,12 @@ html-element-map@^1.2.0:
   dependencies:
     array-filter "^1.0.0"
 
-html-encoding-sniffer@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
-  integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
+html-encoding-sniffer@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+  integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
   dependencies:
-    whatwg-encoding "^1.0.1"
+    whatwg-encoding "^1.0.5"
 
 html-entities@^1.3.1:
   version "1.3.1"
@@ -5345,9 +5549,9 @@ http-proxy-middleware@0.19.1:
     micromatch "^3.1.10"
 
 http-proxy@^1.17.0:
-  version "1.18.0"
-  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a"
-  integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==
+  version "1.18.1"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+  integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
   dependencies:
     eventemitter3 "^4.0.0"
     follow-redirects "^1.0.0"
@@ -5401,7 +5605,7 @@ iferr@^0.1.5:
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
   integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
 
-ignore@^3.1.2, ignore@^3.3.5:
+ignore@^3.1.2:
   version "3.3.10"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
   integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
@@ -5411,6 +5615,11 @@ ignore@^4.0.6:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
+ignore@^5.1.4:
+  version "5.1.6"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.6.tgz#643194ad4bf2712f37852e386b6998eff0db2106"
+  integrity sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA==
+
 immutable@^3.8.2:
   version "3.8.2"
   resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
@@ -5709,10 +5918,10 @@ is-boolean-object@^1.0.1:
   resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e"
   integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==
 
-is-callable@^1.1.4, is-callable@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
-  integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==
+is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+  integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
 
 is-ci@^2.0.0:
   version "2.0.0"
@@ -5775,6 +5984,11 @@ is-directory@^0.3.1:
   resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
   integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
 
+is-docker@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b"
+  integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==
+
 is-electron@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0"
@@ -5909,6 +6123,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   dependencies:
     isobject "^3.0.1"
 
+is-potential-custom-element-name@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397"
+  integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c=
+
 is-promise@^2.1.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
@@ -5919,12 +6138,12 @@ is-property@^1.0.0, is-property@^1.0.2:
   resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84"
   integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=
 
-is-regex@^1.0.4, is-regex@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
-  integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
+is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+  integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
   dependencies:
-    has "^1.0.3"
+    has-symbols "^1.0.1"
 
 is-resolvable@^1.0.0:
   version "1.1.0"
@@ -5986,9 +6205,11 @@ is-wsl@^1.1.0:
   integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
 
 is-wsl@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d"
-  integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog==
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
 
 isarray@0.0.1:
   version "0.0.1"
@@ -6063,117 +6284,115 @@ istanbul-reports@^3.0.2:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
 
-jest-changed-files@^25.4.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-25.5.0.tgz#141cc23567ceb3f534526f8614ba39421383634c"
-  integrity sha512-EOw9QEqapsDT7mKF162m8HFzRPbmP8qJQny6ldVOdOVBz3ACgPm/1nAn5fPQ/NDaYhX/AHkrGwwkCncpAVSXcw==
+jest-changed-files@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.0.1.tgz#1334630c6a1ad75784120f39c3aa9278e59f349f"
+  integrity sha512-q8LP9Sint17HaE2LjxQXL+oYWW/WeeXMPE2+Op9X3mY8IEGFVc14xRxFjUuXUbcPAlDLhtWdIEt59GdQbn76Hw==
   dependencies:
-    "@jest/types" "^25.5.0"
-    execa "^3.2.0"
+    "@jest/types" "^26.0.1"
+    execa "^4.0.0"
     throat "^5.0.0"
 
-jest-cli@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-25.4.0.tgz#5dac8be0fece6ce39f0d671395a61d1357322bab"
-  integrity sha512-usyrj1lzCJZMRN1r3QEdnn8e6E6yCx/QN7+B1sLoA68V7f3WlsxSSQfy0+BAwRiF4Hz2eHauf11GZG3PIfWTXQ==
+jest-cli@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.0.1.tgz#3a42399a4cbc96a519b99ad069a117d955570cac"
+  integrity sha512-pFLfSOBcbG9iOZWaMK4Een+tTxi/Wcm34geqZEqrst9cZDkTQ1LZ2CnBrTlHWuYAiTMFr0EQeK52ScyFU8wK+w==
   dependencies:
-    "@jest/core" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/types" "^25.4.0"
-    chalk "^3.0.0"
+    "@jest/core" "^26.0.1"
+    "@jest/test-result" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
     exit "^0.1.2"
+    graceful-fs "^4.2.4"
     import-local "^3.0.2"
     is-ci "^2.0.0"
-    jest-config "^25.4.0"
-    jest-util "^25.4.0"
-    jest-validate "^25.4.0"
+    jest-config "^26.0.1"
+    jest-util "^26.0.1"
+    jest-validate "^26.0.1"
     prompts "^2.0.1"
-    realpath-native "^2.0.0"
     yargs "^15.3.1"
 
-jest-config@^25.4.0, jest-config@^25.5.4:
-  version "25.5.4"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-25.5.4.tgz#38e2057b3f976ef7309b2b2c8dcd2a708a67f02c"
-  integrity sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==
+jest-config@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.0.1.tgz#096a3d4150afadf719d1fab00e9a6fb2d6d67507"
+  integrity sha512-9mWKx2L1LFgOXlDsC4YSeavnblN6A4CPfXFiobq+YYLaBMymA/SczN7xYTSmLaEYHZOcB98UdoN4m5uNt6tztg==
   dependencies:
     "@babel/core" "^7.1.0"
-    "@jest/test-sequencer" "^25.5.4"
-    "@jest/types" "^25.5.0"
-    babel-jest "^25.5.1"
-    chalk "^3.0.0"
+    "@jest/test-sequencer" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    babel-jest "^26.0.1"
+    chalk "^4.0.0"
     deepmerge "^4.2.2"
     glob "^7.1.1"
     graceful-fs "^4.2.4"
-    jest-environment-jsdom "^25.5.0"
-    jest-environment-node "^25.5.0"
-    jest-get-type "^25.2.6"
-    jest-jasmine2 "^25.5.4"
-    jest-regex-util "^25.2.6"
-    jest-resolve "^25.5.1"
-    jest-util "^25.5.0"
-    jest-validate "^25.5.0"
+    jest-environment-jsdom "^26.0.1"
+    jest-environment-node "^26.0.1"
+    jest-get-type "^26.0.0"
+    jest-jasmine2 "^26.0.1"
+    jest-regex-util "^26.0.0"
+    jest-resolve "^26.0.1"
+    jest-util "^26.0.1"
+    jest-validate "^26.0.1"
     micromatch "^4.0.2"
-    pretty-format "^25.5.0"
-    realpath-native "^2.0.0"
+    pretty-format "^26.0.1"
 
-jest-diff@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9"
-  integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==
+jest-diff@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.0.1.tgz#c44ab3cdd5977d466de69c46929e0e57f89aa1de"
+  integrity sha512-odTcHyl5X+U+QsczJmOjWw5tPvww+y9Yim5xzqxVl/R1j4z71+fHW4g8qu1ugMmKdFdxw+AtQgs5mupPnzcIBQ==
   dependencies:
-    chalk "^3.0.0"
-    diff-sequences "^25.2.6"
-    jest-get-type "^25.2.6"
-    pretty-format "^25.5.0"
+    chalk "^4.0.0"
+    diff-sequences "^26.0.0"
+    jest-get-type "^26.0.0"
+    pretty-format "^26.0.1"
 
-jest-docblock@^25.3.0:
-  version "25.3.0"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-25.3.0.tgz#8b777a27e3477cd77a168c05290c471a575623ef"
-  integrity sha512-aktF0kCar8+zxRHxQZwxMy70stc9R1mOmrLsT5VO3pIT0uzGRSDAXxSlz4NqQWpuLjPpuMhPRl7H+5FRsvIQAg==
+jest-docblock@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
+  integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==
   dependencies:
     detect-newline "^3.0.0"
 
-jest-each@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-25.5.0.tgz#0c3c2797e8225cb7bec7e4d249dcd96b934be516"
-  integrity sha512-QBogUxna3D8vtiItvn54xXde7+vuzqRrEeaw8r1s+1TG9eZLVJE5ZkKoSUlqFwRjnlaA4hyKGiu9OlkFIuKnjA==
-  dependencies:
-    "@jest/types" "^25.5.0"
-    chalk "^3.0.0"
-    jest-get-type "^25.2.6"
-    jest-util "^25.5.0"
-    pretty-format "^25.5.0"
-
-jest-environment-jsdom@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-25.5.0.tgz#dcbe4da2ea997707997040ecf6e2560aec4e9834"
-  integrity sha512-7Jr02ydaq4jaWMZLY+Skn8wL5nVIYpWvmeatOHL3tOcV3Zw8sjnPpx+ZdeBfc457p8jCR9J6YCc+Lga0oIy62A==
-  dependencies:
-    "@jest/environment" "^25.5.0"
-    "@jest/fake-timers" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    jest-mock "^25.5.0"
-    jest-util "^25.5.0"
-    jsdom "^15.2.1"
-
-jest-environment-node@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-25.5.0.tgz#0f55270d94804902988e64adca37c6ce0f7d07a1"
-  integrity sha512-iuxK6rQR2En9EID+2k+IBs5fCFd919gVVK5BeND82fYeLWPqvRcFNPKu9+gxTwfB5XwBGBvZ0HFQa+cHtIoslA==
-  dependencies:
-    "@jest/environment" "^25.5.0"
-    "@jest/fake-timers" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    jest-mock "^25.5.0"
-    jest-util "^25.5.0"
-    semver "^6.3.0"
-
-jest-get-type@^25.2.6:
-  version "25.2.6"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-25.2.6.tgz#0b0a32fab8908b44d508be81681487dbabb8d877"
-  integrity sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==
+jest-each@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.0.1.tgz#633083061619302fc90dd8f58350f9d77d67be04"
+  integrity sha512-OTgJlwXCAR8NIWaXFL5DBbeS4QIYPuNASkzSwMCJO+ywo9BEa6TqkaSWsfR7VdbMLdgYJqSfQcIyjJCNwl5n4Q==
+  dependencies:
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
+    jest-get-type "^26.0.0"
+    jest-util "^26.0.1"
+    pretty-format "^26.0.1"
+
+jest-environment-jsdom@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.0.1.tgz#217690852e5bdd7c846a4e3b50c8ffd441dfd249"
+  integrity sha512-u88NJa3aptz2Xix2pFhihRBAatwZHWwSiRLBDBQE1cdJvDjPvv7ZGA0NQBxWwDDn7D0g1uHqxM8aGgfA9Bx49g==
+  dependencies:
+    "@jest/environment" "^26.0.1"
+    "@jest/fake-timers" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    jest-mock "^26.0.1"
+    jest-util "^26.0.1"
+    jsdom "^16.2.2"
+
+jest-environment-node@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.0.1.tgz#584a9ff623124ff6eeb49e0131b5f7612b310b13"
+  integrity sha512-4FRBWcSn5yVo0KtNav7+5NH5Z/tEgDLp7VRQVS5tCouWORxj+nI+1tOLutM07Zb2Qi7ja+HEDoOUkjBSWZg/IQ==
+  dependencies:
+    "@jest/environment" "^26.0.1"
+    "@jest/fake-timers" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    jest-mock "^26.0.1"
+    jest-util "^26.0.1"
+
+jest-get-type@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.0.0.tgz#381e986a718998dbfafcd5ec05934be538db4039"
+  integrity sha512-zRc1OAPnnws1EVfykXOj19zo2EMw5Hi6HLbFCSjpuJiXtOWAYIjNsHVSbpQ8bDX7L5BGYGI8m+HmKdjHYFF0kg==
 
-jest-haste-map@^25.4.0, jest-haste-map@^25.5.1:
+jest-haste-map@^25.5.1:
   version "25.5.1"
   resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-25.5.1.tgz#1df10f716c1d94e60a1ebf7798c9fb3da2620943"
   integrity sha512-dddgh9UZjV7SCDQUrQ+5t9yy8iEgKc1AKqZR9YDww8xsVOtzPQSMVLDChc21+g29oTRexb9/B0bIlZL+sWmvAQ==
@@ -6193,67 +6412,87 @@ jest-haste-map@^25.4.0, jest-haste-map@^25.5.1:
   optionalDependencies:
     fsevents "^2.1.2"
 
-jest-jasmine2@^25.4.0, jest-jasmine2@^25.5.4:
-  version "25.5.4"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-25.5.4.tgz#66ca8b328fb1a3c5364816f8958f6970a8526968"
-  integrity sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==
+jest-haste-map@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.0.1.tgz#40dcc03c43ac94d25b8618075804d09cd5d49de7"
+  integrity sha512-J9kBl/EdjmDsvyv7CiyKY5+DsTvVOScenprz/fGqfLg/pm1gdjbwwQ98nW0t+OIt+f+5nAVaElvn/6wP5KO7KA==
+  dependencies:
+    "@jest/types" "^26.0.1"
+    "@types/graceful-fs" "^4.1.2"
+    anymatch "^3.0.3"
+    fb-watchman "^2.0.0"
+    graceful-fs "^4.2.4"
+    jest-serializer "^26.0.0"
+    jest-util "^26.0.1"
+    jest-worker "^26.0.0"
+    micromatch "^4.0.2"
+    sane "^4.0.3"
+    walker "^1.0.7"
+    which "^2.0.2"
+  optionalDependencies:
+    fsevents "^2.1.2"
+
+jest-jasmine2@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.0.1.tgz#947c40ee816636ba23112af3206d6fa7b23c1c1c"
+  integrity sha512-ILaRyiWxiXOJ+RWTKupzQWwnPaeXPIoLS5uW41h18varJzd9/7I0QJGqg69fhTT1ev9JpSSo9QtalriUN0oqOg==
   dependencies:
     "@babel/traverse" "^7.1.0"
-    "@jest/environment" "^25.5.0"
-    "@jest/source-map" "^25.5.0"
-    "@jest/test-result" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    chalk "^3.0.0"
+    "@jest/environment" "^26.0.1"
+    "@jest/source-map" "^26.0.0"
+    "@jest/test-result" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
     co "^4.6.0"
-    expect "^25.5.0"
+    expect "^26.0.1"
     is-generator-fn "^2.0.0"
-    jest-each "^25.5.0"
-    jest-matcher-utils "^25.5.0"
-    jest-message-util "^25.5.0"
-    jest-runtime "^25.5.4"
-    jest-snapshot "^25.5.1"
-    jest-util "^25.5.0"
-    pretty-format "^25.5.0"
+    jest-each "^26.0.1"
+    jest-matcher-utils "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-runtime "^26.0.1"
+    jest-snapshot "^26.0.1"
+    jest-util "^26.0.1"
+    pretty-format "^26.0.1"
     throat "^5.0.0"
 
-jest-leak-detector@^25.4.0, jest-leak-detector@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-25.5.0.tgz#2291c6294b0ce404241bb56fe60e2d0c3e34f0bb"
-  integrity sha512-rV7JdLsanS8OkdDpZtgBf61L5xZ4NnYLBq72r6ldxahJWWczZjXawRsoHyXzibM5ed7C2QRjpp6ypgwGdKyoVA==
+jest-leak-detector@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.0.1.tgz#79b19ab3f41170e0a78eb8fa754a116d3447fb8c"
+  integrity sha512-93FR8tJhaYIWrWsbmVN1pQ9ZNlbgRpfvrnw5LmgLRX0ckOJ8ut/I35CL7awi2ecq6Ca4lL59bEK9hr7nqoHWPA==
   dependencies:
-    jest-get-type "^25.2.6"
-    pretty-format "^25.5.0"
+    jest-get-type "^26.0.0"
+    pretty-format "^26.0.1"
 
-jest-matcher-utils@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz#fbc98a12d730e5d2453d7f1ed4a4d948e34b7867"
-  integrity sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==
+jest-matcher-utils@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.0.1.tgz#12e1fc386fe4f14678f4cc8dbd5ba75a58092911"
+  integrity sha512-PUMlsLth0Azen8Q2WFTwnSkGh2JZ8FYuwijC8NR47vXKpsrKmA1wWvgcj1CquuVfcYiDEdj985u5Wmg7COEARw==
   dependencies:
-    chalk "^3.0.0"
-    jest-diff "^25.5.0"
-    jest-get-type "^25.2.6"
-    pretty-format "^25.5.0"
+    chalk "^4.0.0"
+    jest-diff "^26.0.1"
+    jest-get-type "^26.0.0"
+    pretty-format "^26.0.1"
 
-jest-message-util@^25.4.0, jest-message-util@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-25.5.0.tgz#ea11d93204cc7ae97456e1d8716251185b8880ea"
-  integrity sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==
+jest-message-util@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.0.1.tgz#07af1b42fc450b4cc8e90e4c9cef11b33ce9b0ac"
+  integrity sha512-CbK8uQREZ8umUfo8+zgIfEt+W7HAHjQCoRaNs4WxKGhAYBGwEyvxuK81FXa7VeB9pwDEXeeKOB2qcsNVCAvB7Q==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@jest/types" "^25.5.0"
+    "@jest/types" "^26.0.1"
     "@types/stack-utils" "^1.0.1"
-    chalk "^3.0.0"
+    chalk "^4.0.0"
     graceful-fs "^4.2.4"
     micromatch "^4.0.2"
     slash "^3.0.0"
-    stack-utils "^1.0.1"
+    stack-utils "^2.0.2"
 
-jest-mock@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-25.5.0.tgz#a91a54dabd14e37ecd61665d6b6e06360a55387a"
-  integrity sha512-eXWuTV8mKzp/ovHc5+3USJMYsTBhyQ+5A1Mak35dey/RG8GlM4YWVylZuGgVXinaW6tpvk/RSecmF37FKUlpXA==
+jest-mock@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.0.1.tgz#7fd1517ed4955397cf1620a771dc2d61fad8fd40"
+  integrity sha512-MpYTBqycuPYSY6xKJognV7Ja46/TeRbAZept987Zp+tuJvMN0YBWyyhG9mXyYQaU3SBI0TUlSaO5L3p49agw7Q==
   dependencies:
-    "@jest/types" "^25.5.0"
+    "@jest/types" "^26.0.1"
 
 jest-pnp-resolver@^1.2.1:
   version "1.2.1"
@@ -6265,108 +6504,87 @@ jest-regex-util@^25.2.6:
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-25.2.6.tgz#d847d38ba15d2118d3b06390056028d0f2fd3964"
   integrity sha512-KQqf7a0NrtCkYmZZzodPftn7fL1cq3GQAFVMn5Hg8uKx/fIenLEobNanUxb7abQ1sjADHBseG/2FGpsv/wr+Qw==
 
-jest-resolve-dependencies@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-25.4.0.tgz#783937544cfc40afcc7c569aa54748c4b3f83f5a"
-  integrity sha512-A0eoZXx6kLiuG1Ui7wITQPl04HwjLErKIJTt8GR3c7UoDAtzW84JtCrgrJ6Tkw6c6MwHEyAaLk7dEPml5pf48A==
+jest-regex-util@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+  integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
+
+jest-resolve-dependencies@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.0.1.tgz#607ba7ccc32151d185a477cff45bf33bce417f0b"
+  integrity sha512-9d5/RS/ft0vB/qy7jct/qAhzJsr6fRQJyGAFigK3XD4hf9kIbEH5gks4t4Z7kyMRhowU6HWm/o8ILqhaHdSqLw==
   dependencies:
-    "@jest/types" "^25.4.0"
-    jest-regex-util "^25.2.6"
-    jest-snapshot "^25.4.0"
+    "@jest/types" "^26.0.1"
+    jest-regex-util "^26.0.0"
+    jest-snapshot "^26.0.1"
 
-jest-resolve@^25.4.0, jest-resolve@^25.5.1:
-  version "25.5.1"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-25.5.1.tgz#0e6fbcfa7c26d2a5fe8f456088dc332a79266829"
-  integrity sha512-Hc09hYch5aWdtejsUZhA+vSzcotf7fajSlPA6EZPE1RmPBAD39XtJhvHWFStid58iit4IPDLI/Da4cwdDmAHiQ==
+jest-resolve@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.0.1.tgz#21d1ee06f9ea270a343a8893051aeed940cde736"
+  integrity sha512-6jWxk0IKZkPIVTvq6s72RH735P8f9eCJW3IM5CX/SJFeKq1p2cZx0U49wf/SdMlhaB/anann5J2nCJj6HrbezQ==
   dependencies:
-    "@jest/types" "^25.5.0"
-    browser-resolve "^1.11.3"
-    chalk "^3.0.0"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
     graceful-fs "^4.2.4"
     jest-pnp-resolver "^1.2.1"
+    jest-util "^26.0.1"
     read-pkg-up "^7.0.1"
-    realpath-native "^2.0.0"
     resolve "^1.17.0"
     slash "^3.0.0"
 
-jest-runner@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.4.0.tgz#6ca4a3d52e692bbc081228fa68f750012f1f29e5"
-  integrity sha512-wWQSbVgj2e/1chFdMRKZdvlmA6p1IPujhpLT7TKNtCSl1B0PGBGvJjCaiBal/twaU2yfk8VKezHWexM8IliBfA==
+jest-runner@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.0.1.tgz#ea03584b7ae4bacfb7e533d680a575a49ae35d50"
+  integrity sha512-CApm0g81b49Znm4cZekYQK67zY7kkB4umOlI2Dx5CwKAzdgw75EN+ozBHRvxBzwo1ZLYZ07TFxkaPm+1t4d8jA==
   dependencies:
-    "@jest/console" "^25.4.0"
-    "@jest/environment" "^25.4.0"
-    "@jest/test-result" "^25.4.0"
-    "@jest/types" "^25.4.0"
-    chalk "^3.0.0"
-    exit "^0.1.2"
-    graceful-fs "^4.2.3"
-    jest-config "^25.4.0"
-    jest-docblock "^25.3.0"
-    jest-haste-map "^25.4.0"
-    jest-jasmine2 "^25.4.0"
-    jest-leak-detector "^25.4.0"
-    jest-message-util "^25.4.0"
-    jest-resolve "^25.4.0"
-    jest-runtime "^25.4.0"
-    jest-util "^25.4.0"
-    jest-worker "^25.4.0"
-    source-map-support "^0.5.6"
-    throat "^5.0.0"
-
-jest-runner@^25.5.4:
-  version "25.5.4"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-25.5.4.tgz#ffec5df3875da5f5c878ae6d0a17b8e4ecd7c71d"
-  integrity sha512-V/2R7fKZo6blP8E9BL9vJ8aTU4TH2beuqGNxHbxi6t14XzTb+x90B3FRgdvuHm41GY8ch4xxvf0ATH4hdpjTqg==
-  dependencies:
-    "@jest/console" "^25.5.0"
-    "@jest/environment" "^25.5.0"
-    "@jest/test-result" "^25.5.0"
-    "@jest/types" "^25.5.0"
-    chalk "^3.0.0"
+    "@jest/console" "^26.0.1"
+    "@jest/environment" "^26.0.1"
+    "@jest/test-result" "^26.0.1"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
     exit "^0.1.2"
     graceful-fs "^4.2.4"
-    jest-config "^25.5.4"
-    jest-docblock "^25.3.0"
-    jest-haste-map "^25.5.1"
-    jest-jasmine2 "^25.5.4"
-    jest-leak-detector "^25.5.0"
-    jest-message-util "^25.5.0"
-    jest-resolve "^25.5.1"
-    jest-runtime "^25.5.4"
-    jest-util "^25.5.0"
-    jest-worker "^25.5.0"
+    jest-config "^26.0.1"
+    jest-docblock "^26.0.0"
+    jest-haste-map "^26.0.1"
+    jest-jasmine2 "^26.0.1"
+    jest-leak-detector "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-resolve "^26.0.1"
+    jest-runtime "^26.0.1"
+    jest-util "^26.0.1"
+    jest-worker "^26.0.0"
     source-map-support "^0.5.6"
     throat "^5.0.0"
 
-jest-runtime@^25.4.0, jest-runtime@^25.5.4:
-  version "25.5.4"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-25.5.4.tgz#dc981fe2cb2137abcd319e74ccae7f7eeffbfaab"
-  integrity sha512-RWTt8LeWh3GvjYtASH2eezkc8AehVoWKK20udV6n3/gC87wlTbE1kIA+opCvNWyyPeBs6ptYsc6nyHUb1GlUVQ==
-  dependencies:
-    "@jest/console" "^25.5.0"
-    "@jest/environment" "^25.5.0"
-    "@jest/globals" "^25.5.2"
-    "@jest/source-map" "^25.5.0"
-    "@jest/test-result" "^25.5.0"
-    "@jest/transform" "^25.5.1"
-    "@jest/types" "^25.5.0"
+jest-runtime@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.0.1.tgz#a121a6321235987d294168e282d52b364d7d3f89"
+  integrity sha512-Ci2QhYFmANg5qaXWf78T2Pfo6GtmIBn2rRaLnklRyEucmPccmCKvS9JPljcmtVamsdMmkyNkVFb9pBTD6si9Lw==
+  dependencies:
+    "@jest/console" "^26.0.1"
+    "@jest/environment" "^26.0.1"
+    "@jest/fake-timers" "^26.0.1"
+    "@jest/globals" "^26.0.1"
+    "@jest/source-map" "^26.0.0"
+    "@jest/test-result" "^26.0.1"
+    "@jest/transform" "^26.0.1"
+    "@jest/types" "^26.0.1"
     "@types/yargs" "^15.0.0"
-    chalk "^3.0.0"
+    chalk "^4.0.0"
     collect-v8-coverage "^1.0.0"
     exit "^0.1.2"
     glob "^7.1.3"
     graceful-fs "^4.2.4"
-    jest-config "^25.5.4"
-    jest-haste-map "^25.5.1"
-    jest-message-util "^25.5.0"
-    jest-mock "^25.5.0"
-    jest-regex-util "^25.2.6"
-    jest-resolve "^25.5.1"
-    jest-snapshot "^25.5.1"
-    jest-util "^25.5.0"
-    jest-validate "^25.5.0"
-    realpath-native "^2.0.0"
+    jest-config "^26.0.1"
+    jest-haste-map "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-mock "^26.0.1"
+    jest-regex-util "^26.0.0"
+    jest-resolve "^26.0.1"
+    jest-snapshot "^26.0.1"
+    jest-util "^26.0.1"
+    jest-validate "^26.0.1"
     slash "^3.0.0"
     strip-bom "^4.0.0"
     yargs "^15.3.1"
@@ -6378,28 +6596,35 @@ jest-serializer@^25.5.0:
   dependencies:
     graceful-fs "^4.2.4"
 
-jest-snapshot@^25.4.0, jest-snapshot@^25.5.1:
-  version "25.5.1"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-25.5.1.tgz#1a2a576491f9961eb8d00c2e5fd479bc28e5ff7f"
-  integrity sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==
+jest-serializer@^26.0.0:
+  version "26.0.0"
+  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.0.0.tgz#f6c521ddb976943b93e662c0d4d79245abec72a3"
+  integrity sha512-sQGXLdEGWFAE4wIJ2ZaIDb+ikETlUirEOBsLXdoBbeLhTHkZUJwgk3+M8eyFizhM6le43PDCCKPA1hzkSDo4cQ==
+  dependencies:
+    graceful-fs "^4.2.4"
+
+jest-snapshot@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.0.1.tgz#1baa942bd83d47b837a84af7fcf5fd4a236da399"
+  integrity sha512-jxd+cF7+LL+a80qh6TAnTLUZHyQoWwEHSUFJjkw35u3Gx+BZUNuXhYvDqHXr62UQPnWo2P6fvQlLjsU93UKyxA==
   dependencies:
     "@babel/types" "^7.0.0"
-    "@jest/types" "^25.5.0"
-    "@types/prettier" "^1.19.0"
-    chalk "^3.0.0"
-    expect "^25.5.0"
+    "@jest/types" "^26.0.1"
+    "@types/prettier" "^2.0.0"
+    chalk "^4.0.0"
+    expect "^26.0.1"
     graceful-fs "^4.2.4"
-    jest-diff "^25.5.0"
-    jest-get-type "^25.2.6"
-    jest-matcher-utils "^25.5.0"
-    jest-message-util "^25.5.0"
-    jest-resolve "^25.5.1"
+    jest-diff "^26.0.1"
+    jest-get-type "^26.0.0"
+    jest-matcher-utils "^26.0.1"
+    jest-message-util "^26.0.1"
+    jest-resolve "^26.0.1"
     make-dir "^3.0.0"
     natural-compare "^1.4.0"
-    pretty-format "^25.5.0"
-    semver "^6.3.0"
+    pretty-format "^26.0.1"
+    semver "^7.3.2"
 
-jest-util@^25.4.0, jest-util@^25.5.0:
+jest-util@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-25.5.0.tgz#31c63b5d6e901274d264a4fec849230aa3fa35b0"
   integrity sha512-KVlX+WWg1zUTB9ktvhsg2PXZVdkI1NBevOJSkTKYAyXyH4QSvh+Lay/e/v+bmaFfrkfx43xD8QTfgobzlEXdIA==
@@ -6410,31 +6635,42 @@ jest-util@^25.4.0, jest-util@^25.5.0:
     is-ci "^2.0.0"
     make-dir "^3.0.0"
 
-jest-validate@^25.4.0, jest-validate@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-25.5.0.tgz#fb4c93f332c2e4cf70151a628e58a35e459a413a"
-  integrity sha512-okUFKqhZIpo3jDdtUXUZ2LxGUZJIlfdYBvZb1aczzxrlyMlqdnnws9MOxezoLGhSaFc2XYaHNReNQfj5zPIWyQ==
+jest-util@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.0.1.tgz#72c4c51177b695fdd795ca072a6f94e3d7cef00a"
+  integrity sha512-byQ3n7ad1BO/WyFkYvlWQHTsomB6GIewBh8tlGtusiylAlaxQ1UpS0XYH0ngOyhZuHVLN79Qvl6/pMiDMSSG1g==
   dependencies:
-    "@jest/types" "^25.5.0"
-    camelcase "^5.3.1"
-    chalk "^3.0.0"
-    jest-get-type "^25.2.6"
+    "@jest/types" "^26.0.1"
+    chalk "^4.0.0"
+    graceful-fs "^4.2.4"
+    is-ci "^2.0.0"
+    make-dir "^3.0.0"
+
+jest-validate@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.0.1.tgz#a62987e1da5b7f724130f904725e22f4e5b2e23c"
+  integrity sha512-u0xRc+rbmov/VqXnX3DlkxD74rHI/CfS5xaV2VpeaVySjbb1JioNVOyly5b56q2l9ZKe7bVG5qWmjfctkQb0bA==
+  dependencies:
+    "@jest/types" "^26.0.1"
+    camelcase "^6.0.0"
+    chalk "^4.0.0"
+    jest-get-type "^26.0.0"
     leven "^3.1.0"
-    pretty-format "^25.5.0"
+    pretty-format "^26.0.1"
 
-jest-watcher@^25.4.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-25.5.0.tgz#d6110d101df98badebe435003956fd4a465e8456"
-  integrity sha512-XrSfJnVASEl+5+bb51V0Q7WQx65dTSk7NL4yDdVjPnRNpM0hG+ncFmDYJo9O8jaSRcAitVbuVawyXCRoxGrT5Q==
+jest-watcher@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.0.1.tgz#5b5e3ebbdf10c240e22a98af66d645631afda770"
+  integrity sha512-pdZPydsS8475f89kGswaNsN3rhP6lnC3/QDCppP7bg1L9JQz7oU9Mb/5xPETk1RHDCWeqmVC47M4K5RR7ejxFw==
   dependencies:
-    "@jest/test-result" "^25.5.0"
-    "@jest/types" "^25.5.0"
+    "@jest/test-result" "^26.0.1"
+    "@jest/types" "^26.0.1"
     ansi-escapes "^4.2.1"
-    chalk "^3.0.0"
-    jest-util "^25.5.0"
-    string-length "^3.1.0"
+    chalk "^4.0.0"
+    jest-util "^26.0.1"
+    string-length "^4.0.1"
 
-jest-worker@^25.4.0, jest-worker@^25.5.0:
+jest-worker@^25.5.0:
   version "25.5.0"
   resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1"
   integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw==
@@ -6450,14 +6686,14 @@ jest-worker@^26.0.0:
     merge-stream "^2.0.0"
     supports-color "^7.0.0"
 
-jest@^25.4.0:
-  version "25.4.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-25.4.0.tgz#fb96892c5c4e4a6b9bcb12068849cddf4c5f8cc7"
-  integrity sha512-XWipOheGB4wai5JfCYXd6vwsWNwM/dirjRoZgAa7H2wd8ODWbli2AiKjqG8AYhyx+8+5FBEdpO92VhGlBydzbw==
+jest@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-26.0.1.tgz#5c51a2e58dff7525b65f169721767173bf832694"
+  integrity sha512-29Q54kn5Bm7ZGKIuH2JRmnKl85YRigp0o0asTc6Sb6l2ch1DCXIeZTLLFy9ultJvhkTqbswF5DEx4+RlkmCxWg==
   dependencies:
-    "@jest/core" "^25.4.0"
+    "@jest/core" "^26.0.1"
     import-local "^3.0.2"
-    jest-cli "^25.4.0"
+    jest-cli "^26.0.1"
 
 js-base64@^2.1.9:
   version "2.5.2"
@@ -6474,7 +6710,15 @@ js-string-escape@1.0.1:
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-yaml@^3.13.1, js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4, js-yaml@^3.9.0:
+js-yaml@^3.13.1:
+  version "3.14.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+  integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
+js-yaml@^3.4.6, js-yaml@^3.5.1, js-yaml@^3.5.4:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==
@@ -6487,36 +6731,36 @@ jsbn@~0.1.0:
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
   integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
-jsdom@^15.2.1:
-  version "15.2.1"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-15.2.1.tgz#d2feb1aef7183f86be521b8c6833ff5296d07ec5"
-  integrity sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==
+jsdom@^16.2.2:
+  version "16.2.2"
+  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.2.2.tgz#76f2f7541646beb46a938f5dc476b88705bedf2b"
+  integrity sha512-pDFQbcYtKBHxRaP55zGXCJWgFHkDAYbKcsXEK/3Icu9nKYZkutUXfLBwbD+09XDutkYSHcgfQLZ0qvpAAm9mvg==
   dependencies:
-    abab "^2.0.0"
-    acorn "^7.1.0"
-    acorn-globals "^4.3.2"
-    array-equal "^1.0.0"
-    cssom "^0.4.1"
-    cssstyle "^2.0.0"
-    data-urls "^1.1.0"
-    domexception "^1.0.1"
-    escodegen "^1.11.1"
-    html-encoding-sniffer "^1.0.2"
+    abab "^2.0.3"
+    acorn "^7.1.1"
+    acorn-globals "^6.0.0"
+    cssom "^0.4.4"
+    cssstyle "^2.2.0"
+    data-urls "^2.0.0"
+    decimal.js "^10.2.0"
+    domexception "^2.0.1"
+    escodegen "^1.14.1"
+    html-encoding-sniffer "^2.0.1"
+    is-potential-custom-element-name "^1.0.0"
     nwsapi "^2.2.0"
-    parse5 "5.1.0"
-    pn "^1.1.0"
-    request "^2.88.0"
-    request-promise-native "^1.0.7"
-    saxes "^3.1.9"
-    symbol-tree "^3.2.2"
+    parse5 "5.1.1"
+    request "^2.88.2"
+    request-promise-native "^1.0.8"
+    saxes "^5.0.0"
+    symbol-tree "^3.2.4"
     tough-cookie "^3.0.1"
-    w3c-hr-time "^1.0.1"
-    w3c-xmlserializer "^1.1.2"
-    webidl-conversions "^4.0.2"
+    w3c-hr-time "^1.0.2"
+    w3c-xmlserializer "^2.0.0"
+    webidl-conversions "^6.0.0"
     whatwg-encoding "^1.0.5"
     whatwg-mimetype "^2.3.0"
-    whatwg-url "^7.0.0"
-    ws "^7.0.0"
+    whatwg-url "^8.0.0"
+    ws "^7.2.3"
     xml-name-validator "^3.0.0"
 
 jsesc@^2.5.1:
@@ -6620,9 +6864,9 @@ jsprim@^1.2.2:
     verror "1.10.0"
 
 jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.3.0.tgz#edd727794ea284d7fda575015ed1b0cde0289ab6"
-  integrity sha512-3HNoc7nZ1hpZIKB3hJ7BlFRkzCx2BynRtfSwbkqZdpRdvAPsGMnzclPwrvDBS7/lalHTj21NwIeaEpysHBOudg==
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e"
+  integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==
   dependencies:
     array-includes "^3.1.1"
     object.assign "^4.1.0"
@@ -6732,6 +6976,15 @@ loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4
     emojis-list "^3.0.0"
     json5 "^1.0.1"
 
+loader-utils@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
+  integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^2.1.2"
+
 locate-path@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -6830,13 +7083,6 @@ loglevel@^1.6.8:
   resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171"
   integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==
 
-lolex@^5.0.0:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367"
-  integrity sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==
-  dependencies:
-    "@sinonjs/commons" "^1.7.0"
-
 loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -6958,6 +7204,11 @@ merge-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
   integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
 
+merge2@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
 merge@^1.2.0:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
@@ -7082,9 +7333,9 @@ minipass-flush@^1.0.5:
     minipass "^3.0.0"
 
 minipass-pipeline@^1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a"
-  integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==
+  version "1.2.3"
+  resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34"
+  integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==
   dependencies:
     minipass "^3.0.0"
 
@@ -7161,13 +7412,6 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
-move-file@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/move-file/-/move-file-2.0.0.tgz#83ffa309b5d7f69d518b28e1333e2ffadf331e3e"
-  integrity sha512-cdkdhNCgbP5dvS4tlGxZbD+nloio9GIimP57EjqFhwLcMjnU+XJKAZzlmg/TN/AK1LuNAdTSvm3CPPP4Xkv0iQ==
-  dependencies:
-    path-exists "^4.0.0"
-
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7313,21 +7557,22 @@ node-modules-regexp@^1.0.0:
   resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
   integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
 
-node-notifier@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-6.0.0.tgz#cea319e06baa16deec8ce5cd7f133c4a46b68e12"
-  integrity sha512-SVfQ/wMw+DesunOm5cKqr6yDcvUTDl/yc97ybGHMrteNEY6oekXpNpS3lZwgLlwz0FLgHoiW28ZpmBHUDg37cw==
+node-notifier@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-7.0.1.tgz#a355e33e6bebacef9bf8562689aed0f4230ca6f9"
+  integrity sha512-VkzhierE7DBmQEElhTGJIoiZa1oqRijOtgOlsXg32KrJRXsPy0NXFBqWGW/wTswnJlDCs5viRYaqWguqzsKcmg==
   dependencies:
     growly "^1.3.0"
     is-wsl "^2.1.1"
-    semver "^6.3.0"
+    semver "^7.2.1"
     shellwords "^0.1.1"
-    which "^1.3.1"
+    uuid "^7.0.3"
+    which "^2.0.2"
 
 node-releases@^1.1.53:
-  version "1.1.56"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.56.tgz#bc054a417d316e3adac90eafb7e1932802f28705"
-  integrity sha512-EVo605FhWLygH8a64TjgpjyHYOihkxECwX1bHHr8tETJKWEiWS2YJjPbvsX2jFjnjTNEgBCmk9mLjKG1Mf11cw==
+  version "1.1.58"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935"
+  integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg==
 
 normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
   version "2.5.0"
@@ -7482,13 +7727,12 @@ object.assign@^4.1.0:
     object-keys "^1.0.11"
 
 object.entries@^1.1.0, object.entries@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b"
-  integrity sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
+  integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
   dependencies:
     define-properties "^1.1.3"
-    es-abstract "^1.17.0-next.1"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
     has "^1.0.3"
 
 object.fromentries@^2.0.2:
@@ -7574,9 +7818,9 @@ onetime@^5.1.0:
     mimic-fn "^2.1.0"
 
 opencollective-postinstall@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
-  integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
+  integrity sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==
 
 opener@^1.5.1:
   version "1.5.1"
@@ -7648,11 +7892,6 @@ p-finally@^1.0.0:
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
   integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
 
-p-finally@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561"
-  integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==
-
 p-is-promise@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
@@ -7665,7 +7904,7 @@ p-limit@^1.1.0:
   dependencies:
     p-try "^1.0.0"
 
-p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.3.0:
+p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
   integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
@@ -7805,10 +8044,10 @@ parse-passwd@^1.0.0:
   resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
   integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
 
-parse5@5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
-  integrity sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==
+parse5@5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
 
 parse5@^3.0.1:
   version "3.0.3"
@@ -7896,22 +8135,15 @@ path-type@^2.0.0:
   dependencies:
     pify "^2.0.0"
 
-path-type@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
-  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
-  dependencies:
-    pify "^3.0.0"
-
 path-type@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
 pbkdf2@^3.0.3:
-  version "3.0.17"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
-  integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -7989,11 +8221,6 @@ pify@^2.0.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
   integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 
-pify@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
-  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
-
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@@ -8051,11 +8278,6 @@ pluralize@^1.2.1:
   resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45"
   integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=
 
-pn@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
-  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
-
 portfinder@^1.0.26:
   version "1.0.26"
   resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
@@ -8127,11 +8349,11 @@ postcss-discard-overridden@^4.0.1:
     postcss "^7.0.0"
 
 postcss-load-config@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484"
-  integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ==
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
+  integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
   dependencies:
-    cosmiconfig "^4.0.0"
+    cosmiconfig "^5.0.0"
     import-cwd "^2.0.0"
 
 postcss-loader@^3.0.0:
@@ -8400,7 +8622,7 @@ postcss-value-parser@^3.0.0:
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
   integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
 
-postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3:
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
   integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
@@ -8415,10 +8637,10 @@ postcss@^5.0.16:
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
-  version "7.0.29"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.29.tgz#d3a903872bd52280b83bce38cdc83ce55c06129e"
-  integrity sha512-ba0ApvR3LxGvRMMiUa9n0WR4HjzcYm7tS+ht4/2Nd0NLtHpPIH77fuB9Xh1/yJVz9O/E/95Y/dn8ygWsyffXtw==
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.32"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+  integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -8435,9 +8657,9 @@ postgres-bytea@~1.0.0:
   integrity sha1-AntTPAqokOJtFy1Hz5zOzFIazTU=
 
 postgres-date@~1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8"
-  integrity sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g=
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.5.tgz#710b27de5f27d550f6e80b5d34f7ba189213c2ee"
+  integrity sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA==
 
 postgres-interval@^1.1.0:
   version "1.2.0"
@@ -8456,12 +8678,12 @@ prepend-http@^1.0.0:
   resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
   integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
 
-pretty-format@^25.5.0:
-  version "25.5.0"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a"
-  integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==
+pretty-format@^26.0.1:
+  version "26.0.1"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.0.1.tgz#a4fe54fe428ad2fd3413ca6bbd1ec8c2e277e197"
+  integrity sha512-SWxz6MbupT3ZSlL0Po4WF/KujhQaVehijR2blyRDCzk9e45EaYMVhMBn49fnRuHxtkSpXTes1GxNpVmH86Bxfw==
   dependencies:
-    "@jest/types" "^25.5.0"
+    "@jest/types" "^26.0.1"
     ansi-regex "^5.0.0"
     ansi-styles "^4.0.0"
     react-is "^16.12.0"
@@ -8672,7 +8894,7 @@ randexp@0.4.6:
     discontinuous-range "1.0.0"
     ret "~0.1.10"
 
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
   integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
@@ -8713,11 +8935,11 @@ react-dom@^16.13.1:
     scheduler "^0.19.1"
 
 react-event-listener@^0.6.0:
-  version "0.6.5"
-  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.5.tgz#d374dbe5da485c9f9d4702f0e76971afbe9b6b2e"
-  integrity sha512-//lCxOM3DQ0+xmTa/u9mI9mm55zCPdIKp89d8MGjlNsOOnXQ5sFDD1eed+sMBzQXKiRBLBMtSg/2T9RJFtfovw==
+  version "0.6.6"
+  resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a"
+  integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw==
   dependencies:
-    "@babel/runtime" "7.2.0"
+    "@babel/runtime" "^7.2.0"
     prop-types "^15.6.0"
     warning "^4.0.1"
 
@@ -8739,12 +8961,10 @@ react-immutable-proptypes@^2.2.0:
   dependencies:
     invariant "^2.2.2"
 
-react-immutable-pure-component@^1.1.1:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-1.2.3.tgz#fa33638df68cfe9f73ccbee1d5861c17f3053f86"
-  integrity sha512-kNy2A/fDrSuR8TKwB+4ynmItmp1vgF87tWxxfmadwDYo2J3ANipHqTjDIBvJvJ7libvuh76jIbvmK0krjtKH1g==
-  optionalDependencies:
-    "@types/react" "16.4.6"
+react-immutable-pure-component@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/react-immutable-pure-component/-/react-immutable-pure-component-2.2.2.tgz#3014d3e20cd5a7a4db73b81f1f1464f4d351684b"
+  integrity sha512-vkgoMJUDqHZfXXnjVlG3keCxSO/U6WeDQ5/Sl0GK2cH8TOxEzQ5jXqDXHEL/jqk6fsNxV05oH5kD7VNMUE2k+A==
 
 react-infinite-scroller@^1.0.12:
   version "1.2.4"
@@ -8942,13 +9162,14 @@ react-test-renderer@^16.0.0-0, react-test-renderer@^16.13.1:
     react-is "^16.8.6"
     scheduler "^0.19.1"
 
-react-textarea-autosize@^7.1.2:
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda"
-  integrity sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg==
+react-textarea-autosize@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.0.1.tgz#fce0dbf6a59b7b9d892c6af40b6be06a29f62c49"
+  integrity sha512-Qs7Lm17F0CIsWeDaUcHPpP22etVQHkayOcMgOXTfVasVToS6G+IL+5a7ECZtbDR2qTgTRIXjYcLmuZUuTX4tNA==
   dependencies:
-    "@babel/runtime" "^7.1.2"
-    prop-types "^15.6.0"
+    "@babel/runtime" "^7.8.4"
+    use-composed-ref "^1.0.0"
+    use-latest "^1.0.0"
 
 react-toggle@^4.1.1:
   version "4.1.1"
@@ -9132,9 +9353,9 @@ regenerate-unicode-properties@^8.2.0:
     regenerate "^1.4.0"
 
 regenerate@^1.4.0:
-  version "1.4.0"
-  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
-  integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f"
+  integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==
 
 regenerator-runtime@^0.11.0:
   version "0.11.1"
@@ -9193,9 +9414,9 @@ regexpu-core@^4.6.0, regexpu-core@^4.7.0:
     unicode-match-property-value-ecmascript "^1.2.0"
 
 regjsgen@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
-  integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
+  integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
 
 regjsparser@^0.6.4:
   version "0.6.4"
@@ -9231,7 +9452,7 @@ request-promise-core@1.1.3:
   dependencies:
     lodash "^4.17.15"
 
-request-promise-native@^1.0.7:
+request-promise-native@^1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
   integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
@@ -9240,7 +9461,7 @@ request-promise-native@^1.0.7:
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
-request@^2.88.0:
+request@^2.88.2:
   version "2.88.2"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
   integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -9276,7 +9497,7 @@ require-directory@^2.1.1:
   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
   integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
 
-require-from-string@^2.0.1, require-from-string@^2.0.2:
+require-from-string@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
   integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
@@ -9366,11 +9587,6 @@ resolve-url@^0.2.1:
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
   integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
-resolve@1.1.7:
-  version "1.1.7"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
-  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-
 resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.8.1:
   version "1.17.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
@@ -9404,6 +9620,11 @@ retry@^0.12.0:
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
   integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
 
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
 rgb-regex@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
@@ -9470,6 +9691,11 @@ run-async@^2.2.0:
   dependencies:
     is-promise "^2.1.0"
 
+run-parallel@^1.1.9:
+  version "1.1.9"
+  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679"
+  integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==
+
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
@@ -9569,12 +9795,12 @@ sax@~1.2.4:
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-saxes@^3.1.9:
-  version "3.1.11"
-  resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
-  integrity sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==
+saxes@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+  integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
   dependencies:
-    xmlchars "^2.1.1"
+    xmlchars "^2.2.0"
 
 scheduler@^0.19.1:
   version "0.19.1"
@@ -9593,12 +9819,13 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
-schema-utils@^2.2.0, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6:
-  version "2.6.6"
-  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c"
-  integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==
+schema-utils@^2.2.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+  integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
   dependencies:
-    ajv "^6.12.0"
+    "@types/json-schema" "^7.0.4"
+    ajv "^6.12.2"
     ajv-keywords "^3.4.1"
 
 scroll-behavior@^0.9.1:
@@ -9641,6 +9868,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.0:
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
   integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
+semver@^7.2.1, semver@^7.3.2:
+  version "7.3.2"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938"
+  integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==
+
 send@0.17.1:
   version "0.17.1"
   resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
@@ -9665,10 +9897,12 @@ serialize-javascript@^2.1.2:
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
   integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
 
-serialize-javascript@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e"
-  integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==
+serialize-javascript@^3.0.0, serialize-javascript@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+  integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
+  dependencies:
+    randombytes "^2.1.0"
 
 serve-index@^1.9.1:
   version "1.9.1"
@@ -10042,10 +10276,12 @@ stack-generator@^2.0.5:
   dependencies:
     stackframe "^1.1.1"
 
-stack-utils@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
-  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
+stack-utils@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.2.tgz#5cf48b4557becb4638d0bc4f21d23f5d19586593"
+  integrity sha512-0H7QK2ECz3fyZMzQ8rH0j2ykpfbnd20BFtfg/SqVC2+sCTtcw0aDTGB7dk+de4U4uUeuz6nOtJcrkFFLG1B0Rg==
+  dependencies:
+    escape-string-regexp "^2.0.0"
 
 stackframe@^1.1.1:
   version "1.1.1"
@@ -10124,13 +10360,13 @@ strict-uri-encode@^1.0.0:
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
   integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
 
-string-length@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/string-length/-/string-length-3.1.0.tgz#107ef8c23456e187a8abd4a61162ff4ac6e25837"
-  integrity sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==
+string-length@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1"
+  integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw==
   dependencies:
-    astral-regex "^1.0.0"
-    strip-ansi "^5.2.0"
+    char-regex "^1.0.2"
+    strip-ansi "^6.0.0"
 
 string-width@^1.0.1:
   version "1.0.2"
@@ -10188,7 +10424,7 @@ string.prototype.trim@^1.2.1:
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
 
-string.prototype.trimend@^1.0.0:
+string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
   integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
@@ -10214,7 +10450,7 @@ string.prototype.trimright@^2.1.1:
     es-abstract "^1.17.5"
     string.prototype.trimend "^1.0.0"
 
-string.prototype.trimstart@^1.0.0:
+string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
   integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
@@ -10380,7 +10616,7 @@ symbol-observable@^1.2.0:
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
   integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
 
-symbol-tree@^3.2.2:
+symbol-tree@^3.2.4:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
@@ -10452,17 +10688,17 @@ terser-webpack-plugin@^1.4.3:
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
-terser-webpack-plugin@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.1.tgz#31928c9330a582fb5ec6f90805337289b85cb8fe"
-  integrity sha512-eFDtq8qPUEa9hXcUzTwKXTnugIVtlqc1Z/ZVhG8LmRT3lgRY13+pQTnFLY2N7ATB6TKCHuW/IGjoAnZz9wOIqw==
+terser-webpack-plugin@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz#23bda2687b197f878a743373b9411d917adc2e45"
+  integrity sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==
   dependencies:
-    cacache "^15.0.3"
+    cacache "^15.0.4"
     find-cache-dir "^3.3.1"
     jest-worker "^26.0.0"
     p-limit "^2.3.0"
     schema-utils "^2.6.6"
-    serialize-javascript "^3.0.0"
+    serialize-javascript "^3.1.0"
     source-map "^0.6.1"
     terser "^4.6.13"
     webpack-sources "^1.4.3"
@@ -10645,18 +10881,33 @@ tough-cookie@^3.0.1:
     psl "^1.1.28"
     punycode "^2.1.1"
 
-tr46@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
-  integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
+tr46@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
+  integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
   dependencies:
-    punycode "^2.1.0"
+    punycode "^2.1.1"
 
 tryer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
   integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
+ts-essentials@^2.0.3:
+  version "2.0.12"
+  resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz#c9303f3d74f75fa7528c3d49b80e089ab09d8745"
+  integrity sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==
+
+tsconfig-paths@^3.9.0:
+  version "3.9.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
+  integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.1"
+    minimist "^1.2.0"
+    strip-bom "^3.0.0"
+
 tslib@^1.9.0:
   version "1.13.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
@@ -10849,6 +11100,18 @@ url@^0.11.0:
     punycode "1.3.2"
     querystring "0.2.0"
 
+use-composed-ref@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.0.0.tgz#bb13e8f4a0b873632cde4940abeb88b92d03023a"
+  integrity sha512-RVqY3NFNjZa0xrmK3bIMWNmQ01QjKPDc7DeWR3xa/N8aliVppuutOE5bZzPkQfvL+5NRWMMp0DJ99Trd974FIw==
+  dependencies:
+    ts-essentials "^2.0.3"
+
+use-latest@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.0.0.tgz#c86d2e4893b15f27def69da574a47136d107facb"
+  integrity sha512-CxmFi75KTXeTIBlZq3LhJ4Hz98pCaRKZHCpnbiaEHIr5QnuHvH8lKYoluPBt/ik7j/hFVPB8K3WqF6mQvLyQTg==
+
 use@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -10907,6 +11170,11 @@ uuid@^3.3.2, uuid@^3.4.0:
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
+uuid@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b"
+  integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==
+
 uuid@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d"
@@ -10964,24 +11232,22 @@ verror@1.10.0:
     extsprintf "^1.2.0"
 
 vm-browserify@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
-  integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
-w3c-hr-time@^1.0.1:
+w3c-hr-time@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
   integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
   dependencies:
     browser-process-hrtime "^1.0.0"
 
-w3c-xmlserializer@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
-  integrity sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==
+w3c-xmlserializer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+  integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
   dependencies:
-    domexception "^1.0.1"
-    webidl-conversions "^4.0.2"
     xml-name-validator "^3.0.0"
 
 walker@^1.0.7, walker@~1.0.5:
@@ -11035,10 +11301,15 @@ wbuf@^1.1.0, wbuf@^1.7.3:
   dependencies:
     minimalistic-assert "^1.0.0"
 
-webidl-conversions@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
-  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+webidl-conversions@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+  integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.0.0:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+  integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
 
 webpack-assets-manifest@^3.1.1:
   version "3.1.1"
@@ -11053,10 +11324,10 @@ webpack-assets-manifest@^3.1.1:
     tapable "^1.0.0"
     webpack-sources "^1.0.0"
 
-webpack-bundle-analyzer@^3.7.0:
-  version "3.7.0"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.7.0.tgz#84da434e89442899b884d9ad38e466d0db02a56f"
-  integrity sha512-mETdjZ30a3Yf+NTB/wqTgACK7rAYQl5uxKK0WVTNmF0sM3Uv8s3R58YZMW7Rhu0Lk2Rmuhdj5dcH5Q76zCDVdA==
+webpack-bundle-analyzer@^3.8.0:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz#ce6b3f908daf069fd1f7266f692cbb3bded9ba16"
+  integrity sha512-PODQhAYVEourCcOuU+NiYI7WdR8QyELZGgPvB1y2tjbUpbmcQOt5Q7jEK+ttd5se0KSBKD9SXHCEozS++Wllmw==
   dependencies:
     acorn "^7.1.1"
     acorn-walk "^7.1.1"
@@ -11208,30 +11479,30 @@ websocket-driver@>=0.5.1:
     websocket-extensions ">=0.1.1"
 
 websocket-extensions@>=0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
-  integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+  integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
+whatwg-encoding@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
   integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
   dependencies:
     iconv-lite "0.4.24"
 
-whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
+whatwg-mimetype@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
   integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
 
-whatwg-url@^7.0.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
-  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
+whatwg-url@^8.0.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.1.0.tgz#c628acdcf45b82274ce7281ee31dd3c839791771"
+  integrity sha512-vEIkwNi9Hqt4TV9RdnaBPNt+E2Sgmo3gePebCRgZ1R7g6d23+53zCTnuB0amKI4AXq6VM8jj2DUAa0S1vjJxkw==
   dependencies:
     lodash.sortby "^4.7.0"
-    tr46 "^1.0.1"
-    webidl-conversions "^4.0.2"
+    tr46 "^2.0.2"
+    webidl-conversions "^5.0.0"
 
 which-module@^2.0.0:
   version "2.0.0"
@@ -11330,7 +11601,7 @@ ws@^6.0.0, ws@^6.2.1:
   dependencies:
     async-limiter "~1.0.0"
 
-ws@^7.0.0:
+ws@^7.2.3:
   version "7.3.0"
   resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd"
   integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==
@@ -11340,7 +11611,7 @@ xml-name-validator@^3.0.0:
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
-xmlchars@^2.1.1:
+xmlchars@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
   integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==