Merge branch 'develop' into issue/1383
authorMaksim Pechnikov <parallel588@gmail.com>
Tue, 28 Jan 2020 17:34:13 +0000 (20:34 +0300)
committerMaksim Pechnikov <parallel588@gmail.com>
Tue, 28 Jan 2020 17:39:20 +0000 (20:39 +0300)
44 files changed:
CHANGELOG.md
config/config.exs
config/description.exs
docs/administration/CLI_tasks/email.md [new file with mode: 0644]
docs/configuration/howto_user_recomendation.md [deleted file]
docs/introduction.md
lib/mix/tasks/pleroma/email.ex [new file with mode: 0644]
lib/pleroma/emails/admin_email.ex
lib/pleroma/user.ex
lib/pleroma/user_relationship.ex
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/controller_helper.ex
lib/pleroma/web/feed/feed_view.ex
lib/pleroma/web/feed/tag_controller.ex [new file with mode: 0644]
lib/pleroma/web/feed/user_controller.ex [moved from lib/pleroma/web/feed/feed_controller.ex with 84% similarity]
lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex
lib/pleroma/web/metadata/feed.ex
lib/pleroma/web/metadata/utils.ex
lib/pleroma/web/nodeinfo/nodeinfo_controller.ex
lib/pleroma/web/rich_media/parsers/meta_tags_parser.ex
lib/pleroma/web/router.ex
lib/pleroma/web/templates/feed/feed/_activity.xml.eex
lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex [new file with mode: 0644]
lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex [new file with mode: 0644]
lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex [new file with mode: 0644]
lib/pleroma/web/templates/feed/feed/tag.atom.eex [new file with mode: 0644]
lib/pleroma/web/templates/feed/feed/tag.rss.eex [new file with mode: 0644]
lib/pleroma/web/templates/feed/feed/user.xml.eex [moved from lib/pleroma/web/templates/feed/feed/feed.xml.eex with 67% similarity]
lib/pleroma/workers/attachments_cleanup_worker.ex
mix.exs
mix.lock
priv/gettext/fr/LC_MESSAGES/errors.po [new file with mode: 0644]
test/emails/admin_email_test.exs
test/fixtures/margaret-corbin-grave-west-point.html [new file with mode: 0644]
test/formatter_test.exs
test/object_test.exs
test/runtime_test.exs
test/support/http_request_mock.ex
test/tasks/email_test.exs [new file with mode: 0644]
test/user_test.exs
test/web/feed/tag_controller_test.exs [new file with mode: 0644]
test/web/feed/user_controller_test.exs [moved from test/web/feed/feed_controller_test.exs with 97% similarity]
test/web/mastodon_api/controllers/suggestion_controller_test.exs
test/web/rich_media/parsers/twitter_card_test.exs

index 4d626a6836e4660592b266e194a7f0aec979ccf5..e5f4d848a9c4c944667eddb2f059edbd7461e90c 100644 (file)
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - **Breaking**: Removed 1.0+ deprecated configurations `Pleroma.Upload, :strip_exif` and `:instance, :dedupe_media`
 - **Breaking**: OStatus protocol support
 - **Breaking**: MDII uploader
+- **Breaking**: Using third party engines for user recommendation
 
 ### Changed
 - **Breaking:** Pleroma won't start if it detects unapplied migrations
@@ -56,6 +57,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Static Frontend: Add the ability to render user profiles and notices server-side without requiring JS app.
 - Mix task to re-count statuses for all users (`mix pleroma.count_statuses`)
 - Mix task to list all users (`mix pleroma.user list`)
+- Mix task to send a test email (`mix pleroma.email test`)
 - Support for `X-Forwarded-For` and similar HTTP headers which used by reverse proxies to pass a real user IP address to the backend. Must not be enabled unless your instance is behind at least one reverse proxy (such as Nginx, Apache HTTPD or Varnish Cache).
 - MRF: New module which handles incoming posts based on their age. By default, all incoming posts that are older than 2 days will be unlisted and not shown to their followers.
 - User notification settings: Add `privacy_option` option.
@@ -100,6 +102,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Mastodon API: Change emoji reaction reply format
 - Notifications: Added `pleroma:emoji_reaction` notification type
 - Mastodon API: Change emoji reaction reply format once more
+- Configuration: `feed.logo` option for tag feed.
+- Tag feed: `/tags/:tag.rss` - list public statuses by hashtag.
 </details>
 
 ### Fixed
index 62aef5cf3d2462d879f01d4c427615f6dfb6d0a5..696b8ebf44246b8da63affe665f97ae8757f928b 100644 (file)
@@ -411,14 +411,6 @@ config :pleroma, Pleroma.Web.Metadata,
   ],
   unfurl_nsfw: false
 
-config :pleroma, :suggestions,
-  enabled: false,
-  third_party_engine:
-    "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}",
-  timeout: 300_000,
-  limit: 40,
-  web: "https://vinayaka.distsn.org"
-
 config :pleroma, :http_security,
   enabled: true,
   sts: false,
index 7829497fef59823a15d90c76fb54de2d8d3b404b..434fc2ef1682a5e2e0d549885e7fe78c9f9353ac 100644 (file)
@@ -1167,7 +1167,7 @@ config :pleroma, :config_description, [
             label: "Logo margin",
             type: :string,
             description:
-              "allows you to adjust vertical margins between logo boundary and navbar borders. " <>
+              "Allows you to adjust vertical margins between logo boundary and navbar borders. " <>
                 "The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.",
             suggestions: [".1em"]
           },
@@ -1960,7 +1960,7 @@ config :pleroma, :config_description, [
       },
       %{
         key: :verbose,
-        type: :atom,
+        type: [:atom, false],
         description: "Logs verbose mode",
         suggestions: [false, :error, :warn, :info, :debug]
       },
@@ -2741,43 +2741,6 @@ config :pleroma, :config_description, [
       }
     ]
   },
-  %{
-    group: :pleroma,
-    key: :suggestions,
-    type: :group,
-    children: [
-      %{
-        key: :enabled,
-        type: :boolean,
-        description: "Enables suggestions"
-      },
-      %{
-        key: :third_party_engine,
-        type: :string,
-        description: "URL for third party engine",
-        suggestions: [
-          "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}"
-        ]
-      },
-      %{
-        key: :timeout,
-        type: :integer,
-        description: "Request timeout to third party engine",
-        suggestions: [300_000]
-      },
-      %{
-        key: :limit,
-        type: :integer,
-        description: "Limit for suggestions",
-        suggestions: [40]
-      },
-      %{
-        key: :web,
-        type: :string,
-        suggestions: ["https://vinayaka.distsn.org"]
-      }
-    ]
-  },
   %{
     group: :prometheus,
     key: Pleroma.Web.Endpoint.MetricsExporter,
diff --git a/docs/administration/CLI_tasks/email.md b/docs/administration/CLI_tasks/email.md
new file mode 100644 (file)
index 0000000..7b7a845
--- /dev/null
@@ -0,0 +1,24 @@
+# Managing emails
+
+{! backend/administration/CLI_tasks/general_cli_task_info.include !}
+
+## Send test email (instance email by default)
+
+```sh tab="OTP"
+ ./bin/pleroma_ctl email test [--to <destination email address>]
+```
+
+```sh tab="From Source"
+mix pleroma.email test [--to <destination email address>]
+```
+
+
+Example: 
+
+```sh tab="OTP"
+./bin/pleroma_ctl email test --to root@example.org
+```
+
+```sh tab="From Source"
+mix pleroma.email test --to root@example.org
+```
diff --git a/docs/configuration/howto_user_recomendation.md b/docs/configuration/howto_user_recomendation.md
deleted file mode 100644 (file)
index c4d749d..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# How to activate user recommendation (Who to follow panel)
-![who-to-follow-panel-small](/uploads/9de1b1300436c32461d272945f1bc23e/who-to-follow-panel-small.png)
-
-To show the *who to follow* panel, edit `config/prod.secret.exs` in the Pleroma backend. Following code activates the *who to follow* panel:
-
-```elixir
-config :pleroma, :suggestions,
-  enabled: true,
-  third_party_engine:
-    "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}",
-  timeout: 300_000,
-  limit: 40,
-  web: "https://vinayaka.distsn.org"
-
-```
-
-`config/config.exs` already includes this code, but `enabled:` is `false`.
-
-`/api/v1/suggestions` is also provided when *who to follow* panel is enabled.
-
-For advanced customization, following code shows the newcomers of the fediverse at the *who to follow* panel:
-
-```elixir
-config :pleroma, :suggestions,
-  enabled: true,
-  third_party_engine:
-    "http://vinayaka.distsn.org/cgi-bin/vinayaka-user-new-suggestions-api.cgi?{{host}}+{{user}}",
-  timeout: 60_000,
-  limit: 40,
-  web: "https://vinayaka.distsn.org/user-new.html"
-```
index 045dc7c0501816a450af42388a9f3d165a7b1826..823e14f53ce6fb4ab24e1b9fb031e541850f69c9 100644 (file)
@@ -3,53 +3,63 @@
 Pleroma is a federated social networking platform, compatible with GNU social, Mastodon and other OStatus and ActivityPub implementations. It is free software licensed under the AGPLv3.
 It actually consists of two components: a backend, named simply Pleroma, and a user-facing frontend, named Pleroma-FE. It also includes the Mastodon frontend, if that's your thing.
 It's part of what we call the fediverse, a federated network of instances which speak common protocols and can communicate with each other.
-One account on a instance is enough to talk to the entire fediverse!
+One account on an instance is enough to talk to the entire fediverse!
 
 ## How can I use it?
 
-Pleroma instances are already widely deployed, a list can be found here:
-http://distsn.org/pleroma-instances.html
+Pleroma instances are already widely deployed, a list can be found at <http://distsn.org/pleroma-instances.html>. Information on all existing fediverse instances can be found at <https://fediverse.network/>.
 
 If you don't feel like joining an existing instance, but instead prefer to deploy your own instance, that's easy too!
-Installation instructions can be found here:
-[main Pleroma wiki](/)
+Installation instructions can be found in the installation section of these docs.
 
 ## I got an account, now what?
-Great! Now you can explore the fediverse!
-- Open the login page for your Pleroma instance (for ex. https://pleroma.soykaf.com) and login with your username and password.
-(If you don't have one yet, click on Register) :slightly_smiling_face:
+Great! Now you can explore the fediverse! Open the login page for your Pleroma instance (e.g. <https://pleroma.soykaf.com>) and login with your username and password. (If you don't have an account yet, click on Register)
 
 At this point you will have two columns in front of you.
 
 ### Left column
-- first block: here you can see your avatar, your nickname a bio, and statistics (Statuses, Following, Followers).
-Under that you have a text form which allows you to post new statuses. The icon on the left is for uploading media files and attach them to your post. The number under the text form is a character counter, every instance can have a different character limit (the default is 5000).
-If you want to mention someone, type @ + name of the person. A drop-down menu will help you in finding the right person. :slight_smile:
+
+- first block: here you can see your avatar, your nickname and statistics (Statuses, Following, Followers). Clicking your profile pic will open your profile.
+Under that you have a text form which allows you to post new statuses. The number on the bottom of the text form is a character counter, every instance can have a different character limit (the default is 5000).
+If you want to mention someone, type @ + name of the person. A drop-down menu will help you in finding the right person.
+Under the text form there are also several visibility options and there is the option to use rich text.
+Under that the icon on the left is for uploading media files and attach them to your post. There is also an emoji-picker and an option to post a poll.
 To post your status, simply press Submit.
+On the top right you will also see a wrench icon. This opens your personal settings.
 
 - second block: Here you can switch between the different timelines:
-  - Timeline: all the people that you follow
-  - Mentions: all the statutes where you are mentioned
-  - Public Timeline: all the statutes from the local instance
-  - The Whole Known Network: everything, local and remote!
-
-- third block: this is the Chat block, where you communicate with people on the same instance in realtime. It is local-only, for now, but we're planning to make it extendable to the entire fediverse! :sweat_smile:
-
+   - Timeline: all the people that you follow
+   - Interactions: here you can switch between different timelines where there was interaction with your account. There is Mentions, Repeats and Favorites, and New follows
+   - Direct Messages: these are the Direct Messages sent to you
+   - Public Timeline: all the statutes from the local instance
+   - The Whole Known Network: all public posts the instance knows about, both local and remote!
+   - About: This isn't a Timeline but shows relevant info about the instance. You can find a list of the moderators and admins, Terms of Service, MRF policies and enabled features.
+- Optional third block: This is the Instance panel that can be activated, but is deactivated by default. It's fully customisable and by default has links to the pleroma-fe and Mastodon-fe.
 - fourth block: This is the Notifications block, here you will get notified whenever somebody mentions you, follows you, repeats or favorites one of your statuses.
 
 ### Right column
-This is where the interesting stuff happens! :slight_smile:
+This is where the interesting stuff happens!
 Depending on the timeline you will see different statuses, but each status has a standard structure:
-- Icon + name + link to profile. An optional left-arrow if it's a reply to another status (hovering will reveal the replied-to status).
-- A + button on the right allows you to Expand/Collapse an entire discussion thread. It also updates in realtime!
-- A binocular icon allows you to open the status on the instance where it's originating from.
-- The text of the status, including mentions. If you click on a mention, it will automatically open the profile page of that person.
-- Four buttons (left to right): Reply, Repeat, Favorite, Delete.
-
-## Mastodon interface
-If the Pleroma interface isn't your thing, or you're just trying something new but you want to keep using the familiar Mastodon interface, we got that too! :smile:
-Just add a "/web" after your instance url (for ex. https://pleroma.soycaf.com/web) and you'll end on the Mastodon web interface, but with a Pleroma backend! MAGIC! :fireworks:
-For more information on the Mastodon interface, please look here:
-https://github.com/tootsuite/documentation/blob/master/Using-Mastodon/User-guide.md
+
+- Profile pic, name and link to profile. An optional left-arrow if it's a reply to another status (hovering will reveal the replied-to status). Clicking on the profile pic will uncollapse the user's profile.
+- A `+` button on the right allows you to Expand/Collapse an entire discussion thread. It also updates in realtime!
+- An arrow icon allows you to open the status on the instance where it's originating from.
+- The text of the status, including mentions and attachements. If you click on a mention, it will automatically open the profile page of that person.
+- Three buttons (left to right): Reply, Repeat, Favorite. There is also a forth button, this is a dropdown menu for simple moderation like muting the conversation or, if you have moderation rights, delete the status from the server.
+
+### Top right
+
+- The magnifier icon opens the search screen where you can search for statuses, people and hashtags. It's also possible to import statusses from remote servers by pasting the url to the post in the search field.
+- The gear icon gives you general settings
+- If you have admin rights, you'll see an icon that opens the admin interface
+- The last icon is to log out
+
+### Bottom right
+On the bottom right you have a chatbox. Here you can communicate with people on the same instance in realtime. It is local-only, for now, but there are plans to make it extendable to the entire fediverse!
+
+### Mastodon interface
+If the Pleroma interface isn't your thing, or you're just trying something new but you want to keep using the familiar Mastodon interface, we got that too!
+Just add a "/web" after your instance url (e.g. <https://pleroma.soycaf.com/web>) and you'll end on the Mastodon web interface, but with a Pleroma backend! MAGIC!
+The Mastodon interface is from the Glitch-soc fork. For more information on the Mastodon interface you can check the [Mastodon](https://docs.joinmastodon.org/) and [Glitch-soc](https://glitch-soc.github.io/docs/) documentation.
 
 Remember, what you see is only the frontend part of Mastodon, the backend is still Pleroma.
diff --git a/lib/mix/tasks/pleroma/email.ex b/lib/mix/tasks/pleroma/email.ex
new file mode 100644 (file)
index 0000000..2c38014
--- /dev/null
@@ -0,0 +1,25 @@
+defmodule Mix.Tasks.Pleroma.Email do
+  use Mix.Task
+
+  @shortdoc "Simple Email test"
+  @moduledoc File.read!("docs/administration/CLI_tasks/email.md")
+
+  def run(["test" | args]) do
+    Mix.Pleroma.start_pleroma()
+
+    {options, [], []} =
+      OptionParser.parse(
+        args,
+        strict: [
+          to: :string
+        ]
+      )
+
+    email = Pleroma.Emails.AdminEmail.test_email(options[:to])
+    {:ok, _} = Pleroma.Emails.Mailer.deliver(email)
+
+    Mix.shell().info(
+      "Test email has been sent to #{inspect(email.to)} from #{inspect(email.from)}"
+    )
+  end
+end
index b15e4041bd4295d17d3a6a5124748ff87c60778a..5f23345f7b9434ff033d8f6d5092da98fde6815e 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Emails.AdminEmail do
 
   import Swoosh.Email
 
+  alias Pleroma.Config
   alias Pleroma.Web.Router.Helpers
 
   defp instance_config, do: Pleroma.Config.get(:instance)
@@ -17,7 +18,20 @@ defmodule Pleroma.Emails.AdminEmail do
   end
 
   defp user_url(user) do
-    Helpers.feed_url(Pleroma.Web.Endpoint, :feed_redirect, user.id)
+    Helpers.user_feed_url(Pleroma.Web.Endpoint, :feed_redirect, user.id)
+  end
+
+  def test_email(mail_to \\ nil) do
+    html_body = """
+    <h3>Instance Test Email</h3>
+    <p>A test email was requested. Hello. :)</p>
+    """
+
+    new()
+    |> to(mail_to || Config.get([:instance, :email]))
+    |> from({instance_name(), instance_notify_email()})
+    |> subject("Instance Test Email")
+    |> html_body(html_body)
   end
 
   def report(to, reporter, account, statuses, comment) do
index 3899c34c2f2a635ab3155bccddd7be32e3fc8d71..3c86cdb38bbf1bcdf13f684a90cd89db252ec1ab 100644 (file)
@@ -1512,7 +1512,7 @@ defmodule Pleroma.User do
     data
     |> Map.put(:name, blank?(data[:name]) || data[:nickname])
     |> remote_user_creation()
-    |> Repo.insert(on_conflict: :replace_all_except_primary_key, conflict_target: :nickname)
+    |> Repo.insert(on_conflict: {:replace_all_except, [:id]}, conflict_target: :nickname)
     |> set_cache()
   end
 
index 24c724549ed7bc41ff7f841f88297a5318a9d705..3149e10e9bfba36984481e2c2e8c0c599a3c1b39 100644 (file)
@@ -58,7 +58,7 @@ defmodule Pleroma.UserRelationship do
       target_id: target.id
     })
     |> Repo.insert(
-      on_conflict: :replace_all_except_primary_key,
+      on_conflict: {:replace_all_except, [:id]},
       conflict_target: [:source_id, :relationship_type, :target_id]
     )
   end
index 2e9d56ee50f48faec9d2493c64a5564e399be816..1ac67b618c84fc8675efcf591bb7fbb686ddcd87 100644 (file)
@@ -728,7 +728,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       params
       |> Map.put("user", reading_user)
       |> Map.put("actor_id", user.ap_id)
-      |> Map.put("whole_db", true)
 
     recipients =
       user_activities_recipients(%{
@@ -746,7 +745,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       |> Map.put("type", ["Create", "Announce"])
       |> Map.put("user", reading_user)
       |> Map.put("actor_id", user.ap_id)
-      |> Map.put("whole_db", true)
       |> Map.put("pinned_activity_ids", user.pinned_activities)
 
     params =
@@ -773,7 +771,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
       params
       |> Map.put("type", ["Create", "Announce"])
       |> Map.put("instance", params["instance"])
-      |> Map.put("whole_db", true)
 
     fetch_activities([Pleroma.Constants.as_public()], params, :offset)
     |> Enum.reverse()
index 9a4e322c920e24b7a7e655c45177fac53cb5cbc8..e3d7a465b8efbed81edf5dfec65c2428cf01692e 100644 (file)
@@ -76,8 +76,7 @@ defmodule Pleroma.Web.ControllerHelper do
     end
   end
 
-  def try_render(conn, target, params)
-      when is_binary(target) do
+  def try_render(conn, target, params) when is_binary(target) do
     case render(conn, target, params) do
       nil -> render_error(conn, :not_implemented, "Can't display this activity")
       res -> res
@@ -87,4 +86,8 @@ defmodule Pleroma.Web.ControllerHelper do
   def try_render(conn, _, _) do
     render_error(conn, :not_implemented, "Can't display this activity")
   end
+
+  @spec put_in_if_exist(map(), atom() | String.t(), any) :: map()
+  def put_in_if_exist(map, _key, nil), do: map
+  def put_in_if_exist(map, key, value), do: put_in(map, key, value)
 end
index bb1332fd306be715e2bb8f1073f833a0320f5de0..334802e0a62ad4cd05361d2335a4dd92aae625de 100644 (file)
@@ -13,21 +13,53 @@ defmodule Pleroma.Web.Feed.FeedView do
 
   require Pleroma.Constants
 
-  def prepare_activity(activity) do
+  @spec pub_date(String.t() | DateTime.t()) :: String.t()
+  def pub_date(date) when is_binary(date) do
+    date
+    |> Timex.parse!("{ISO:Extended}")
+    |> pub_date
+  end
+
+  def pub_date(%DateTime{} = date), do: Timex.format!(date, "{RFC822}")
+
+  def prepare_activity(activity, opts \\ []) do
     object = activity_object(activity)
 
+    actor =
+      if opts[:actor] do
+        Pleroma.User.get_cached_by_ap_id(activity.actor)
+      end
+
     %{
       activity: activity,
       data: Map.get(object, :data),
-      object: object
+      object: object,
+      actor: actor
     }
   end
 
+  def most_recent_update(activities) do
+    with %{updated_at: updated_at} <- List.first(activities) do
+      NaiveDateTime.to_iso8601(updated_at)
+    end
+  end
+
   def most_recent_update(activities, user) do
     (List.first(activities) || user).updated_at
     |> NaiveDateTime.to_iso8601()
   end
 
+  def feed_logo do
+    case Pleroma.Config.get([:feed, :logo]) do
+      nil ->
+        "#{Pleroma.Web.base_url()}/static/logo.png"
+
+      logo ->
+        "#{Pleroma.Web.base_url()}#{logo}"
+    end
+    |> MediaProxy.url()
+  end
+
   def logo(user) do
     user
     |> User.avatar_url()
@@ -40,6 +72,8 @@ defmodule Pleroma.Web.Feed.FeedView do
 
   def activity_title(%{data: %{"content" => content}}, opts \\ %{}) do
     content
+    |> Pleroma.Web.Metadata.Utils.scrub_html()
+    |> Pleroma.Emoji.Formatter.demojify()
     |> Formatter.truncate(opts[:max_length], opts[:omission])
     |> escape()
   end
@@ -50,6 +84,8 @@ defmodule Pleroma.Web.Feed.FeedView do
     |> escape()
   end
 
+  def activity_content(_), do: ""
+
   def activity_context(activity), do: activity.data["context"]
 
   def attachment_href(attachment) do
diff --git a/lib/pleroma/web/feed/tag_controller.ex b/lib/pleroma/web/feed/tag_controller.ex
new file mode 100644 (file)
index 0000000..9accd08
--- /dev/null
@@ -0,0 +1,41 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Feed.TagController do
+  use Pleroma.Web, :controller
+
+  alias Pleroma.Config
+  alias Pleroma.Web.ActivityPub.ActivityPub
+  alias Pleroma.Web.Feed.FeedView
+
+  import Pleroma.Web.ControllerHelper, only: [put_in_if_exist: 3]
+
+  def feed(conn, %{"tag" => raw_tag} = params) do
+    {format, tag} = parse_tag(raw_tag)
+
+    activities =
+      %{"type" => ["Create"], "tag" => tag}
+      |> put_in_if_exist("max_id", params["max_id"])
+      |> ActivityPub.fetch_public_activities()
+
+    conn
+    |> put_resp_content_type("application/atom+xml")
+    |> put_view(FeedView)
+    |> render("tag.#{format}",
+      activities: activities,
+      tag: tag,
+      feed_config: Config.get([:feed])
+    )
+  end
+
+  @spec parse_tag(binary() | any()) :: {format :: String.t(), tag :: String.t()}
+  defp parse_tag(raw_tag) when is_binary(raw_tag) do
+    case Enum.reverse(String.split(raw_tag, ".")) do
+      [format | tag] when format in ["atom", "rss"] -> {format, Enum.join(tag, ".")}
+      _ -> {"rss", raw_tag}
+    end
+  end
+
+  defp parse_tag(raw_tag), do: {"rss", raw_tag}
+end
similarity index 84%
rename from lib/pleroma/web/feed/feed_controller.ex
rename to lib/pleroma/web/feed/user_controller.ex
index d0e23007df7610544587136b0a86a69aa130f6f3..f5096834b1c8a02e5e4174cd6f7a6c06da529f02 100644 (file)
@@ -2,13 +2,16 @@
 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
-defmodule Pleroma.Web.Feed.FeedController do
+defmodule Pleroma.Web.Feed.UserController do
   use Pleroma.Web, :controller
 
   alias Fallback.RedirectController
   alias Pleroma.User
   alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.ActivityPubController
+  alias Pleroma.Web.Feed.FeedView
+
+  import Pleroma.Web.ControllerHelper, only: [put_in_if_exist: 3]
 
   plug(Pleroma.Plugs.SetFormatPlug when action in [:feed_redirect])
 
@@ -27,7 +30,7 @@ defmodule Pleroma.Web.Feed.FeedController do
 
   def feed_redirect(conn, %{"nickname" => nickname}) do
     with {_, %User{} = user} <- {:fetch_user, User.get_cached_by_nickname(nickname)} do
-      redirect(conn, external: "#{feed_url(conn, :feed, user.nickname)}.atom")
+      redirect(conn, external: "#{user_feed_url(conn, :feed, user.nickname)}.atom")
     end
   end
 
@@ -36,15 +39,15 @@ defmodule Pleroma.Web.Feed.FeedController do
       activities =
         %{
           "type" => ["Create"],
-          "whole_db" => true,
           "actor_id" => user.ap_id
         }
-        |> Map.merge(Map.take(params, ["max_id"]))
+        |> put_in_if_exist("max_id", params["max_id"])
         |> ActivityPub.fetch_public_activities()
 
       conn
       |> put_resp_content_type("application/atom+xml")
-      |> render("feed.xml",
+      |> put_view(FeedView)
+      |> render("user.xml",
         user: user,
         activities: activities,
         feed_config: Pleroma.Config.get([:feed])
index fe71c36affc8de297e13a89169d34e59ec87b7e0..b9cc8f10492cae8f23bfed216dfdd6a595cdc8f9 100644 (file)
@@ -7,62 +7,8 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionController do
 
   require Logger
 
-  alias Pleroma.Config
-  alias Pleroma.Plugs.OAuthScopesPlug
-  alias Pleroma.User
-  alias Pleroma.Web.MediaProxy
-
-  action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
-
-  plug(OAuthScopesPlug, %{scopes: ["read"]} when action == :index)
-
-  plug(Pleroma.Plugs.EnsurePublicOrAuthenticatedPlug)
-
   @doc "GET /api/v1/suggestions"
-  def index(%{assigns: %{user: user}} = conn, _) do
-    if Config.get([:suggestions, :enabled], false) do
-      with {:ok, data} <- fetch_suggestions(user) do
-        limit = Config.get([:suggestions, :limit], 23)
-
-        data =
-          data
-          |> Enum.slice(0, limit)
-          |> Enum.map(fn x ->
-            x
-            |> Map.put("id", fetch_suggestion_id(x))
-            |> Map.put("avatar", MediaProxy.url(x["avatar"]))
-            |> Map.put("avatar_static", MediaProxy.url(x["avatar_static"]))
-          end)
-
-        json(conn, data)
-      end
-    else
-      json(conn, [])
-    end
-  end
-
-  defp fetch_suggestions(user) do
-    api = Config.get([:suggestions, :third_party_engine], "")
-    timeout = Config.get([:suggestions, :timeout], 5000)
-    host = Config.get([Pleroma.Web.Endpoint, :url, :host])
-
-    url =
-      api
-      |> String.replace("{{host}}", host)
-      |> String.replace("{{user}}", user.nickname)
-
-    with {:ok, %{status: 200, body: body}} <-
-           Pleroma.HTTP.get(url, [], adapter: [recv_timeout: timeout, pool: :default]) do
-      Jason.decode(body)
-    else
-      e -> Logger.error("Could not retrieve suggestions at fetch #{url}, #{inspect(e)}")
-    end
-  end
-
-  defp fetch_suggestion_id(attrs) do
-    case User.get_or_fetch(attrs["acct"]) do
-      {:ok, %User{id: id}} -> id
-      _ -> 0
-    end
+  def index(conn, _) do
+    json(conn, [])
   end
 end
index 8043e6c547f52a63c33193ea24b30582395ea149..ee48913a70bfb65c1a1cfa2803a5b9dca1fc52bd 100644 (file)
@@ -16,7 +16,7 @@ defmodule Pleroma.Web.Metadata.Providers.Feed do
        [
          rel: "alternate",
          type: "application/atom+xml",
-         href: Helpers.feed_path(Endpoint, :feed, user.nickname) <> ".atom"
+         href: Helpers.user_feed_path(Endpoint, :feed, user.nickname) <> ".atom"
        ], []}
     ]
   end
index 589d11901a0ceb91f50d5da672a909805c0c25ac..000bd9f66f5559a79c525596d9ebf9b4d6338ba1 100644 (file)
@@ -20,16 +20,23 @@ defmodule Pleroma.Web.Metadata.Utils do
   end
 
   def scrub_html_and_truncate(content, max_length \\ 200) when is_binary(content) do
+    content
+    |> scrub_html
+    |> Emoji.Formatter.demojify()
+    |> HtmlEntities.decode()
+    |> Formatter.truncate(max_length)
+  end
+
+  def scrub_html(content) when is_binary(content) do
     content
     # html content comes from DB already encoded, decode first and scrub after
     |> HtmlEntities.decode()
     |> String.replace(~r/<br\s?\/?>/, " ")
     |> HTML.strip_tags()
-    |> Emoji.Formatter.demojify()
-    |> HtmlEntities.decode()
-    |> Formatter.truncate(max_length)
   end
 
+  def scrub_html(content), do: content
+
   def attachment_url(url) do
     MediaProxy.url(url)
   end
index abcf46034d10c0cc6073eeb6364e8eb02257ab31..03c35cc2a25fa89a62f7cf74171583940e9c13e2 100644 (file)
@@ -69,9 +69,6 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
         if Config.get([:chat, :enabled]) do
           "chat"
         end,
-        if Config.get([:suggestions, :enabled]) do
-          "suggestions"
-        end,
         if Config.get([:instance, :allow_relay]) do
           "relay"
         end,
@@ -104,11 +101,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
         nodeDescription: Config.get([:instance, :description]),
         private: !Config.get([:instance, :public], true),
         suggestions: %{
-          enabled: Config.get([:suggestions, :enabled], false),
-          thirdPartyEngine: Config.get([:suggestions, :third_party_engine], ""),
-          timeout: Config.get([:suggestions, :timeout], 5000),
-          limit: Config.get([:suggestions, :limit], 23),
-          web: Config.get([:suggestions, :web], "")
+          enabled: false
         },
         staffAccounts: staff_accounts,
         federation: federation_response,
index 9139756160034983ad6c63721e7684de8ee9a7f2..c2a3c07a2117d3469242fe64f3135de388131a40 100644 (file)
@@ -48,6 +48,6 @@ defmodule Pleroma.Web.RichMedia.Parsers.MetaTagsParser do
   defp maybe_put_title(meta, _), do: meta
 
   defp get_page_title(html) do
-    Floki.find(html, "title") |> Floki.text()
+    Floki.find(html, "title") |> List.first() |> Floki.text()
   end
 end
index ef6e5a56514fa7ba00cd9ec2f8aa7e279c34bc07..b5c1d85c700a4a4843cf358173d1c108b409f024 100644 (file)
@@ -527,8 +527,10 @@ defmodule Pleroma.Web.Router do
     get("/notice/:id", OStatus.OStatusController, :notice)
     get("/notice/:id/embed_player", OStatus.OStatusController, :notice_player)
 
-    get("/users/:nickname/feed", Feed.FeedController, :feed)
-    get("/users/:nickname", Feed.FeedController, :feed_redirect)
+    get("/users/:nickname/feed", Feed.UserController, :feed, as: :user_feed)
+    get("/users/:nickname", Feed.UserController, :feed_redirect, as: :user_feed)
+
+    get("/tags/:tag", Feed.TagController, :feed, as: :tag_feed)
   end
 
   scope "/", Pleroma.Web do
index 514eacaed807c3bc94d6ae184890d6920dde55df..ac8a75009de834a7e97d422c1a9002121879b39a 100644 (file)
@@ -9,7 +9,7 @@
   <ostatus:conversation ref="<%= activity_context(@activity) %>">
     <%= activity_context(@activity) %>
   </ostatus:conversation>
-  <link ref="<%= activity_context(@activity) %>" rel="ostatus:conversation"/>
+  <link href="<%= activity_context(@activity) %>" rel="ostatus:conversation"/>
 
   <%= if @data["summary"] do %>
     <summary><%= @data["summary"] %></summary>
diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.atom.eex
new file mode 100644 (file)
index 0000000..da4fa6d
--- /dev/null
@@ -0,0 +1,51 @@
+<entry>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/note</activity:object-type>
+    <activity:verb>http://activitystrea.ms/schema/1.0/post</activity:verb>
+    
+    <%= render @view_module, "_tag_author.atom", assigns %>
+    
+    <id><%= @data["id"] %></id>
+    <title><%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %></title>
+    <content type="html"><%= activity_content(@object) %></content>
+
+  <%= if @activity.local do %>
+    <link type="application/atom+xml" href='<%= @data["id"] %>' rel="self"/>
+    <link type="text/html" href='<%= @data["id"] %>' rel="alternate"/>
+  <% else %>
+    <link type="text/html" href='<%= @data["external_url"] %>' rel="alternate"/>
+  <% end %>
+
+    <published><%= @data["published"] %></published>
+    <updated><%= @data["published"] %></updated>
+
+    <ostatus:conversation ref="<%= activity_context(@activity) %>">
+      <%= activity_context(@activity) %>
+    </ostatus:conversation>
+    <link href="<%= activity_context(@activity) %>" rel="ostatus:conversation"/>
+
+   <%= if @data["summary"] do %>
+    <summary><%= @data["summary"] %></summary>
+   <% end %>
+  
+    <%= for id <- @activity.recipients do %>
+      <%= if id == Pleroma.Constants.as_public() do %>
+        <link rel="mentioned"
+          ostatus:object-type="http://activitystrea.ms/schema/1.0/collection"
+          href="http://activityschema.org/collection/public"/>
+      <% else %>
+        <%= unless Regex.match?(~r/^#{Pleroma.Web.base_url()}.+followers$/, id) do %>
+          <link rel="mentioned"
+            ostatus:object-type="http://activitystrea.ms/schema/1.0/person"
+            href="<%= id %>" />
+        <% end %>
+      <% end %>
+    <% end %>
+  
+    <%= for tag <- @data["tag"] || [] do %>
+      <category term="<%= tag %>"></category>
+    <% end %>
+
+    <%= for {emoji, file} <- @data["emoji"] || %{} do %>
+      <link name="<%= emoji %>" rel="emoji" href="<%= file %>"/>
+    <% end %>
+</entry>
diff --git a/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex b/lib/pleroma/web/templates/feed/feed/_tag_activity.xml.eex
new file mode 100644 (file)
index 0000000..295574d
--- /dev/null
@@ -0,0 +1,15 @@
+<item>
+  <title><%= activity_title(@object, Keyword.get(@feed_config, :post_title, %{})) %></title>
+  
+  
+  <guid isPermalink="true"><%= activity_context(@activity) %></guid>
+  <link><%= activity_context(@activity) %></link>
+  <pubDate><%= pub_date(@data["published"]) %></pubDate>
+  
+  <description><%= activity_content(@object) %></description>
+  <%= for attachment <- @data["attachment"] || [] do %>
+    <enclosure url="<%= attachment_href(attachment) %>" type="<%= attachment_type(attachment) %>"/>
+  <% end %>
+  
+</item>
+
diff --git a/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex b/lib/pleroma/web/templates/feed/feed/_tag_author.atom.eex
new file mode 100644 (file)
index 0000000..997c493
--- /dev/null
@@ -0,0 +1,18 @@
+<author>
+    <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+    <id><%= @actor.ap_id %></id>
+    <uri><%= @actor.ap_id %></uri>
+    <name><%= @actor.nickname %></name>
+    <summary><%= escape(@actor.bio) %></summary>
+    <link rel="avatar" href="<%= User.avatar_url(@actor) %>"/>
+    <%= if User.banner_url(@actor) do %>
+      <link rel="header" href="<%= User.banner_url(@actor) %>"/>
+    <% end %>
+    <%= if @actor.local do %>
+      <ap_enabled>true</ap_enabled>
+    <% end %>
+  
+    <poco:preferredUsername><%= @actor.nickname %></poco:preferredUsername>        
+    <poco:displayName><%= @actor.name %></poco:displayName>
+    <poco:note><%= escape(@actor.bio) %></poco:note>    
+</author>
diff --git a/lib/pleroma/web/templates/feed/feed/tag.atom.eex b/lib/pleroma/web/templates/feed/feed/tag.atom.eex
new file mode 100644 (file)
index 0000000..a288539
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"
+      xmlns:thr="http://purl.org/syndication/thread/1.0"
+      xmlns:georss="http://www.georss.org/georss"
+      xmlns:activity="http://activitystrea.ms/spec/1.0/"
+      xmlns:media="http://purl.org/syndication/atommedia"
+      xmlns:poco="http://portablecontacts.net/spec/1.0"
+      xmlns:ostatus="http://ostatus.org/schema/1.0"
+      xmlns:statusnet="http://status.net/schema/api/1/">
+
+    <id><%= '#{tag_feed_url(@conn, :feed, @tag)}.rss' %></id>
+    <title>#<%= @tag %></title>
+
+    <subtitle>These are public toots tagged with #<%= @tag %>. You can interact with them if you have an account anywhere in the fediverse.</subtitle>
+    <logo><%= feed_logo() %></logo>
+    <updated><%= most_recent_update(@activities) %></updated>
+    <link rel="self" href="<%= '#{tag_feed_url(@conn, :feed, @tag)}.atom'  %>" type="application/atom+xml"/>
+    <%= for activity <- @activities do %>
+    <%= render @view_module, "_tag_activity.atom", Map.merge(assigns, prepare_activity(activity, actor: true)) %>
+    <% end %>
+</feed>
diff --git a/lib/pleroma/web/templates/feed/feed/tag.rss.eex b/lib/pleroma/web/templates/feed/feed/tag.rss.eex
new file mode 100644 (file)
index 0000000..eeda01a
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<rss version="2.0" xmlns:webfeeds="http://webfeeds.org/rss/1.0">
+  <channel>
+
+
+    <title>#<%= @tag %></title>
+    <description>These are public toots tagged with #<%= @tag %>. You can interact with them if you have an account anywhere in the fediverse.</description>
+    <link><%= '#{tag_feed_url(@conn, :feed, @tag)}.rss' %></link>
+    <webfeeds:logo><%= feed_logo() %></webfeeds:logo>
+    <webfeeds:accentColor>2b90d9</webfeeds:accentColor>
+    <%= for activity <- @activities do %>
+    <%= render @view_module, "_tag_activity.xml", Map.merge(assigns, prepare_activity(activity)) %>
+    <% end %>
+  </channel>
+</rss>
similarity index 67%
rename from lib/pleroma/web/templates/feed/feed/feed.xml.eex
rename to lib/pleroma/web/templates/feed/feed/user.xml.eex
index 5ae36d345d79bc88e663eeeab60d3dc634fc9082..d274c08ae06d1b5082e2ff3bb3ad6215b3400ac4 100644 (file)
@@ -6,16 +6,16 @@
   xmlns:poco="http://portablecontacts.net/spec/1.0"
   xmlns:ostatus="http://ostatus.org/schema/1.0">
 
-  <id><%= feed_url(@conn, :feed, @user.nickname) <> ".atom" %></id>
+  <id><%= user_feed_url(@conn, :feed, @user.nickname) <> ".atom" %></id>
   <title><%= @user.nickname <> "'s timeline" %></title>
   <updated><%= most_recent_update(@activities, @user) %></updated>
   <logo><%= logo(@user) %></logo>
-  <link rel="self" href="<%= '#{feed_url(@conn, :feed, @user.nickname)}.atom' %>" type="application/atom+xml"/>
+  <link rel="self" href="<%= '#{user_feed_url(@conn, :feed, @user.nickname)}.atom' %>" type="application/atom+xml"/>
 
   <%= render @view_module, "_author.xml", assigns %>
 
   <%= if last_activity(@activities) do %>
-    <link rel="next" href="<%= '#{feed_url(@conn, :feed, @user.nickname)}.atom?max_id=#{last_activity(@activities).id}' %>" type="application/atom+xml"/>
+    <link rel="next" href="<%= '#{user_feed_url(@conn, :feed, @user.nickname)}.atom?max_id=#{last_activity(@activities).id}' %>" type="application/atom+xml"/>
   <% end %>
 
   <%= for activity <- @activities do %>
index 3f421db4079c1a86841cc7f29f8683b809d8e9f0..2cbc6b64d3bc427e7af1fb17e5e6cf6de9f190ad 100644 (file)
@@ -12,7 +12,10 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
 
   @impl Oban.Worker
   def perform(
-        %{"object" => %{"data" => %{"attachment" => [_ | _] = attachments, "actor" => actor}}},
+        %{
+          "op" => "cleanup_attachments",
+          "object" => %{"data" => %{"attachment" => [_ | _] = attachments, "actor" => actor}}
+        },
         _job
       ) do
     hrefs =
@@ -37,7 +40,7 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
       )
       # The query above can be time consumptive on large instances until we
       # refactor how uploads are stored
-      |> Repo.all(timout: :infinity)
+      |> Repo.all(timeout: :infinity)
       # we should delete 1 object for any given attachment, but don't delete
       # files if there are more than 1 object for it
       |> Enum.reduce(%{}, fn %{
@@ -70,7 +73,11 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
               _ -> ""
             end
 
-          base_url = Pleroma.Config.get([__MODULE__, :base_url], Pleroma.Web.base_url())
+          base_url =
+            String.trim_trailing(
+              Pleroma.Config.get([Pleroma.Upload, :base_url], Pleroma.Web.base_url()),
+              "/"
+            )
 
           file_path = String.trim_leading(href, "#{base_url}/#{prefix}")
 
@@ -84,5 +91,5 @@ defmodule Pleroma.Workers.AttachmentsCleanupWorker do
     |> Repo.delete_all()
   end
 
-  def perform(%{"object" => _object}, _job), do: :ok
+  def perform(%{"op" => "cleanup_attachments", "object" => _object}, _job), do: :ok
 end
diff --git a/mix.exs b/mix.exs
index 76bf2848e9ef6c4d6e52f621bf01ba417a392ef1..8f8616f18338a01a730626b43a36b60cb8f8cfae 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -101,9 +101,9 @@ defmodule Pleroma.Mixfile do
       {:phoenix_pubsub, "~> 1.1"},
       {:phoenix_ecto, "~> 4.0"},
       {:ecto_enum, "~> 1.4"},
-      {:ecto_sql, "~> 3.2"},
+      {:ecto_sql, "~> 3.3.2"},
       {:postgrex, ">= 0.13.5"},
-      {:oban, "~> 0.12.0"},
+      {:oban, "~> 0.12.1"},
       {:gettext, "~> 0.15"},
       {:comeonin, "~> 4.1.1"},
       {:pbkdf2_elixir, "~> 0.12.3"},
index 08ed8fb72d4d432fe4b0d0ee4724e227deb279fa..1fe3085ee04717df96a1b3fd9750fa859705a189 100644 (file)
--- a/mix.lock
+++ b/mix.lock
   "crontab": {:hex, :crontab, "1.1.8", "2ce0e74777dfcadb28a1debbea707e58b879e6aa0ffbf9c9bb540887bce43617", [:mix], [{:ecto, "~> 1.0 or ~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}], "hexpm"},
   "crypt": {:git, "https://github.com/msantos/crypt", "1f2b58927ab57e72910191a7ebaeff984382a1d3", [ref: "1f2b58927ab57e72910191a7ebaeff984382a1d3"]},
   "custom_base": {:hex, :custom_base, "0.2.1", "4a832a42ea0552299d81652aa0b1f775d462175293e99dfbe4d7dbaab785a706", [:mix], [], "hexpm"},
-  "db_connection": {:hex, :db_connection, "2.1.1", "a51e8a2ee54ef2ae6ec41a668c85787ed40cb8944928c191280fe34c15b76ae5", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"},
-  "decimal": {:hex, :decimal, "1.8.0", "ca462e0d885f09a1c5a342dbd7c1dcf27ea63548c65a65e67334f4b61803822e", [:mix], [], "hexpm"},
+  "db_connection": {:hex, :db_connection, "2.2.0", "e923e88887cd60f9891fd324ac5e0290954511d090553c415fbf54be4c57ee63", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"},
+  "decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm"},
   "deep_merge": {:hex, :deep_merge, "1.0.0", "b4aa1a0d1acac393bdf38b2291af38cb1d4a52806cf7a4906f718e1feb5ee961", [:mix], [], "hexpm"},
   "earmark": {:hex, :earmark, "1.4.2", "3aa0bd23bc4c61cf2f1e5d752d1bb470560a6f8539974f767a38923bb20e1d7f", [:mix], [], "hexpm"},
-  "ecto": {:hex, :ecto, "3.2.5", "76c864b77948a479e18e69cc1d0f0f4ee7cced1148ffe6a093ff91eba644f0b5", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
+  "ecto": {:hex, :ecto, "3.3.1", "82ab74298065bf0c64ca299f6c6785e68ea5d6b980883ee80b044499df35aba1", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
   "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm"},
-  "ecto_sql": {:hex, :ecto_sql, "3.2.2", "d10845bc147b9f61ef485cbf0973c0a337237199bd9bd30dd9542db00aadc26b", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.2.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.2.0 or ~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
+  "ecto_sql": {:hex, :ecto_sql, "3.3.2", "92804e0de69bb63e621273c3492252cb08a29475c05d40eeb6f41ad2d483cfd3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
   "esshd": {:hex, :esshd, "0.1.0", "6f93a2062adb43637edad0ea7357db2702a4b80dd9683482fe00f5134e97f4c1", [:mix], [], "hexpm"},
   "eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm"},
   "ex2ms": {:hex, :ex2ms, "1.5.0", "19e27f9212be9a96093fed8cdfbef0a2b56c21237196d26760f11dfcfae58e97", [:mix], [], "hexpm"},
@@ -69,7 +69,7 @@
   "myhtmlex": {:git, "https://git.pleroma.social/pleroma/myhtmlex.git", "ad0097e2f61d4953bfef20fb6abddf23b87111e6", [ref: "ad0097e2f61d4953bfef20fb6abddf23b87111e6", submodules: true]},
   "nimble_parsec": {:hex, :nimble_parsec, "0.5.1", "c90796ecee0289dbb5ad16d3ad06f957b0cd1199769641c961cfe0b97db190e0", [:mix], [], "hexpm"},
   "nodex": {:git, "https://git.pleroma.social/pleroma/nodex", "cb6730f943cfc6aad674c92161be23a8411f15d1", [ref: "cb6730f943cfc6aad674c92161be23a8411f15d1"]},
-  "oban": {:hex, :oban, "0.12.0", "5477d5ab4a5a201c0b6c89764040ebfc5d2c71c488a36f378016ce5990838f0f", [:mix], [{:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
+  "oban": {:hex, :oban, "0.12.1", "695e9490c6e0edfca616d80639528e448bd29b3bff7b7dd10a56c79b00a5d7fb", [:mix], [{:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
   "parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm"},
   "pbkdf2_elixir": {:hex, :pbkdf2_elixir, "0.12.4", "8dd29ed783f2e12195d7e0a4640effc0a7c37e6537da491f1db01839eee6d053", [:mix], [], "hexpm"},
   "phoenix": {:hex, :phoenix, "1.4.10", "619e4a545505f562cd294df52294372d012823f4fd9d34a6657a8b242898c255", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
@@ -83,7 +83,7 @@
   "plug_static_index_html": {:hex, :plug_static_index_html, "1.0.0", "840123d4d3975585133485ea86af73cb2600afd7f2a976f9f5fd8b3808e636a0", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
   "poison": {:hex, :poison, "3.1.0", "d9eb636610e096f86f25d9a46f35a9facac35609a7591b3be3326e99a0484665", [:mix], [], "hexpm"},
   "poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm"},
-  "postgrex": {:hex, :postgrex, "0.15.1", "23ce3417de70f4c0e9e7419ad85bdabcc6860a6925fe2c6f3b1b5b1e8e47bf2f", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
+  "postgrex": {:hex, :postgrex, "0.15.3", "5806baa8a19a68c4d07c7a624ccdb9b57e89cbc573f1b98099e3741214746ae4", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
   "prometheus": {:hex, :prometheus, "4.4.1", "1e96073b3ed7788053768fea779cbc896ddc3bdd9ba60687f2ad50b252ac87d6", [:mix, :rebar3], [], "hexpm"},
   "prometheus_ecto": {:hex, :prometheus_ecto, "1.4.3", "3dd4da1812b8e0dbee81ea58bb3b62ed7588f2eae0c9e97e434c46807ff82311", [:mix], [{:ecto, "~> 2.0 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:prometheus_ex, "~> 1.1 or ~> 2.0 or ~> 3.0", [hex: :prometheus_ex, repo: "hexpm", optional: false]}], "hexpm"},
   "prometheus_ex": {:hex, :prometheus_ex, "3.0.5", "fa58cfd983487fc5ead331e9a3e0aa622c67232b3ec71710ced122c4c453a02f", [:mix], [{:prometheus, "~> 4.0", [hex: :prometheus, repo: "hexpm", optional: false]}], "hexpm"},
diff --git a/priv/gettext/fr/LC_MESSAGES/errors.po b/priv/gettext/fr/LC_MESSAGES/errors.po
new file mode 100644 (file)
index 0000000..678b322
--- /dev/null
@@ -0,0 +1,459 @@
+## `msgid`s in this file come from POT (.pot) files.
+##
+## Do not add, change, or remove `msgid`s manually here as
+## they're tied to the ones in the corresponding POT file
+## (with the same domain).
+##
+## Use `mix gettext.extract --merge` or `mix gettext.merge`
+## to merge POT files into PO files.
+msgid ""
+msgstr ""
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+msgid "can't be blank"
+msgstr "ne peut être vide"
+
+## grammatical gender…
+msgid "has already been taken"
+msgstr "a déjà été pris"
+
+msgid "is invalid"
+msgstr "est invalide"
+
+msgid "has invalid format"
+msgstr "a un format invalide"
+
+msgid "has an invalid entry"
+msgstr "a une entrée invalide"
+
+## grammatical gender…
+msgid "is reserved"
+msgstr "est réservé"
+
+msgid "does not match confirmation"
+msgstr "ne correspondent pas"
+
+msgid "is still associated with this entry"
+msgstr ""
+
+msgid "are still associated with this entry"
+msgstr ""
+
+msgid "should be %{count} character(s)"
+msgid_plural "should be %{count} character(s)"
+msgstr[0] "devrait avoir %{count} charactère"
+msgstr[1] "devrait avoir %{count} charactères"
+
+msgid "should have %{count} item(s)"
+msgid_plural "should have %{count} item(s)"
+msgstr[0] "devrait avoir %{count} objet"
+msgstr[1] "devrait avoir %{count} objets"
+
+msgid "should be at least %{count} character(s)"
+msgid_plural "should be at least %{count} character(s)"
+msgstr[0] "devrait avoir au moins %{count} charactère"
+msgstr[1] "devrait avoir au moins %{count} charactères"
+
+msgid "should have at least %{count} item(s)"
+msgid_plural "should have at least %{count} item(s)"
+msgstr[0] "devrait avoir au moins %{count} objet"
+msgstr[1] "devrait avoir au moins %{count} objets"
+
+msgid "should be at most %{count} character(s)"
+msgid_plural "should be at most %{count} character(s)"
+msgstr[0] "devrait avoir au plus %{count} charactère"
+msgstr[1] "devrait avoir au plus %{count} charactères"
+
+msgid "should have at most %{count} item(s)"
+msgid_plural "should have at most %{count} item(s)"
+msgstr[0] "devrait avoir au plus %{count} objet"
+msgstr[1] "devrait avoir au plus %{count} objets"
+
+msgid "must be less than %{number}"
+msgstr "doit être inférieur à %{number}"
+
+msgid "must be greater than %{number}"
+msgstr "doit être supérieur à %{number}"
+
+msgid "must be less than or equal to %{number}"
+msgstr "doit être inférieur ou égal à %{number}"
+
+msgid "must be greater than or equal to %{number}"
+msgstr "doit être supérieur ou égal à %{number}"
+
+msgid "must be equal to %{number}"
+msgstr "doit égal à %{number}"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:381
+msgid "Account not found"
+msgstr "Compte non trouvé"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:153
+msgid "Already voted"
+msgstr "A déjà voté"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:263
+msgid "Bad request"
+msgstr "Requête Invalide"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:254
+msgid "Can't delete object"
+msgstr "Ne peut supprimer cet objet"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:569
+msgid "Can't delete this post"
+msgstr "Ne peut supprimer ce message"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1731
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1737
+msgid "Can't display this activity"
+msgstr "Ne peut afficher cette activitée"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:195
+msgid "Can't find user"
+msgstr "Compte non trouvé"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1148
+msgid "Can't get favorites"
+msgstr "Favoris non trouvables"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:263
+msgid "Can't like object"
+msgstr "Ne peut aimer cet objet"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/utils.ex:518
+msgid "Cannot post an empty status without attachments"
+msgstr "Ne peut envoyer un status vide sans attachements"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/utils.ex:461
+msgid "Comment must be up to %{max_size} characters"
+msgstr "Le commentaire ne doit faire plus de %{max_size} charactères"
+
+#, elixir-format
+#: lib/pleroma/web/admin_api/config.ex:63
+msgid "Config with params %{params} not found"
+msgstr "Configuration avec les paramètres %{params} non trouvée"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:78
+msgid "Could not delete"
+msgstr "Échec de la suppression"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:110
+msgid "Could not favorite"
+msgstr "Échec de mise en favoris"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:310
+msgid "Could not pin"
+msgstr "Échec de l'épinglage"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:89
+msgid "Could not repeat"
+msgstr "Échec de création la répétition"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:120
+msgid "Could not unfavorite"
+msgstr "Échec de suppression des favoris"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:327
+msgid "Could not unpin"
+msgstr "Échec du dépinglage"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:99
+msgid "Could not unrepeat"
+msgstr "Échec de suppression de la répétition"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:392
+msgid "Could not update state"
+msgstr "Échec de la mise à jour du status"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1271
+msgid "Error."
+msgstr "Erreur."
+
+#, elixir-format
+#: lib/pleroma/captcha/kocaptcha.ex:36
+msgid "Invalid CAPTCHA"
+msgstr "CAPTCHA invalide"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1700
+#: lib/pleroma/web/oauth/oauth_controller.ex:465
+msgid "Invalid credentials"
+msgstr "Paramètres d'authentification invalides"
+
+#, elixir-format
+#: lib/pleroma/plugs/ensure_authenticated_plug.ex:20
+msgid "Invalid credentials."
+msgstr "Paramètres d'authentification invalides."
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:154
+msgid "Invalid indices"
+msgstr "Indices invalides"
+
+#, elixir-format
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:411
+msgid "Invalid parameters"
+msgstr "Paramètres invalides"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/utils.ex:377
+msgid "Invalid password."
+msgstr "Mot de passe invalide."
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:163
+msgid "Invalid request"
+msgstr "Requête invalide"
+
+#, elixir-format
+#: lib/pleroma/captcha/kocaptcha.ex:16
+msgid "Kocaptcha service unavailable"
+msgstr "Service Kocaptcha non disponible"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1696
+msgid "Missing parameters"
+msgstr "Paramètres manquants"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/utils.ex:496
+msgid "No such conversation"
+msgstr "Conversation inconnue"
+
+#, elixir-format
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:163
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:206
+msgid "No such permission_group"
+msgstr "Groupe de permission inconnu"
+
+#, elixir-format
+#: lib/pleroma/plugs/uploaded_media.ex:69
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:311
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:399
+#: lib/pleroma/web/mastodon_api/subscription_controller.ex:63
+#: lib/pleroma/web/ostatus/ostatus_controller.ex:248
+msgid "Not found"
+msgstr "Non Trouvé"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:152
+msgid "Poll's author can't vote"
+msgstr "L'auteur·rice d'un sondage ne peut voter"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:443
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:444
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:473
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:476
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1180
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1564
+msgid "Record not found"
+msgstr "Enregistrement non trouvé"
+
+#, elixir-format
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:417
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1570
+#: lib/pleroma/web/mastodon_api/subscription_controller.ex:69
+#: lib/pleroma/web/ostatus/ostatus_controller.ex:252
+msgid "Something went wrong"
+msgstr "Erreur inconnue"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:253
+msgid "The message visibility must be direct"
+msgstr "La visibilitée du message doit être « direct »"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/utils.ex:521
+msgid "The status is over the character limit"
+msgstr "Le status est au-delà de la limite de charactères"
+
+#, elixir-format
+#: lib/pleroma/plugs/ensure_public_or_authenticated_plug.ex:27
+msgid "This resource requires authentication."
+msgstr "Cette resource nécessite une authentification."
+
+#, elixir-format
+#: lib/pleroma/plugs/rate_limiter.ex:89
+msgid "Throttled"
+msgstr "Limité"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:155
+msgid "Too many choices"
+msgstr "Trop de choix"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:268
+msgid "Unhandled activity type"
+msgstr "Type d'activitée non-gérée"
+
+#, elixir-format
+#: lib/pleroma/plugs/user_is_admin_plug.ex:20
+msgid "User is not admin."
+msgstr "Le compte n'est pas admin."
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:380
+msgid "Valid `account_id` required"
+msgstr "Un `account_id` valide est requis"
+
+#, elixir-format
+#: lib/pleroma/web/admin_api/admin_api_controller.ex:185
+msgid "You can't revoke your own admin status."
+msgstr "Vous ne pouvez révoquer votre propre status d'admin."
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:216
+msgid "Your account is currently disabled"
+msgstr "Votre compte est actuellement désactivé"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:158
+#: lib/pleroma/web/oauth/oauth_controller.ex:213
+msgid "Your login is missing a confirmed e-mail address"
+msgstr "Une confirmation de l'addresse de couriel est requise pour l'authentification"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:221
+msgid "can't read inbox of %{nickname} as %{as_nickname}"
+msgstr "Ne peut lire la boite de réception de %{nickname} en tant que %{as_nickname}"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:297
+msgid "can't update outbox of %{nickname} as %{as_nickname}"
+msgstr "Ne peut poster dans la boite d'émission de %{nickname} en tant que %{as_nickname}"
+
+#, elixir-format
+#: lib/pleroma/web/common_api/common_api.ex:335
+msgid "conversation is already muted"
+msgstr "la conversation est déjà baillonée"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:192
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:317
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1196
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:1247
+msgid "error"
+msgstr "erreur"
+
+#, elixir-format
+#: lib/pleroma/web/mastodon_api/mastodon_api_controller.ex:789
+msgid "mascots can only be images"
+msgstr "les mascottes ne peuvent être que des images"
+
+#, elixir-format
+#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:34
+msgid "not found"
+msgstr "non trouvé"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:298
+msgid "Bad OAuth request."
+msgstr "Requête OAuth invalide."
+
+#, elixir-format
+#: lib/pleroma/captcha/captcha.ex:92
+msgid "CAPTCHA already used"
+msgstr "CAPTCHA déjà utilisé"
+
+#, elixir-format
+#: lib/pleroma/captcha/captcha.ex:89
+msgid "CAPTCHA expired"
+msgstr "CAPTCHA expiré"
+
+#, elixir-format
+#: lib/pleroma/plugs/uploaded_media.ex:50
+msgid "Failed"
+msgstr "Échec"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:314
+msgid "Failed to authenticate: %{message}."
+msgstr "Échec de l'authentification: %{message}"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:345
+msgid "Failed to set up user account."
+msgstr "Échec de création de votre compte."
+
+#, elixir-format
+#: lib/pleroma/plugs/oauth_scopes_plug.ex:37
+msgid "Insufficient permissions: %{permissions}."
+msgstr "Permissions insuffisantes: %{permissions}."
+
+#, elixir-format
+#: lib/pleroma/plugs/uploaded_media.ex:89
+msgid "Internal Error"
+msgstr "Erreur interne"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/fallback_controller.ex:22
+#: lib/pleroma/web/oauth/fallback_controller.ex:29
+msgid "Invalid Username/Password"
+msgstr "Nom d'utilisateur/mot de passe invalide"
+
+#, elixir-format
+#: lib/pleroma/captcha/captcha.ex:107
+msgid "Invalid answer data"
+msgstr "Réponse invalide"
+
+#, elixir-format
+#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:204
+msgid "Nodeinfo schema version not handled"
+msgstr "Version du schéma nodeinfo non géré"
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:145
+msgid "This action is outside the authorized scopes"
+msgstr "Cette action est en dehors des authorisations" # "scopes" ?
+
+#, elixir-format
+#: lib/pleroma/web/oauth/fallback_controller.ex:14
+msgid "Unknown error, please check the details and try again."
+msgstr "Erreur inconnue, veuillez vérifier les détails et réessayer."
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:93
+#: lib/pleroma/web/oauth/oauth_controller.ex:131
+msgid "Unlisted redirect_uri."
+msgstr "redirect_uri non listé."
+
+#, elixir-format
+#: lib/pleroma/web/oauth/oauth_controller.ex:294
+msgid "Unsupported OAuth provider: %{provider}."
+msgstr "Fournisseur OAuth non supporté : %{provider}."
+
+#, elixir-format
+#: lib/pleroma/uploaders/uploader.ex:71
+msgid "Uploader callback timeout"
+msgstr ""
+## msgstr "Attente écoulée"
+
+#, elixir-format
+#: lib/pleroma/web/uploader_controller.ex:11
+#: lib/pleroma/web/uploader_controller.ex:23
+msgid "bad request"
+msgstr "requête invalide"
index ad89f9213b10d54ecb70920eed7a4a7fcf9dfa75..383cc3459285670a7108edfa3e0074e94a4004a6 100644 (file)
@@ -19,8 +19,8 @@ defmodule Pleroma.Emails.AdminEmailTest do
       AdminEmail.report(to_user, reporter, account, [%{name: "Test", id: "12"}], "Test comment")
 
     status_url = Helpers.o_status_url(Pleroma.Web.Endpoint, :notice, "12")
-    reporter_url = Helpers.feed_url(Pleroma.Web.Endpoint, :feed_redirect, reporter.id)
-    account_url = Helpers.feed_url(Pleroma.Web.Endpoint, :feed_redirect, account.id)
+    reporter_url = Helpers.user_feed_url(Pleroma.Web.Endpoint, :feed_redirect, reporter.id)
+    account_url = Helpers.user_feed_url(Pleroma.Web.Endpoint, :feed_redirect, account.id)
 
     assert res.to == [{to_user.name, to_user.email}]
     assert res.from == {config[:name], config[:notify_email]}
diff --git a/test/fixtures/margaret-corbin-grave-west-point.html b/test/fixtures/margaret-corbin-grave-west-point.html
new file mode 100644 (file)
index 0000000..f6d387c
--- /dev/null
@@ -0,0 +1,2895 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+  <link rel="preload" href="https://fonts.atlasobscura.com/2/Platform-Regular-Web.woff2" as="font" type="font/woff2"
+    crossorigin>
+  <link rel="preload" href="https://fonts.atlasobscura.com/2/Platform-Medium-Web.woff2" as="font" type="font/woff2"
+    crossorigin>
+  <link rel="preload" href="https://fonts.atlasobscura.com/2/FreigTexProBookWeb.woff2" as="font" type="font/woff2"
+    crossorigin>
+  <link rel="preload" href="https://fonts.atlasobscura.com/2/FreigTexProBookItWeb.woff2" as="font" type="font/woff2"
+    crossorigin>
+  <link rel="preload" href="https://fonts.atlasobscura.com/icons2/atlasobscura.woff2?3sjg72" as="font" type="font/woff2"
+    crossorigin>
+  <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+  <link rel="dns-prefetch" href="https://assets.atlasobscura.com">
+  <link rel="dns-prefetch" href="//b.scorecardresearch.com">
+  <link rel="dns-prefetch" href="https://maps.google.com">
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta property="fb:app_id" content="206394544492" />
+  <meta property="fb:admins" content="784963490" />
+  <meta property="fb:admins" content="514970725" />
+  <meta property="fb:pages" content="103921782727" />
+  <meta property="og:site_name" content="Atlas Obscura" />
+  <meta name="p:domain_verify" content="0f207004875a5511f774fc29f0a5a3f3" />
+  <meta name="pocket-site-verification" content="8353ea6cd97e141f193687e3013ce3" />
+  <link rel='alternate' type='application/rss+xml' title='Atlas Obscura - Latest Articles and Places'
+    href='https://www.atlasobscura.com/feeds/latest'>
+  <link rel="apple-touch-icon"
+    href='https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/apple-touch-icon.png'>
+  <link rel="apple-touch-icon-precomposed" sizes='144x144'
+    href='https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi0xNDR4MTQ0LXByZWNvbXBvc2VkLnBuZyJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/apple-touch-icon-144x144-precomposed.png'>
+  <link rel="apple-touch-icon-precomposed" sizes='114x114'
+    href='https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi0xMTR4MTE0LXByZWNvbXBvc2VkLnBuZyJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/apple-touch-icon-114x114-precomposed.png'>
+  <link rel="apple-touch-icon-precomposed"
+    href='https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvYXBwbGUtdG91Y2gtaWNvbi1wcmVjb21wb3NlZC5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/apple-touch-icon-precomposed.png'>
+  <link rel="icon" type="image/png" sizes="32x32"
+    href="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvZmF2aWNvbi0zMngzMi5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/favicon-32x32.png">
+  <link rel="icon" type="image/png" sizes="16x16"
+    href="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvZmF2aWNvbi0xNngxNi5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/favicon-16x16.png">
+  <link rel="manifest" href="https://s3.amazonaws.com/atlas-dev/misc/icons/manifest.json">
+  <link rel="mask-icon" href="https://s3.amazonaws.com/atlas-dev/misc/icons/safari-pinned-tab.svg" color="#53b19f">
+  <link rel="shortcut icon" href="https://s3.amazonaws.com/atlas-dev/misc/icons/favicon.ico" sizes="48x48">
+  <meta name="msapplication-config" content="https://s3.amazonaws.com/atlas-dev/misc/icons/browserconfig.xml">
+  <meta name="theme-color" content="#ffffff">
+  <link rel="canonical" href="https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point">
+  <title>The Missing Grave of Margaret Corbin, Revolutionary War Veteran - Atlas Obscura</title>
+  <meta property="description"
+    content="She&#39;s the only woman veteran honored with a monument at West Point. But where was she buried?" />
+  <style>
+    .async-hide {
+      opacity: 1 !important
+    }
+  </style>
+
+  <link rel="stylesheet" media="all"
+    href="https://assets.atlasobscura.com/assets/application-b89b3d9664b00a9207c1e551a84c8d61278379549ee4ff231dd01555e21ac4ac.css" />
+  <meta property="og:title" content="The Missing Grave of Margaret Corbin, Revolutionary War Veteran" />
+  <meta property="og:url" content="http://www.atlasobscura.com/articles/margaret-corbin-grave-west-point" />
+  <meta property="og:image"
+    content="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzkwYzgyMzI4LThlMDUtNGRiNS05MDg3LTUzMGUxZTM5N2RmMmVkOTM5ZDM4MGM4OTIxYTQ5MF9EQVIgZXhodW1hdGlvbiBvZiBNYXJnYXJldCBDb3JiaW4gZ3JhdmUgMTkyNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweD4iXV0/DAR%20exhumation%20of%20Margaret%20Corbin%20grave%201926.jpg" />
+  <meta property="og:description"
+    content="She&#39;s the only woman veteran honored with a monument at West Point. But where was she buried?" />
+  <meta property="og:type" content="article" />
+  <meta property="article:published_time" content="2020-01-14 11:15:00 -0500" />
+  <meta property="article:modified_time" content="2020-01-14 16:31:46 -0500" />
+  <meta property="article:author" content="Shane Cashman">
+  <meta property="article:tag" content="history" />
+  <meta property="article:tag" content="monuments" />
+  <meta property="article:tag" content="military history" />
+  <meta property="article:tag" content="cemeteries" />
+  <meta property="article:tag" content="graveyards" />
+  <meta name="twitter:card" content="summary_large_image">
+  <meta name="twitter:site" content="@atlasobscura">
+  <meta name="twitter:image"
+    content="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzkwYzgyMzI4LThlMDUtNGRiNS05MDg3LTUzMGUxZTM5N2RmMmVkOTM5ZDM4MGM4OTIxYTQ5MF9EQVIgZXhodW1hdGlvbiBvZiBNYXJnYXJldCBDb3JiaW4gZ3JhdmUgMTkyNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweD4iXV0/DAR%20exhumation%20of%20Margaret%20Corbin%20grave%201926.jpg">
+  <link rel="amphtml" href="https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point.amp" />
+</head>
+
+<body class="articles show  ArticleTemplate --">
+  <div id="fb-root"></div>
+
+  <div class="hidden-xs hidden-sm">
+    <div class="ad-background gastro-top-ad">
+      <div class='ad-wrapper hidden-print top-of-site-wrapper' style='position: relative; z-index: 4999;'>
+        <div class="htl-ad" data-unit="Site_Top_Full_Width" data-ref="Site_Top_Full_Width_div"
+          data-sizes="0x0:|668x0:728x90,940x385,970x250" data-prebid="Site_Top_Full_Width" data-eager></div>
+      </div>
+    </div>
+  </div>
+  <header class="page-header">
+    <div class="container-fluid no-pad ">
+      <nav class="navbar-main">
+        <div class="nav-header">
+          <div class="row">
+            <div class="mobile-logo-link">
+              <a class="logo-link" title="Atlas Obscura" href="/">
+                <i class="icon icon-atlas-icon"></i></i><i class="icon icon-atlas-logo-alt"></i>
+              </a>
+            </div>
+            <div
+              class="hidden-xs hidden-sm hidden-print nav-tools-right with-notification-spacer hide-spacer js-notification-spaceable">
+            </div>
+            <div class="nav-search hidden-md hidden-lg hidden-print">
+              <a id="m-search-dropdown-link" class="js-launch-search-link nav-header-search-link-m non-decorated-link"
+                aria-label="Open Site Search Form" data-search-dock="search-dock-m" data-category="Search Suggest"
+                data-action="Opened Search Form" data-label="Global Search" href="javascript:void(0)">
+                <i class="icon-search"></i>
+                <i class="icon-menu-close"></i>
+              </a>
+              <div class="sitewide-hero-search vue-js-nav-search-bar mobile-search">
+                <div class="hero-search-bar-bg"></div>
+                <div class="container hero-search-wrapper js-hero-search-wrapper">
+                  <div class="row">
+                    <div class="col-md-10 col-md-offset-1 hero-search-bar">
+                      <form autocomplete="off" class="js-search-form-to-submit js-hero-search" action="/search"
+                        accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
+                        <search-input></search-input>
+                      </form>
+                    </div>
+                  </div>
+                  <div class="row">
+                    <div class="col-md-10 col-md-offset-1">
+                      <search-suggestions></search-suggestions>
+                    </div>
+                  </div>
+                </div>
+              </div>
+            </div>
+            <div class="nav-toggle-container"></div>
+            <a class="icon-menu-open nav-toggle js-nav-toggle visible-xs visible-sm" href="javascript:void(0)"
+              aria-label="Open menu">
+              <span class="notifications-badge"></span>
+            </a>
+          </div>
+        </div>
+        <div class="nav-content js-nav-content is-slider-hidden-m">
+          <div class="nav-verticals">
+            <div class="nav-left-section">
+              <a class="logo-link" title="Atlas Obscura" href="/">
+                <i class="icon icon-atlas-icon"></i></i><i class="icon icon-atlas-logo-alt"></i>
+              </a>
+            </div>
+            <ul class="nav-center-section">
+              <li class="nav-vertical js-taphover nav-events nav-content-vertical nav-trips">
+                <a class="heading-sm nav-link" href="/unusual-trips">
+                  <div class="heading-sm nav-link-heading">Trips</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="fake-bg"></div>
+                    <div class="row table-display">
+                      <div class="col-md-3 left-panel">
+                        <ul class="nav-links-column links-column nav-hoverable-links-column">
+                          <li>
+                            <a class="tab selected js-nav-rollover-tab" data-target="trip-upcoming-panel"
+                              href="">Upcoming Trips<span class="icon-arrow-down nav-arrow-right"></span></a>
+                          </li>
+
+                          <li>
+                            <a href="/unusual-trips/all">All Trips</a>
+                            <a href="https://blog.atlasobscura.com">Trips Blog</a>
+                          </li>
+                        </ul>
+                        <div id="nav-shop-callout-wrap" style="padding-top: 50%;">
+                          <a class="shop-callout non-decorated-link" target="" href="/unique-gifts/atlas-obscura-book">
+                            <figure class="shop-callout-image-wrap">
+                              <img class="img-responsive"
+                                src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvYXBwLWltYWdlcy9ib29rLzJuZC1lZGl0aW9uLW9uLXNpdGUtcHJvbW8ucG5nIl0sWyJwIiwidGh1bWIiLCIyNTB4PiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/2nd-edition-on-site-promo.png"
+                                alt="2nd edition on site promo" />
+                            </figure>
+                            <div class="shop-callout-text">
+                              <div class="detail-md">Get the Atlas Obscura book</div>
+                              <div class="cta-xs shop-action-text">Shop Now »</div>
+                            </div>
+                          </a>
+                        </div>
+                      </div>
+                      <div id="trip-upcoming-panel" class="col-md-9 right-panel">
+                        <div class="row">
+                          <div class="col-md-9">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Upcoming Trips</h4>
+                          </div>
+                          <div class="col-md-3">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/unusual-trips/all">View All Trips
+                              »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <div class="col-md-3">
+                            <a class="nav-card" href="/unusual-trips/peru-amazon">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDQvMTMvMTkvNDgvNDYvZTdkNDNkODctZGQwMy00MzJlLTg5NjMtMzhiNjRjY2IwNGMwL01hY2F3IHBlcnUyLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/Macaw%20peru2.jpg"
+                                alt="" data-width="2466" data-height="1504" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                              <h3 class="title-sm nav-card-title">
+                                <span class="title-underline">Expedition Amazon</span>
+                              </h3>
+                            </a>
+                          </div>
+                          <div class="col-md-3">
+                            <a class="nav-card" href="/unusual-trips/new-orleans">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXZlbnRfaW1hZ2VzLzc4ZjIyYzE3LWQ2Y2UtNGM5Yi1hY2U2LWQ4NTZiYzUzMGExNmU4NmQ3NjJiYWU2MWFmOTA5N19OT0xBX1Bvc3RlcjEuSlBHIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/NOLA_Poster1.JPG"
+                                alt="" data-width="6000" data-height="4006" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                              <h3 class="title-sm nav-card-title">
+                                <span class="title-underline">Shifting Tides: Art in New Orleans</span>
+                              </h3>
+                            </a>
+                          </div>
+                          <div class="col-md-3">
+                            <a class="nav-card" href="/unusual-trips/galicia-culinary">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXZlbnRfaW1hZ2VzLzQ4M2M1Zjk2LWVmYjYtNGNmZC1hMzBkLWE4NDNiZWJjOGYzYTM1ZTJmZTcxNTdjZWU0ZDliZV9EU0NfMjI4OCAoMSkuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/DSC_2288%20%281%29.jpg"
+                                alt="" data-width="3008" data-height="2000" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                              <h3 class="title-sm nav-card-title">
+                                <span class="title-underline">Barnacles, Bluffs, and Brine: A Galician Seafood
+                                  Pilgrimage</span>
+                              </h3>
+                            </a>
+                          </div>
+                          <div class="col-md-3">
+                            <a class="nav-card" href="/unusual-trips/borrego-springs-photography">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXZlbnRfaW1hZ2VzLzlhY2Q0Yjk5LTM4NjQtNGJiNy04NTZlLWVjOTdjZTUzZjgyZjViZGRkNWM5ZjNjZTRlZmEyNV9EZXNlcnQgQmVhc3RzIEtlaW1pZy02LmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/Desert%20Beasts%20Keimig-6.jpg"
+                                alt="" data-width="1800" data-height="1202" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                              <h3 class="title-sm nav-card-title">
+                                <span class="title-underline">Dark Skies, Desert Beasts: Night Photography in Borrego
+                                  Springs, California</span>
+                              </h3>
+                            </a>
+                          </div>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="nav-vertical js-taphover nav-events nav-content-vertical">
+                <a class="heading-sm nav-link" href="/experiences">
+                  <div class="heading-sm nav-link-heading">Experiences</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="fake-bg"></div>
+                    <div class="row table-display">
+                      <div class="col-md-3 left-panel">
+                        <h3 class="nav-panel-title">Quick Links</h3>
+                        <ul class="nav-links-column links-column">
+                          <li><a href="/experiences">All Experiences</a></li>
+                        </ul>
+                        <h3 class="nav-panel-title">Experiences by City</h3>
+                        <ul class="nav-links-column links-column">
+                          <li><a href="/things-to-do/chicago-illinois#upcoming-experiences">Chicago</a></li>
+                          <li><a href="/things-to-do/denver-colorado#upcoming-experiences">Denver</a></li>
+                          <li><a href="/things-to-do/los-angeles-california#upcoming-experiences">Los Angeles</a></li>
+                          <li><a href="/things-to-do/new-york#upcoming-experiences">New York</a></li>
+                          <li><a href="/things-to-do/philadelphia-pennsylvania#upcoming-experiences">Philadelphia</a>
+                          </li>
+                          <li><a href="/things-to-do/seattle-washington#upcoming-experiences">Seattle</a></li>
+                          <li><a href="/things-to-do/washington-dc#upcoming-experiences">Washington, D.C.</a></li>
+                        </ul>
+                      </div>
+                      <div class="col-md-9 right-panel">
+                        <div class="row">
+                          <div class="col-md-9">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Upcoming Experiences</h4>
+                          </div>
+                          <div class="col-md-3">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/experiences">View All Experiences
+                              »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <a class="col-md-3 nav-card" href="/experiences/walking-the-hidden-wonders-of-midtown">
+                            <div class="event-image-date-ko">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXhwZXJpZW5jZV9zZXJpZXNfaW1hZ2VzLzIwNC81ZjdhYmNkNzc0NTNmZDkyNzgwMS9jMzJkMjlhZi1iNWJlLTRjOGUtYmYxYy1jZTMxMWMzZTVhZjEuanBlZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/c32d29af-b5be-4c8e-bf1c-ce311c3e5af1.jpeg"
+                                alt="" data-width="1066" data-height="1600" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <div class="detail-sm nav-card-location">New York</div>
+                            <h3 class="title-sm nav-card-title">
+                              <span class="title-underline">Walking the Hidden Wonders of Midtown</span>
+                            </h3>
+                          </a> <a class="col-md-3 nav-card" href="/experiences/visit-nycs-oldest-magic-shop-after-dark">
+                            <div class="event-image-date-ko">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXhwZXJpZW5jZV9zZXJpZXNfaW1hZ2VzLzcyLzNkMTFlODQwZDc1MGIyMDFkMzBiL2YzMDA3NTI0LTE0ODUtNDE1Yy1iY2M3LWEzNzJlOTZjMDNhYy5qcGVnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/f3007524-1485-415c-bcc7-a372e96c03ac.jpeg"
+                                alt="" data-width="1440" data-height="960" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <div class="detail-sm nav-card-location">New York</div>
+                            <h3 class="title-sm nav-card-title">
+                              <span class="title-underline">Visit NYC&#39;s Oldest Magic Shop After Dark</span>
+                            </h3>
+                          </a> <a class="col-md-3 nav-card" href="/experiences/atlas-obscuras-wonders-of-fidi">
+                            <div class="event-image-date-ko">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXhwZXJpZW5jZV9zZXJpZXNfaW1hZ2VzLzIwNS80MDYwNTY3N2IyZjk2ZWQyNTQ2ZC82OTY4OGRmMy1hNWY4LTRkMmYtYjk0OC0zZjk0MmFiNTAzOTMuanBlZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/69688df3-a5f8-4d2f-b948-3f942ab50393.jpeg"
+                                alt="" data-width="1074" data-height="1600" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <div class="detail-sm nav-card-location">New York</div>
+                            <h3 class="title-sm nav-card-title">
+                              <span class="title-underline">Atlas Obscura&#39;s Wonders of FiDi</span>
+                            </h3>
+                          </a> <a class="col-md-3 nav-card" href="/experiences/a-hoppin-good-time-at-the-bunny-museum">
+                            <div class="event-image-date-ko">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvZXhwZXJpZW5jZV9zZXJpZXNfaW1hZ2VzLzIwNy9kOWI4ODczZDUzOTAxODQ2YmVhYy8xYTMyZWI2NS04YTg2LTQzOGYtOGM2YS0yMDgxMjQxMjVlMjMuanBlZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/1a32eb65-8a86-438f-8c6a-208124125e23.jpeg"
+                                alt="" data-width="1067" data-height="1600" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <div class="detail-sm nav-card-location">Altadena</div>
+                            <h3 class="title-sm nav-card-title">
+                              <span class="title-underline">A Hoppin&#39; Good Time at The Bunny Museum</span>
+                            </h3>
+                          </a> </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="nav-vertical js-taphover nav-atlas nav-content-vertical">
+                <a class="heading-sm nav-link" href="/articles/all-places-in-the-atlas-on-one-map">
+                  <div class="heading-sm nav-link-heading">Places</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="fake-bg"></div>
+                    <div class="row table-display">
+                      <div class="col-md-3 left-panel">
+                        <ul class="nav-links-column links-column nav-hoverable-links-column">
+                          <li>
+                            <a class="tab selected js-nav-rollover-tab" data-target="destinations-panel" href="">
+                              Top Destinations<span class="icon-arrow-down nav-arrow-right"></span>
+                            </a>
+                          </li>
+                          <li>
+                            <a class="tab js-nav-rollover-tab" data-target="recent-places-panel" href="">
+                              Newly Added Places<span class="icon-arrow-down nav-arrow-right"></span>
+                            </a>
+                          </li>
+                          <li>
+                            <a href="/places?sort=likes_count">
+                              Most Popular Places
+                            </a>
+                          </li>
+                          <li>
+                            <a class="js-dropdown-random" href="/random">
+                              Random Place
+                            </a>
+                          </li>
+                          <li>
+                            <a href="/lists">
+                              Lists
+                            </a>
+                          </li>
+                          <li>
+                            <a href="/itineraries">
+                              Itineraries
+                            </a>
+                          </li>
+                          <li>
+                            <hr>
+                            <a class="add-place js-user-required" data-cause-key="p_add" href=/places/new> <i
+                              class="icon-add-place"></i>
+                              Add a Place
+                            </a>
+                          </li>
+                          <li id="nav-dropdown-forum-link-wrap">
+                            <hr>
+                            <a class="js-social-action-tracked nav-dropdown-forum-link" data-service="Forum"
+                              data-action="Discuss" data-position="Places Desktop Nav"
+                              href="https://community.atlasobscura.com"><i class='material-icons'>forum</i> Visit Our
+                              Forums</a>
+                          </li>
+                        </ul>
+                      </div>
+                      <div id="recent-places-panel" class="col-md-9 right-panel" style="display:none">
+                        <div class="row">
+                          <div class="col-md-8">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Newly Added Places</h4>
+                          </div>
+                          <div class="col-md-4">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/places">View All Places »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <a class="col-md-3 nav-card" href="/places/captain-america-statue-brooklyn">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzLzQzMWYyZDFkOTdlZTkyNjk0OF9JTUdfMjExMi5KUEciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMjIyeDE0OCMiXV0/IMG_2112.JPG"
+                              alt="" data-width="3264" data-height="2448" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm nav-card-location">Brooklyn, New York</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Captain America
+                                Statue</span></h3>
+                            <div class="lat-lng nav-card-details" aria-hidden="true">
+                              40.6592, -74.0046
+                            </div>
+                          </a> <a class="col-md-3 nav-card" href="/places/plimoth-plantation">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzLzBiZmM5NzAxLTI4MWQtNGI1Ny04YzlmLWQ1ZTFjNjJmM2Y4MTY2ZDI5NDJlYTU2NDNkNjc4Yl8xMjgwcHgtUGxpbW90aF9QbGFudGF0aW9uX0ZlbmNlLmpwZWciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMjIyeDE0OCMiXV0/1280px-Plimoth_Plantation_Fence.jpeg"
+                              alt="" data-width="1280" data-height="853" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm nav-card-location">Plymouth, Massachusetts</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Plimoth Plantation</span>
+                            </h3>
+                            <div class="lat-lng nav-card-details" aria-hidden="true">
+                              41.9382, -70.6254
+                            </div>
+                          </a> <a class="col-md-3 nav-card" href="/places/the-churchill-arms-pub">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzLzMyMGZmNWVjMWJmZTEzYzA1MF8xODgzOTg1NDU0M18yYWExMWM5NzM2X28uanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/18839854543_2aa11c9736_o.jpg"
+                              alt="The pub&#39;s exterior is covered in hundreds of flowers." data-width="1440"
+                              data-height="1920" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm nav-card-location">London, England</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">The Churchill Arms</span>
+                            </h3>
+                            <div class="lat-lng nav-card-details" aria-hidden="true">
+                              51.5069, -0.1948
+                            </div>
+                          </a> <a class="col-md-3 nav-card" href="/places/barney-ford-house-museum">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzLzFlNjRmNTk2LWQ2NDgtNGRkYy1iNDMzLWFkMDhiZDRkZTk4Y2NlMTFjNDY3M2FkMDczOTU1NF9CYXJuZXlGb3JkMDEuMDIuMjBEaW5pbmdSb29tLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/BarneyFord01.02.20DiningRoom.jpg"
+                              alt="Barney Ford House Museum" data-width="4032" data-height="1960"
+                              class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm nav-card-location">Breckenridge, Colorado</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Barney Ford House
+                                Museum</span></h3>
+                            <div class="lat-lng nav-card-details" aria-hidden="true">
+                              39.4806, -106.0455
+                            </div>
+                          </a> </div>
+                      </div>
+                      <div id="destinations-panel" class="col-md-9 right-panel">
+                        <div class="row">
+                          <div class="col-md-8">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Top Destinations</h4>
+                          </div>
+                          <div class="col-md-4">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/destinations">View All Destinations
+                              »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <section class="section-top-content">
+                            <div class="col-md-3 section-top-content-col">
+                              <div class="places-section-top-content-header">
+                                <h4 class="section-top-content-title detail-sm">Countries</h4>
+                              </div>
+                              <ul id="top-destinations-list-nav"
+                                class="top-content-list links-column top-content-list-col-sm-2">
+                                <li>
+                                  <a href='/things-to-do/australia' title='Australia'>Australia</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/canada' title='Canada'>Canada</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/china' title='China'>China</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/france' title='France'>France</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/germany' title='Germany'>Germany</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/india' title='India'>India</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/italy' title='Italy'>Italy</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/japan' title='Japan'>Japan</a>
+                                </li>
+                              </ul>
+                            </div>
+                            <div class="col-md-9 section-top-content-col">
+                              <div class="places-section-top-content-header">
+                                <h4 class="section-top-content-title detail-sm">Cities</h4>
+                              </div>
+                              <ul class="top-content-list links-column top-content-list-col-sm-2">
+                                <li>
+                                  <a href='/things-to-do/amsterdam-netherlands' title='Amsterdam'>Amsterdam</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/barcelona-spain' title='Barcelona'>Barcelona</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/beijing-china' title='Beijing'>Beijing</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/berlin-germany' title='Berlin'>Berlin</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/boston-massachusetts' title='Boston'>Boston</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/budapest-hungary' title='Budapest'>Budapest</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/chicago-illinois' title='Chicago'>Chicago</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/london-england' title='London'>London</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/los-angeles-california' title='Los Angeles'>Los Angeles</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/mexico-city-mexico' title='Mexico City'>Mexico City</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/montreal-quebec' title='Montreal'>Montreal</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/moscow-russia' title='Moscow'>Moscow</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/new-orleans-louisiana' title='New Orleans'>New Orleans</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/new-york' title='New York City'>New York City</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/paris-france' title='Paris'>Paris</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/philadelphia-pennsylvania'
+                                    title='Philadelphia'>Philadelphia</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/rome-italy' title='Rome'>Rome</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/san-francisco-california' title='San Francisco'>San
+                                    Francisco</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/seattle-washington' title='Seattle'>Seattle</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/stockholm-sweden' title='Stockholm'>Stockholm</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/tokyo-japan' title='Tokyo'>Tokyo</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/toronto-ontario' title='Toronto'>Toronto</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/vienna-austria' title='Vienna'>Vienna</a>
+                                </li>
+                                <li>
+                                  <a href='/things-to-do/washington-dc' title='Washington, D.C.'>Washington, D.C.</a>
+                                </li>
+                              </ul>
+                            </div>
+                          </section>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="nav-vertical js-taphover nav-foods nav-content-vertical">
+                <a class="heading-sm nav-link" href="/gastro">
+                  <div class="heading-sm nav-link-heading">Foods</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="row table-display">
+                      <div class="nav-full-panel col-md-12">
+                        <div class="row">
+                          <div class="col-md-8">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Newly Added Food & Drink</h4>
+                          </div>
+                          <div class="col-md-4">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/foods">View All Food &amp; Drink »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <a class="nav-card" href="/foods/neua-tune-45-year-soup-wattana-panich">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvdGhpbmdfaW1hZ2VzLzBhYzExMzJhLTg2YjItNDNlOS1hNWFiLTQzYmNkYTNlZDQ4ZWJjNzg5ZDc2ZTNkODUxZTg2Zl9uZXVhdHVuZV9hbGV4eXFqLmpwZWciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMjIyeDE0OCMiXV0/neuatune_alexyqj.jpeg"
+                              alt="" data-width="3024" data-height="4032" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm food-card-supertag">Prepared Foods</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Long-Simmering Soup at
+                                Wattana Panich</span></h3>
+                          </a> <a class="nav-card" href="/foods/chitlins-american-south">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvdGhpbmdfaW1hZ2VzLzFlMTJiZjYwYTM1N2VhZWQzMl9jaGl0bGluczEuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/chitlins1.jpg"
+                              alt="A bowl of chitlins." data-width="1312" data-height="1312" class="lazy img-responsive"
+                              nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm food-card-supertag">Prepared Foods</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Chitlins</span></h3>
+                          </a> <a class="nav-card" href="/foods/hoppin-john">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvdGhpbmdfaW1hZ2VzLzQzYTA2ODM0LWNiYWItNGY5OC05YTNkLWM5M2ZlZTM5NGViZDg3ZDMzYjNlNmM0ZWM1NjUxMF9Ib3BwaW4gSm9obl9DQyBCeSAyLjAuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/Hoppin%20John_CC%20By%202.0.jpg"
+                              alt="" data-width="4288" data-height="2848" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm food-card-supertag">Prepared Foods</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Hoppin&#39; John</span>
+                            </h3>
+                          </a> <a class="nav-card" href="/foods/twelve-grapes-new-years-eve">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvdGhpbmdfaW1hZ2VzL2VlZTYxNmVmYzU4NmU0MzZmNl9SYWnMiG1fZGVfQ2FwX2QnQW55LmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/Rai%CC%88m_de_Cap_d%27Any.jpg"
+                              alt="Are you feeling lucky?" data-width="945" data-height="633"
+                              class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm food-card-supertag">Ritual &amp; Medicinal</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Twelve Grapes</span></h3>
+                          </a> <a class="nav-card" href="/foods/reveillon-dinner">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvdGhpbmdfaW1hZ2VzLzU3ODNhYzVmMzcxZjYwNTc1NV9SZXZlaWxsb24yX0RhdmlkUmljaG1vbmQuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/Reveillon2_DavidRichmond.jpg"
+                              alt="A modern spread of Reveillon delights." data-width="1170" data-height="1035"
+                              class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <div class="detail-sm food-card-supertag">Ritual &amp; Medicinal</div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Réveillon Dinner</span>
+                            </h3>
+                          </a> </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="nav-vertical js-taphover nav-articles nav-content-vertical">
+                <a class="heading-sm nav-link" href="/articles">
+                  <div class="heading-sm nav-link-heading">Stories</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="row table-display">
+                      <div class="nav-full-panel">
+                        <div class="row">
+                          <div class="col-md-8">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Most Recent Stories</h4>
+                          </div>
+                          <div class="col-md-4">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/articles">View All Stories »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <a class="col-md-3 nav-card" href="/articles/meet-diving-grannies-new-caledonia">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzQ4YmUzNTQ3LTU1NmUtNDAzZi1iMjI1LWRhNzA4Y2QzNTVmY2RhOTZlMDAwYzljN2I4OGE5NF9kaXZpbmcuZ3Jhbm5pZXMuY3JvcHBlZC50aW1lc3RhbXAubGVhZC5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMjIyeDE0OCMiXV0/diving.grannies.cropped.timestamp.lead.jpg"
+                              alt="Two of the &quot;Fantastic Grandmothers&quot; document a greater sea snake, photo-identifying its uniquely patterned tail for their growing database."
+                              data-width="1828" data-height="1223" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">The Snorkeling Grannies of
+                                New Caledonia</span></h3>
+                            <div class="detail-sm nav-card-details js-time-ago"
+                              data-timestamp="2020-01-27 22:10:00 UTC"></div>
+                          </a> <a class="col-md-3 nav-card" href="/articles/were-there-witchhunts-in-south-america">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzL2ZlYzA3N2Y5LTcxOWEtNDI1My04ODUwLTkxMDFiZmExYjgxNDlkNGJkM2ZiNDgzMzBhNzBlYl9BdGxhc19PYnNjdXJhX1dpdGNoZXNfTEFfMS5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMjIyeDE0OCMiXV0/Atlas_Obscura_Witches_LA_1.jpg"
+                              alt="According to Inquisition records, men were often fearful that women would slip magic potions into their morning hot chocolate. "
+                              data-width="1280" data-height="853" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">The Chocolate-Brewing
+                                Witches of Colonial Latin America</span></h3>
+                            <div class="detail-sm nav-card-details js-time-ago"
+                              data-timestamp="2020-01-27 21:51:00 UTC"></div>
+                          </a> <a class="col-md-3 nav-card" href="/articles/ww2-bombs-berlin">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzYzZjU4NTNjLWM5ODAtNDAyYi05YjRhLTQ1ZmVjODRhYzhmNzcyNTBiMjhlYzliNTNkNTRhNF9HZXR0eUltYWdlcy0xMTk1MTkzNzc5X2Nyb3AuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/GettyImages-1195193779_crop.jpg"
+                              alt="German authorities with a 500-pound bomb discovered during construction work. Such discoveries are regular occurrences in cities that were bombed during World War II. "
+                              data-width="1280" data-height="888" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">What Happens When They
+                                Find a World War II Bomb Down the Street</span></h3>
+                            <div class="detail-sm nav-card-details js-time-ago"
+                              data-timestamp="2020-01-27 20:07:00 UTC"></div>
+                          </a> <a class="col-md-3 nav-card" href="/articles/eritrean-tank-graveyard">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzL2I4YTI1Y2RkLWM5MjktNGRiZi05YTg3LTNmMzM0YTk1NDYwN2NiNTU2NmY4NDc3ZGI0YzMwNF8xNjAwcHgtUGFzc2luZ190aGVfdGFua19ncmF2ZXlhcmQuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjIyMngxNDgjIl1d/1600px-Passing_the_tank_graveyard.jpg"
+                              alt="A cyclist rides past the tank graveyard in 2016." data-width="1600"
+                              data-height="1060" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">This Tank Graveyard Is a
+                                Monument to Eritrea&#39;s Struggle for Liberation</span></h3>
+                            <div class="detail-sm nav-card-details js-time-ago"
+                              data-timestamp="2020-01-27 20:05:00 UTC"></div>
+                          </a> <a class="col-md-3 nav-card"
+                            href="/articles/french-missionary-english-duke-bring-back-chinese-deer">
+                            <img
+                              data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzFiM2EzOGE0LTM2OGQtNDRkZi1iNzVhLWYyNzAwM2I3MjcwNjhhMjg0MTAxMWMwMjZiZTFkYV9kZWVyLmZvcmVzdC5ncmF6aW5nLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIyMjJ4MTQ4IyJdXQ/deer.forest.grazing.jpg"
+                              alt="Today nearly 7,000 Père David&#39;s deer roam the wetlands of China. "
+                              data-width="800" data-height="533" class="lazy img-responsive" nopin="nopin"
+                              src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">The French Missionary and
+                                the English Duke Who Saved a Chinese Deer From Extinction</span></h3>
+                            <div class="detail-sm nav-card-details js-time-ago"
+                              data-timestamp="2020-01-24 23:20:00 UTC"></div>
+                          </a> </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="nav-vertical nav-videos nav-content-vertical js-taphover">
+                <a class="heading-sm nav-link" href="/videos">
+                  <div class="heading-sm nav-link-heading">Videos</div>
+                </a>
+                <div class="nav-dropdown">
+                  <div class="container nav-dropdown-content">
+                    <div class="row table-display">
+                      <div class="nav-full-panel">
+                        <div class="row">
+                          <div class="col-md-8">
+                            <h4 class="nav-category-heading heading-md-non-uppercase">Most Recent Videos</h4>
+                          </div>
+                          <div class="col-md-4">
+                            <a class="detail-sm nav-dropdown-viewall-link" href="/videos">View All Videos »</a>
+                          </div>
+                        </div>
+                        <div class="row">
+                          <a class="col-md-3 nav-card" href="/videos/welsh-town-all-books">
+                            <div class="video-thumb-container">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMjAvMDEvMjIvMTUvMzkvMTIvNDhlYTcxNTItYWI1MC00NGVjLTgyN2YtYzVjY2E1NTY5NTMyL2hheV9vbl93eWVfc3RpbGxfMDEuanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjQ0MHgyNDgjIl1d"
+                                alt="" data-width="1920" data-height="1080" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">This Tiny Welsh Town Is
+                                Brimming With Books</span></h3>
+                            <div class="detail-sm nav-card-details video-duration">5:04</div>
+                          </a> <a class="col-md-3 nav-card"
+                            href="/videos/see-cars-roll-uphill-on-scotland-s-electric-brae">
+                            <div class="video-thumb-container">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMjAvMDEvMjIvMTUvNDIvMjYvOWVkZDBkNDYtZDhkOC00OWI0LWJmNWUtYTE2N2VkMjk2M2FmL2FvX2VsZWN0cmljX2JyYWVfZmJfMDExMzE5X3YxLjAwXzAyXzU0XzIxLnN0aWxsMDAxXzcyMC5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNDQweDI0OCMiXV0"
+                                alt="" data-width="720" data-height="405" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">On Scotland&#39;s Electric
+                                Brae, Cars Really Do Seem to Roll Uphill</span></h3>
+                            <div class="detail-sm nav-card-details video-duration">4:54</div>
+                          </a> <a class="col-md-3 nav-card"
+                            href="/videos/dynasty-handbag-los-angeles-performance-artist">
+                            <div class="video-thumb-container">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMjAvMDEvMDgvMjAvMTIvMzAvMTY2ZTA0ZWEtYjYwMy00MWI3LWEyM2QtNmY3NTY0YTY0ODZiL0R5bmFzdHkgSGFuZGJhZyBTdGlsbCAwMS5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNDQweDI0OCMiXV0"
+                                alt="" data-width="1920" data-height="1080" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Meet Dynasty Handbag,
+                                L.A.’s Queen of Weird</span></h3>
+                            <div class="detail-sm nav-card-details video-duration">6:14</div>
+                          </a> <a class="col-md-3 nav-card" href="/videos/the-unusual-italian-village-in-wales">
+                            <div class="video-thumb-container">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMTIvMjAvMjAvMjEvMTEvMzc5ZWFlMzctZmI3My00Zjc5LTlkMjItMzMzZWNkZTc4YmNlL0FPIFBvcnRtZWlyaW9uIFN0aWxsIDAyLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCI0NDB4MjQ4IyJdXQ"
+                                alt="" data-width="1920" data-height="1080" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Why There&#39;s an
+                                &#39;Italian&#39; Village in Wales</span></h3>
+                            <div class="detail-sm nav-card-details video-duration">5:27</div>
+                          </a> <a class="col-md-3 nav-card" href="/videos/surfing-alaska-famous-bore-tide">
+                            <div class="video-thumb-container">
+                              <img
+                                data-src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMTIvMjAvMjAvMTMvNDAvZWExMzNhMTQtMDRmNy00ODZkLTliNDYtMDRlNmQ1M2JiMzU4L0FPIEJvcmUgVGlkZSBTdGlsbCAwMy5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNDQweDI0OCMiXV0"
+                                alt="" data-width="3840" data-height="2160" class="lazy img-responsive" nopin="nopin"
+                                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                            </div>
+                            <h3 class="title-sm nav-card-title"><span class="title-underline">Surfing Alaska&#39;s
+                                Unique Bore Tide</span></h3>
+                            <div class="detail-sm nav-card-details video-duration">4:14</div>
+                          </a> </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="hidden-md hidden-lg" style="width: 100%;">
+
+                <div class="nav-vertical nav-vertical-sessions-m">
+                  <div class="nav-session-links-wrap-m">
+
+                    <a href="/sign-in" class="heading-sm nav-session-link-m nav-link">
+                      <i class="icon-profile nav-session-icon"></i>Sign In
+                    </a><i class="or-pipe or-pipe-sessions-m"></i>
+                    <a href="/join" class="heading-sm nav-session-link-m nav-link">
+                      Join
+                    </a>
+                  </div>
+                </div>
+              </li>
+            </ul>
+            <ul class="nav-right-section">
+              <li class="user-cell">
+                <div id="nav-profile-menu" class="dropdown">
+                  <div class="nav-session-link detail-sm profile-dropdown js-profile-dropdown js-taphover" tabindex="0"
+                    aria-label="User Profile Options" aria-haspopup="true">
+                    <a href="javascript:void(0)" class="profile-nav-hover-target" aria-label="Account options">
+                      <i class="icon user-icon icon-profile"></i>
+                    </a>
+                    <div class="profile-dropdown-menu js-profile-dropdown-menu dropdown-menu dropdown-menu-right"
+                      tabindex="0">
+                      <a id="nav-sign-in-link" class="nav-session-link detail-sm dropdown-item" href="/sign-in">Sign
+                        In</a>
+                      <hr>
+                      <a id="nav-sign-up-link" class="nav-session-link detail-sm dropdown-item" href="/join">Join</a>
+                    </div>
+                  </div>
+                </div>
+              </li>
+              <li class="search-cell">
+                <div class="nav-search">
+                  <a id="d-search-dropdown-link" class="heading-sm nav-link js-launch-search-link"
+                    aria-label="Open Site Search Form" data-search-dock="nav-dropdown-search-dock"
+                    data-category="Search Suggest" data-action="Opened Search Form" data-label="Global Search"
+                    href="javascript:void(0)">
+                    <i class="icon-search"></i>
+                    <i class="icon-menu-close"></i>
+                  </a>
+                  <div class="sitewide-hero-search vue-js-nav-search-bar desktop-search">
+                    <div class="hero-search-bar-bg"></div>
+                    <div class="container hero-search-wrapper js-hero-search-wrapper">
+                      <div class="row">
+                        <div class="col-md-10 col-md-offset-1 hero-search-bar">
+                          <form autocomplete="off" class="js-search-form-to-submit js-hero-search" action="/search"
+                            accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
+                            <search-input></search-input>
+                          </form>
+                        </div>
+                      </div>
+                      <div class="row">
+                        <div class="col-md-10 col-md-offset-1">
+                          <search-suggestions></search-suggestions>
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </li>
+            </ul>
+          </div>
+        </div>
+      </nav>
+      <div id="search-dock-m" class="container-fluid search-dock"></div>
+      <div class="m-nearby-search">
+        <a class="js-search-nearby btn btn-places btn-icon js-link-tracked" data-category="Search Nearby"
+          data-action="Submitted" data-label="articles" href="javascript:void(0)">
+          <i class="icon-nearby-place"></i>
+          What's near me?
+        </a>
+        <a id="delta-nearby-wrap" href="https://ad.doubleclick.net/ddm/clk/416154737;217514481;g" target="_blank"
+          rel="noopener" class="hidden non-decorated-link">
+          <div class="cta-xs">Brought to you by</div>
+          <div style="width: 130px; margin-left: 15px;">
+            <img class="img-responsive"
+              src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2Mvc3BvbnNvci1vbmUtb2Zmcy9kZWx0YV9sb2dvLnBuZyJdLFsicCIsInRodW1iIiwiMjYweD4iXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/delta_logo.png"
+              alt="Delta logo" />
+          </div>
+        </a>
+      </div>
+    </div>
+    <div class="oop-tracking-pixel">
+      <div class="htl-ad" data-unit="1x1_tracking_pixel" data-ref="1x1_tracking_pixel_div" data-sizes="1x1"
+        data-prebid="1x1_tracking_pixel" data-eager></div>
+    </div>
+  </header>
+  <div id="page-content">
+    <article class="athanasius item-content js-article-content article-content article--content  ">
+      <div class="ArticleHeaderBg ArticleHeaderBg--dark ArticleHeaderBg--wide-hero ArticleHeaderBg--  ">
+        <header class="ArticleHeader  js-item-header ArticleHeader--wide-hero ">
+          <div class="container">
+            <h1 class="ArticleHeader__title">The Missing Grave of Margaret Corbin, Revolutionary War Veteran</h1>
+            <h2 class="ArticleHeader__subtitle">
+              She&#8217;s the only woman veteran honored with a monument at West Point. But where was she buried?
+            </h2>
+            <div class="ArticleHeader__end-matter">
+              <div class="ArticleHeader__byline-dateline">
+                <span class="ArticleHeader__byline">by <a href="/users/shanecashman?view=articles">Shane
+                    Cashman</a></span>
+                <span class="ArticleHeader__pub-date">January 14, 2020</span>
+              </div>
+              <div class="ArticleHeader__social hidden-sm hidden-xs">
+                <div class="SocialLinks ">
+                  <a class="js-share-button-facebook js-social-action-tracked" data-position="Header"
+                    data-service="Facebook" data-action="Share" aria-label="Share on Facebook" href="">
+                    <i class="icon icon-facebook"></i>
+                  </a>
+                  <a target="_blank" class="js-social-action-tracked js-social-ask-for-follow" data-position="Header"
+                    data-service="Twitter" data-action="Share" aria-label="Share on Twitter"
+                    href="https://twitter.com/share?text=The%20Missing%20Grave%20of%20Margaret%20Corbin%2C%20Revolutionary%20War%20Veteran%20@atlasobscura&amp;count=none&amp;url=https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point">
+                    <i class="icon icon-twitter"></i>
+                  </a>
+                </div>
+              </div>
+            </div>
+          </div>
+        </header>
+      </div>
+      <div id="btf-nav" class="container-fluid hidden athanasius">
+        <div class="row">
+          <div class="mini-nav-wrapper Subnav--with-depth">
+            <div class="container-fluid">
+              <nav>
+                <div class="mini-nav-contents">
+                  <div id="btf-nav-home" class="btf-nav-square hidden-sm hidden-xs">
+                    <a class="mini-nav-logo-link non-decorated-link" title="Atlas Obscura" href="/"><i
+                        class="icon icon-atlas-icon"></i></a>
+                  </div>
+                  <div id="btf-nav-title" class="detail hidden-sm hidden-xs">
+                    The Missing Grave of Margaret Corbin, Revolutionary War Veteran
+                  </div>
+                  <div class="social-links">
+                    <div class="btf-nav-square first-in-series">
+                      <a href="javascript:void(0)"
+                        class="icon icon-facebook link-facebook social-link js-social-action-tracked js-share-button-facebook"
+                        data-position="Sticky Header" data-service="Facebook" data-action="Share" target="_blank"
+                        aria-label="Share on Facebook"></a>
+                    </div>
+                    <div class="btf-nav-square">
+                      <a href="https://twitter.com/share?text=The%20Missing%20Grave%20of%20Margaret%20Corbin%2C%20Revolutionary%20War%20Veteran%20@atlasobscura&amp;count=none&amp;url=https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point"
+                        class="icon icon-twitter social-link link-twitter js-social-action-tracked js-social-ask-for-follow"
+                        target="_blank" data-position="Sticky Header" data-service="Twitter" data-action="Share"
+                        aria-label="Share on Twitter"></a>
+                    </div>
+                    <div class="btf-nav-square">
+                      <a href="https://www.reddit.com/submit?url=https%3A%2F%2Fwww.atlasobscura.com%2Farticles%2Fmargaret-corbin-grave-west-point"
+                        class="icon icon-reddit link-reddit social-link js-social-action-tracked"
+                        data-position="Sticky Header" data-service="reddit" data-action="Share" target="_blank"
+                        aria-label="Share on Reddit"></a>
+                    </div>
+                    <div class="btf-nav-square">
+                      <a href="mailto:?subject=The Missing Grave of Margaret Corbin, Revolutionary War Veteran&body=Discovered on Atlas Obscura: https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point"
+                        class="icon icon-envelope link-email social-link js-social-action-tracked js-btn-email-share hidden-md hidden-lg"
+                        data-position="Sticky Header" data-service="Email" data-action="Send"
+                        aria-label="Email this"></a>
+                    </div>
+                  </div>
+                </div>
+              </nav>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div id="article-container" class="container">
+        <div class="row">
+          <div id="article-hero" class="hero-img-wide col-xs-12 col-md-8 hidden-print ArticleHero ">
+            <img
+              alt="In 1926, the Daughters of the American Revolution joined forces with the U.S. Military Academy to exhume the supposed burial site of Margaret Corbin."
+              data-width="2304" data-height="1583" width="1280" class="article-image"
+              src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzkwYzgyMzI4LThlMDUtNGRiNS05MDg3LTUzMGUxZTM5N2RmMmVkOTM5ZDM4MGM4OTIxYTQ5MF9EQVIgZXhodW1hdGlvbiBvZiBNYXJnYXJldCBDb3JiaW4gZ3JhdmUgMTkyNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMTI4MHg-Il1d/DAR%20exhumation%20of%20Margaret%20Corbin%20grave%201926.jpg" />
+            <div class="article-caption-pre-rd article-hero-img-caption">
+              In 1926, the Daughters of the American Revolution joined forces with the U.S. Military Academy to exhume
+              the supposed burial site of Margaret Corbin. <span class='caption-credit'>Daughters of the American
+                Revolution</span>
+            </div>
+          </div>
+        </div>
+        <div class="row MainContentRow -- ">
+          <div id="ArticleLeftRail" class="article-left-siderail social-siderail-l hidden-print col-md-2">
+            <div class="siderail-placement siderail-associated-content-cards">
+              <div class="siderail-title o-heading fs--19">In This Story</div>
+              <div class="siderail-cards-container">
+                <div class="CardWrapper --PlaceWrapper js-CardWrapper  --small-wrapper">
+                  <div class="CardActionBtns">
+                    <div class="CardActionBtns__positioner">
+                      <div data-item-type="Place" data-place-title="Margaret Corbin&#39;s Grave"
+                        data-place-city="West Point" data-place-country="United States" data-place-id="35141"
+                        class="Card__action-btns vue-js-been-there-everywhere-place">
+                        <been-there-everywhere></been-there-everywhere>
+                      </div>
+                    </div>
+                  </div>
+                  <a class="Card --content-card-v2 --content-card-item Card--small" data-type="Place"
+                    data-item-id="35141" data-gtm-content-type="Place" data-lat="41.398684" data-lng="-73.967402"
+                    data-city="West Point" data-state="New York" data-country="United States"
+                    href="/places/margaret-corbin-grave">
+                    <figure class="Card__figure js-Card__figure --content-card-figure js-content-card-figure">
+                      <img
+                        data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzL2RkZmJiNGI4LTZhYTktNDNiOC05ZTIxLWViY2NhMzdjYzE0ZDMwMmVmYjI2MGQ4MzllNzU4MF9NYXJnYXJldCBDb3JiaW4gUmVkZWRpY2F0aW9uIENlcmVtb255XzUuMS4xOC5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweDQwMCMiXV0/Margaret%20Corbin%20Rededication%20Ceremony_5.1.18.jpg"
+                        alt="" data-width="960" data-height="640"
+                        class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                        src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                    </figure>
+                    <div class="Card__content-wrap --content-card-text">
+                      <div class="Card__hat --place">Place</div>
+                      <h3 class="Card__heading --content-card-v2-title">
+                        <span>Margaret Corbin&#39;s Grave</span>
+                      </h3>
+                      <div class="Card__content js-subtitle-content">
+                        West Point’s only monument to a woman veteran stands above an empty grave.
+                      </div>
+                    </div>
+                  </a>
+                </div>
+                <div class="CardWrapper --GeoWrapper js-CardWrapper  --small-wrapper">
+                  <a class="Card --content-card-v2 --content-card-item Card--small Card--flipped"
+                    data-gtm-content-type="Geo" data-lat="40.712784" data-lng="-74.005941" data-state="New York"
+                    data-country="United States" data-global-region="North America" href="/things-to-do/new-york-state">
+                    <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                      <img
+                        data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvcGxhY2VfaW1hZ2VzLzNiY2JkODcwMjMxYjNmNzM1NV81MTU5MTkxMjkwXzk4MDRlYTQyYjJfby5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweDQwMCMiXV0/5159191290_9804ea42b2_o.jpg"
+                        alt="" data-width="1011" data-height="671"
+                        class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                        src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                    </figure>
+                    <div class="Card__content-wrap --content-card-text">
+                      <div class="Card__hat"> Destination Guide</div>
+                      <h3 class="Card__heading --content-card-v2-title">
+                        <span>New York State</span>
+                      </h3>
+                    </div>
+                  </a>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div class="content-body col-md-6">
+            <section id="article-body" class="ArticleBody ArticleBody__default article--body ">
+              <p class="item-body-text-graf"><span class="section-start-text">In 2016, five days after
+                </span>Thanksgiving, Margaret Corbin&#8217;s grave was dug up for the second time since her death in
+                1800. It began by accident. Contractors were working on a retaining wall near the West Point Cemetery,
+                at the U.S. Military Academy, when a hydraulic excavator got too close and chewed through the grave.</p>
+              <p class="item-body-text-graf">As soon as they noticed bones spilling from the soil, they alerted the
+                military police. The plot was quickly cordoned off, her monument was wrapped in tarp, and rumors started
+                to spread about Corbin&#8217;s resting place&#8212;that is, if it even <em>was</em> her resting place.
+                When forensic archaeologists arrived at the scene, they were perplexed: The bones seemed oddly large.
+              </p>
+              <p class="item-body-text-graf">The monument to Margaret Corbin is West Point&#8217;s only monument to a
+                woman veteran, and it greets visitors near the main gate, just feet from a neoclassical chapel. It faces
+                Washington Road, where the Academy&#8217;s top brass live, and depicts Corbin in a long dress, operating
+                a cannon as her long hair and cape fly in the wind. She wears a powder horn and holds a rammer to load
+                cannonballs; the rest of the rather cramped cemetery sprawls out behind her. The monument portrays the
+                moments before Corbin became a prisoner of war.</p>
+              <figure class=" contains-caption "><img class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="On the West Point monument, Corbin wears a long dress and a powder horn, and she operates a cannon while her long hair flies in the wind."
+                  width="auto" data-kind="article-image" id="article-image-71546"
+                  data-src="https://assets.atlasobscura.com/article_images/71546/image.jpg">
+                <figcaption class="caption structured-caption noskim">On the West Point monument, Corbin wears a long
+                  dress and a powder horn, and she operates a cannon while her long hair flies in the wind. <span
+                    class="caption-credit">Science History Images / Alamy Stock Photo</span></figcaption>
+              </figure>
+              <p class="item-body-text-graf">The story goes that Corbin joined her husband, John, to fight in the
+                American Revolution. At the time, many women followed their husbands to war, where they were commonly
+                known as &#8220;camp followers.&#8221; Typically, they foraged for food, cooked, and did laundry. Before
+                Martha Washington was the United States&#8217; first first lady, she was also a camp follower. In fact,
+                she and Margaret were with the same company&#8212;though the two experienced different lives, since
+                George was a general, and John manned a cannon.</p>
+              <p class="item-body-text-graf">At the Battle of Fort Washington, on November 16, 1776, in what is now
+                Washington Heights, the British and Hessians advanced far enough to make the Continental Army&#8217;s
+                position untenable. George Washington retreated with his forces to White Plains; John Corbin was shot
+                dead at his cannon. But Margaret was there to jump into John&#8217;s position and help fire the cannon.
+                During the battle, her jaw and shoulder were seriously injured, and grapeshot tore off part of her
+                breast. Despite the Continental Army&#8217;s efforts, the fort was soon surrendered, and Corbin was
+                captured along with approximately 2,837 soldiers.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="A watercolor by Thomas Davies depicting the attack on Fort Washington by the British and Hessian Brigades. Margaret Corbin was taken prisoner after fighting in the battle."
+                  width="auto" data-kind="article-image" id="article-image-71538"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71538/image.jpg">
+                <figcaption class="caption structured-caption noskim">A watercolor by Thomas Davies depicting the attack
+                  on Fort Washington by the British and Hessian Brigades. Margaret Corbin was taken prisoner after
+                  fighting in the battle. <span class="caption-credit">Alamy Stock Photo</span></figcaption>
+              </figure>
+              <p class="item-body-text-graf">The British may have been unsure what to do with an injured woman, because
+                she was released fairly soon after the battle. The ordeal was one of many traumas in her life: According
+                to records collected by the <a
+                  href="http://www.historichudsonhighlands.org/historian-s-office.html">historian</a> Stella Bailey,
+                Margaret was only five years old when her father was killed in a conflict with Native Americans in
+                Pennsylvania, where they lived. Her mother was kidnapped, and Margaret and her brother moved in with an
+                uncle. They never saw her again.</p>
+              <p class="item-body-text-graf">After Corbin&#8217;s return, she joined the Corps of Invalids, a group of
+                wounded soldiers that were still able to contribute to the war effort. They were stationed at West
+                Point, New York, where Corbin became known as a cantankerous woman who had a tough time making a home
+                for herself in the neighboring village of Highland Falls. She moved between various local families who
+                tried to care for her. Having witnessed her husband&#8217;s death and sustaining wounds, she was
+                probably in constant mental and physical pain.</p>
+              <hr class="baseline-grid-hr">
+              <p class="item-body-text-graf section-break-graf"><span class="section-start-text">When Margaret Corbin
+                  died in </span>1800, she was buried in a pauper&#8217;s cemetery in Highland Falls, just three miles
+                from West Point. But in 1926, the national society of women known as the Daughters of the American
+                Revolution saw to it that Corbin would earn her vaunted cemetery plot. The society, which is made up of
+                women who can trace their lineage to participants in the American Revolution, was celebrating the
+                sesquicentennial of American independence, and saw Corbin as the consummate symbol of both their
+                organization and the Revolution. A year-long effort convinced the U.S. Military Academy to help them
+                exhume and transport the remains to the prestigious cemetery, to be reburied with a military funeral.
+              </p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="This sign directs visitors to the United States Military Academy to the purported site of Margaret Corbin's grave."
+                  width="auto" data-kind="article-image" id="article-image-71506"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71506/image.jpg">
+                <figcaption class="caption structured-caption noskim">This sign directs visitors to the United States
+                  Military Academy to the purported site of Margaret Corbin&#8217;s grave. <a class="caption-credit"
+                    rel="nofollow" target="_blank"
+                    href="https://commons.wikimedia.org/wiki/File:Margaret_Corbin_Historical_Road_Marker.JPG">Ahodges7 /
+                    CC BY-SA 3.0</a></figcaption>
+              </figure>
+              <p class="item-body-text-graf">Exhumation was not a simple task: By the time the DAR began their campaign
+                to move Corbin, the location of her exact burial was known only by word-of-mouth, passed down through
+                generations. In collaboration with West Point, the Daughters found the great-grandson of the man who
+                supposedly dug Corbin&#8217;s original grave, a steamboat captain by the name of Farout. Her burial site
+                was apparently marked by the stump of a cedar tree; during the exhumation process, the gravedigger
+                accidentally drove the shovel through the skull. Still, the Army Surgeon reported injuries to the
+                skeleton that were consistent with grapeshot. The remains were given a new, flag-draped casket and
+                delivered to West Point by horse-drawn hearse.</p>
+              <p class="item-body-text-graf">Every year since then, the Daughters have gathered at Corbin&#8217;s
+                monument for Margaret Corbin Day. On the first Tuesday of May, the Daughters fill the chapel, share
+                Corbin&#8217;s story, sing hymns, and stand at the grave while soldiers perform a 21-gun salute.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="A horse-drawn hearse carried a flag-draped casket that was said to contain Corbin&#8217;s remains."
+                  width="auto" data-kind="article-image" id="article-image-71497"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71497/image.jpg">
+                <figcaption class="caption structured-caption noskim">A horse-drawn hearse carried a flag-draped casket
+                  that was said to contain Corbin&#8217;s remains. <span class="caption-credit">Daughters of the
+                    American Revolution</span></figcaption>
+              </figure>
+              <p class="item-body-text-graf">After the U.S. Military Academy unintentionally reopened the grave beneath
+                Corbin&#8217;s monument in 2016, they decided to conduct an emergency forensic archaeological
+                excavation. They enlisted the help of Elizabeth A. DiGangi, an anthropology professor at Binghamton
+                University, and Michael K. Trimble, an archaeologist for the Army Corps of Engineers. Almost
+                immediately, the pair noticed that the size of the bones didn&#8217;t match Corbin&#8217;s description.
+                Corbin was reportedly a stout woman. &#8220;One of the first bones I saw when I was on site was the
+                humerus, or upper arm bone,&#8221; DiGangi says. &#8220;It was very large, which is not what you would
+                expect with an arm bone from a woman.&#8221;</p>
+              <p class="item-body-text-graf">DiGangi took the remains to her laboratory at Binghamton University to do a
+                full analysis. Some worried that other remains were mixed up with Corbin&#8217;s. (In the past, West
+                Point has discovered unknown remains when they&#8217;ve broken new ground for construction.) Ultimately,
+                DiGangi&#8217;s analysis revealed something even more shocking: The remains in Corbin&#8217;s grave
+                actually came from an adult male. DiGangi determined that it was a large man, who could&#8217;ve been
+                anywhere from five-foot-seven to six and a half feet tall. The remains of Margaret Corbin were not in
+                Margaret Corbin&#8217;s grave.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="In 1926, the remains from Highland Park were reinterred at West Point, and sat at the foot of the Margaret Corbin monument until 2016."
+                  width="auto" data-kind="article-image" id="article-image-71024"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71024/image.jpg">
+                <figcaption class="caption structured-caption noskim">In 1926, the remains from Highland Park were
+                  reinterred at West Point, and sat at the foot of the Margaret Corbin monument until 2016. <span
+                    class="caption-credit">Daughters of the American Revolution</span></figcaption>
+              </figure>
+              <p class="item-body-text-graf">Once the archaeological excavation teams <a
+                  href="https://www.dar.org/sites/default/files/FinalReportWestPointBurialRecovery.pdf">completed</a>
+                their reports, the Army National Cemeteries contacted the Daughters of the American Revolution. They
+                wanted a meeting at DAR headquarters in Washington, DC.</p>
+              <p class="item-body-text-graf">Jennifer Minus, the head of the New York chapter of the DAR, was among
+                those present at the meeting. Minus, a graduate of West Point and a former member of the Corbin Forum, a
+                club for cadet women, knew her Corbin history better than most. She asked how it could&#8217;ve been a
+                man in the grave, if in 1926 the Army surgeon said that grapeshot injuries were present. In her report,
+                DiGangi explains that what the surgeon considered a grapeshot injury was, in fact, post-mortem damage to
+                the remains.</p>
+              <p class="item-body-text-graf">So where is Margaret Corbin? Since the attempted reburial of Corbin&#8217;s
+                remains, in 1926, her original gravesite in Highland Falls has been lost to time. Sometime in the 1970s,
+                the town dropped a sewage plant where many believe it was once located. Yet Minus remains optimistic
+                that Corbin&#8217;s remains will one day be found.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="At left, another monument that pays homage to Margaret Corbin, near the site where she took over her husband's cannon; at right, a view of her monument at West Point."
+                  width="auto" data-kind="article-image" id="article-image-71513"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71513/image.jpg">
+                <figcaption class="caption structured-caption noskim">At left, another monument that pays homage to
+                  Margaret Corbin, near the site where she took over her husband&#8217;s cannon; at right, a view of her
+                  monument at West Point. <a class="caption-credit" rel="nofollow" target="_blank"
+                    href="https://commons.wikimedia.org/wiki/Category:Margaret_Corbin#/media/File:2015_Fort_Tryon_Park_Margaret_Corbin_memorial.">Beyond
+                    My Ken / CC BY-SA 4.0; Ahodges7 / CC BY-SA 3.0</a></figcaption>
+              </figure>
+              <p class="item-body-text-graf">As upsetting as it was to learn that her remains were missing, the
+                Daughters also tried to see the discovery as an opportunity to spread Margaret&#8217;s story. It&#8217;s
+                as though they picked up right where the 1926 DAR members left off. Minus formed an unofficial Margaret
+                Corbin Task Force, drawing on the strengths of DAR members: One was a genealogist, and another was a
+                Navy veteran who had worked on locating the remains of American soldiers overseas.</p>
+              <hr class="baseline-grid-hr">
+              <p class="item-body-text-graf section-break-graf"><span class="section-start-text">On April 30, 2019,
+                  Minus </span>combed the woods of Highland Falls, looking for the original gravesite. They tried to
+                match up the old photographs with newer ones, but this proved difficult, because most of the trees in
+                the photographs were saplings at the time. They looked for flat areas that would have been suitable for
+                burials: It was common at the time to bury people in elevated areas, to avoid rising water tables that
+                could push the caskets back up to the surface.</p>
+              <p class="item-body-text-graf">The next day, the Daughters gathered again around Corbin&#8217;s monument,
+                dressed in large hats and sashes. The ground looked as though it had never been disturbed. A casual
+                viewer would&#8217;ve never known that Corbin wasn&#8217;t under their feet.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="In 2018, the Margaret Corbin monument was rededicated with a wreath laying.
+" width="auto" data-kind="article-image" id="article-image-71504"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71504/image.jpg">
+                <figcaption class="caption structured-caption noskim">In 2018, the Margaret Corbin monument was
+                  rededicated with a wreath laying.
+                  <span class="caption-credit">Daughters of the American Revolution</span></figcaption>
+              </figure>
+              <p class="item-body-text-graf">It was an important day for the Daughters, but especially for Minus, who
+                joined the DAR in part because of Corbin. Once, before she graduated from West Point, she told her
+                grandparents about a lunch honoring Margaret Corbin. Her grandmother told her that her heritage made her
+                eligible to join the Daughters of the American Revolution, and a few years later, when she returned from
+                a post in Germany, her grandma prepared the necessary papers.</p>
+              <p class="item-body-text-graf">Minus is hopeful that they&#8217;ll find Corbin near the river, not far
+                from the grave that the Daughters dug up in 1926. &#8220;When they started digging, they found bones.
+                So, they didn&#8217;t make, like, 10 different holes over a field. They got it on their first attempt
+                and found bones. What I&#8217;m hoping is that they just had to do a 180, and she would&#8217;ve been
+                five feet over.&#8221;</p>
+              <p class="item-body-text-graf">The man they found in Corbin&#8217;s grave has since come back to the West
+                Point cemetery, to be reinterred with the other unidentified remains found in the area. No one yet knows
+                who the man could be. Some theorize it&#8217;s Corbin&#8217;s second husband&#8212;but there&#8217;s no
+                proof that she remarried. Others believe it was a Native American. It&#8217;s possible that the unknown
+                man might be dug up a third time, should the proper clues demand his participation. Corbin&#8217;s
+                original gravesite did not turn up <a
+                  href="https://www.dar.org/national-society/dar-2018-search-efforts-0">in 2018</a>, but the search
+                continues.</p>
+              <p class="item-body-text-graf">On Corbin Day in 2019, after the 21-gun salute, the Daughters hold another
+                luncheon. This time, the Margaret Corbin Task Force has something special on display: a machine that
+                looks like a souped-up lawn mower. Many Daughters file into the room and ask what it is. &#8220;Just
+                wait,&#8221; Minus answers. Then Lieutenant Colonel Mindy Kimball, an environmental science professor at
+                West Point, holds a demonstration. It&#8217;s a ground-penetrating radar machine, which shoots
+                electromagnetic waves into the ground and sends information back up to the antennae, to identify
+                underground disturbances that could reveal human remains.</p>
+              <figure class="article-image-full-width contains-caption "><img
+                  class="article-image with-structured-caption  lazy"
+                  src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png"
+                  alt="The monument to Margaret Corbin is West Point&#8217;s only monument to a woman veteran."
+                  width="auto" data-kind="article-image" id="article-image-71512"
+                  data-src="https://assets.atlasobscura.com/article_images/lg/71512/image.jpg">
+                <figcaption class="caption structured-caption noskim">The monument to Margaret Corbin is West
+                  Point&#8217;s only monument to a woman veteran. <a class="caption-credit" rel="nofollow"
+                    target="_blank"
+                    href="https://commons.wikimedia.org/wiki/File:Margaret_Corbin_Memorial_Base,_West_Point,_NY.JPG">Ahodges7
+                    / CC BY-SA 3.0</a></figcaption>
+              </figure>
+              <p class="item-body-text-graf">Whether or not Corbin is ever located, just sharing her story helps to
+                immortalize her. Minus is fascinated by the many identities that Corbin came to inhabit.
+                &#8220;She&#8217;s an army spouse, and then an army widow, and then she was a soldier, and then she was
+                a wounded soldier, and then she was a prisoner of war, and then she was a veteran,&#8221; she says.
+                Corbin was also the first woman to receive a military pension from the government, and is mentioned by
+                name in the Congressional Record. &#8220;I really think of her as that building block for women in the
+                military.&#8221;</p>
+              <p class="item-body-text-graf">Stella Bailey, the town historian of Highland Falls, has been researching
+                Margaret Corbin for decades. She&#8217;s pored over old maps, trying to pinpoint exactly where Corbin
+                might have been buried in 1800. She even gets emails from people who think they might be related to
+                Corbin.</p>
+              <p class="item-body-text-graf item-body-last">Sitting in her office, overlooking Main Street in Highland
+                Falls, Bailey sighs. &#8220;We know she was real. West Point&#8217;s records acknowledge her
+                existence,&#8221; she says. But she can list discrepancies in Corbin&#8217;s story. Some say her husband
+                was shot in the head; some say he was shot in the heart. Others say Corbin dressed as a man to fight in
+                the war. Sometimes she wonders whether she will ever find answers. Perhaps these conflicting stories are
+                just a part of Corbin&#8217;s mystique. &#8220;The more I research, the less I know,&#8221; Bailey says.
+              </p>
+              <p class="item-body-text-graf"><em>You can <a
+                    href="https://community.atlasobscura.com/t/the-missing-grave-of-margaret-corbin-revolutionary-war-veteran-discussion-thread/33149"
+                    target="_blank" rel="noopener noreferrer">join the conversation </a>about this and other stories in
+                  the Atlas Obscura Community Forums.</em></p>
+            </section>
+            <div class="ItemEndRow" data-category='Articles Page Recirc' data-action='Recirc Item Clicked'
+              data-label='Footer Next Article'>
+              <div class="HorizontalCardWrapper --ArticleWrapper ">
+                <a class="HorizontalCard" data-gtm-category="Articles Page Recirc" data-gtm-template="End Cap"
+                  data-gtm-content-type="Article" data-gtm-recirc-association="Related"
+                  href="/articles/most-expensive-sports-memorabilia-olympics-manifesto">
+                  <div class="HorizontalCard__content-wrap">
+                    <div class="HorizontalCard__hat">Read next</div>
+                    <h3 class="HorizontalCard__heading">
+                      <span class="js-socket-title">Sold: Pierre de Coubertin’s Blueprint for the Olympics</span>
+                    </h3>
+                    <div
+                      class="HorizontalCard__content HorizontalCard__subheading js-subtitle-content js-socket-subtitle">
+                      The 14-page speech is now the world’s most expensive piece of sports memorabilia.
+                    </div>
+                  </div>
+                  <figure class="HorizontalCard__figure js-HorizontalCard__figure js-content-horizontal-card-figure">
+                    <img
+                      data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzM2MWMwYjc0LWY2Y2MtNDE4MC1hODc3LTQwODk1NjA5ODE1ODZkYzNlYzc0NWVmMjg4OGZkNl9TY3JlZW4gU2hvdCAyMDIwLTAxLTEzIGF0IDUuMzMuMTEgUE0ucG5nIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjYwMHg0MDAjIl1d/Screen%20Shot%202020-01-13%20at%205.33.11%20PM.png"
+                      alt="" data-width="1073" data-height="615" class="lazy HorizontalCard__img u-img-responsive"
+                      nopin="nopin"
+                      src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                  </figure>
+                </a>
+              </div>
+            </div>
+            <div class="itemTags ItemEndRow">
+              <span class="itemTags__tag itemTags__tag--rounded"><a class="itemTags__link"
+                  href="/categories/graveyards">graveyards</a></span><span
+                class="itemTags__tag itemTags__tag--rounded"><a class="itemTags__link"
+                  href="/categories/military-history">military history</a></span><span
+                class="itemTags__tag itemTags__tag--rounded"><a class="itemTags__link"
+                  href="/categories/monuments">monuments</a></span><span class="itemTags__tag itemTags__tag--rounded"><a
+                  class="itemTags__link" href="/categories/cemeteries">cemeteries</a></span><span
+                class="itemTags__tag itemTags__tag--rounded"><a class="itemTags__link"
+                  href="/categories/history">history</a></span>
+            </div>
+          </div>
+          <div id="ArticleStickyRailTrack" class="content-siderail hidden-print">
+            <div class="js-above-rail"></div>
+            <div id="ArticleStickyRail" class="js-sticky-siderail" data-below-of=".js-above-rail"
+              data-affixed-top-margin="74" data-affixed-bottom-margin="0" data-above-of=".js-below-rail">
+              <div class="siderail-ad hidden-sm hidden-xs">
+                <div class=" fixedPositionAdBg--300 ad-background">
+                  <div class='ad-wrapper hidden-print'>
+                    <div class="htl-ad" data-unit="Rotational_Rectangle_Desktop"
+                      data-ref="Rotational_Rectangle_Desktop_div" data-refresh="viewable" data-refresh-secs="15"
+                      data-sizes="0x0:|668x0:300x250,300x400,300x600" data-prebid="Rotational_Rectangle_Desktop"
+                      data-lazy></div>
+                  </div>
+                </div>
+              </div>
+              <aside id="sidebar-popular" class="js-most-popular-recircs aside-recirc-module related-articles-module">
+              </aside>
+            </div>
+          </div>
+          <div id="ArticleStickyRailBrakePositioner" class="hidden-xs hidden-sm">
+            <div id="ArticleStickyRailBrake" class="js-below-rail"></div>
+          </div>
+          <div class="col-md-4 ArticleRightRail__space-holder hidden-xs hidden-sm"></div>
+        </div>
+      </div>
+    </article>
+    <div class="recirc-footer-wrap hidden-print ">
+      <div class="card-grid js-inject-gtm-data-in-child-links" data-gtm-category='Articles Page Recirc'
+        data-gtm-action='Recirc Item Clicked' data-gtm-label='Footer Related Content Card'
+        data-gtm-template='Footer Cards' data-gtm-recirc-association='Related Mixed Content'>
+        <div class="athanasius">
+          <div
+            class="full-width-container CardRecircSection CardRecircSection--8-cards-lg full-width-container CardRecircSection__article-footer">
+            <div class="container">
+              <div class='CardRecircSection__header'>
+                <div class="CardRecircSection__title">Keep Exploring</div>
+              </div>
+              <div class="card-grid CardRecircSection__card-grid js-inject-gtm-data-in-child-links"
+                data-gtm-category='Article Page Recirc' data-gtm-action='Recirc Item Clicked'
+                data-gtm-label='Related Content Card' data-gtm-template='Footer Cards'
+                data-gtm-recirc-association='Related Mixed Content'>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --ArticleWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat" data-type="Article"
+                      data-item-id="13013" data-gtm-content-type="Article" data-lat="34.198423" data-lng="-90.553051"
+                      href="/articles/where-is-robert-johnson-buried">
+                      <figure class="Card__figure js-Card__figure --content-card-figure js-content-card-figure">
+                        <img
+                          data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzdhOWJjZjViNGRmMmJlNjBmNl9EWE1XQ0guanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjYwMHg0MDAjIl1d/DXMWCH.jpg"
+                          alt="" data-width="1280" data-height="843"
+                          class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                          src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">cemeteries</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>The Not-So-Mysterious Missing Grave of Blues Legend Robert Johnson</span>
+                        </h3>
+                        <div class="Card__content js-subtitle-content">
+                          The supernatural has surrounded the guitar virtuoso for decades.
+                        </div>
+                        <div class="Card__footer --content-card-footer">
+                          <div class="Card__byline-dateline --article-byline-dateline">
+                            <span class="Card__byline --article-byline">Matthew Taub</span>
+                            <span class="Card__dateline --article-byline-date">October 23, 2019</span>
+                          </div>
+                        </div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --ArticleWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat" data-type="Article"
+                      data-item-id="12331" data-gtm-content-type="Article" href="/articles/london-double-sided-graves">
+                      <figure class="Card__figure js-Card__figure --content-card-figure js-content-card-figure">
+                        <img
+                          data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzL2IzYTVjMjI3OWVkNmJkYWNjNV8yMS0wMS0xOSBDTENDICgzNSkgMi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweDQwMCMiXV0/21-01-19%20CLCC%20%2835%29%202.jpg"
+                          alt="" data-width="4471" data-height="2981"
+                          class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                          src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">cemeteries</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>Are Double-Sided Graves the Solution to London&#39;s Burial Crisis? </span>
+                        </h3>
+                        <div class="Card__content js-subtitle-content">
+                          Toward a new definition of eternity.
+                        </div>
+                        <div class="Card__footer --content-card-footer">
+                          <div class="Card__byline-dateline --article-byline-dateline">
+                            <span class="Card__byline --article-byline">Katie Thornton</span>
+                            <span class="Card__dateline --article-byline-date">April 19, 2019</span>
+                          </div>
+                        </div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --ArticleWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat" data-type="Article"
+                      data-item-id="9443" data-gtm-content-type="Article"
+                      href="/articles/cemeteries-to-visit-before-you-die-monuments">
+                      <figure class="Card__figure js-Card__figure --content-card-figure js-content-card-figure">
+                        <img
+                          data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzBjNmZkOTY4OWRjODE0ZTg1Ml8xMjlfc3BhaW5fcG9ibGVub3VfZm90b2tvbu-AonNodXR0ZXJzdG9ja180Mjc2MjAwMjguanBnIl0sWyJwIiwiY29udmVydCIsIiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtYXV0by1vcmllbnQiXSxbInAiLCJ0aHVtYiIsIjYwMHg0MDAjIl1d/129_spain_poblenou_fotokon%EF%80%A2shutterstock_427620028.jpg"
+                          alt="" data-width="1200" data-height="873"
+                          class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                          src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">cemeteries</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>In Search of Cemeteries Alive With Beauty, Art, and History</span>
+                        </h3>
+                        <div class="Card__content js-subtitle-content">
+                          These resting places celebrate life.
+                        </div>
+                        <div class="Card__footer --content-card-footer">
+                          <div class="Card__byline-dateline --article-byline-dateline">
+                            <span class="Card__byline --article-byline">Anika Burgess</span>
+                            <span class="Card__dateline --article-byline-date">October 31, 2018</span>
+                          </div>
+                        </div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --ArticleWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat" data-type="Article"
+                      data-item-id="10971" data-gtm-content-type="Article" data-lat="33.314837" data-lng="126.273449"
+                      href="/articles/dark-past-jeju-island-korea">
+                      <figure class="Card__figure js-Card__figure --content-card-figure js-content-card-figure">
+                        <img
+                          data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzQ0NTdhN2QxOTNkZDQ4ZTkzNl9UaGUgbWVtb3JpYWwgY2VtZXRlcnkgYXQgdGhlIEplanUgNC4zIFBlYWNlIFBhcmtfU2FtdWVsIEJlcmdzdHJvbV8yMDE4LmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCI2MDB4NDAwIyJdXQ/The%20memorial%20cemetery%20at%20the%20Jeju%204.3%20Peace%20Park_Samuel%20Bergstrom_2018.jpg"
+                          alt="" data-width="2000" data-height="1333"
+                          class="lazy Card__img u-img-responsive --img-responsive --content-card-img" nopin="nopin"
+                          src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">cemeteries</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>The Bloody Past of Korea’s ‘Honeymoon Island’</span>
+                        </h3>
+                        <div class="Card__content js-subtitle-content">
+                          Reckoning with a dark legacy at a time of great change.
+                        </div>
+                        <div class="Card__footer --content-card-footer">
+                          <div class="Card__byline-dateline --article-byline-dateline">
+                            <span class="Card__byline --article-byline">Erin Craig</span>
+                            <span class="Card__dateline --article-byline-date">May 11, 2018</span>
+                          </div>
+                        </div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/how-to-dig-a-grave">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDQvMjMvMjAvMTcvMDEvMGU4NzI2ODgtOTdkOC00NjAwLWFlYTctZjhlMDQ4ODZhMmNiL0dyYXZlZGlnZ2luZyAwNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMTIwMDB4MTIwMDA-Il1d"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>How to Dig a Grave</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>8:51</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/an-ancient-cemetery-pillaged-by-grave-robbers">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDUvMTQvMTQvMzAvMTEvYzdhZjlkNDQtMjczNS00OTg0LWEzZjEtOGY0YmE1ZDViNjIxL0NoYXVjaGlsbGFzdGlsbDA0LmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIxMjAwMHgxMjAwMD4iXV0"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video&nbsp;&bull; PinDrop</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>An Ancient Cemetery, Resurrected</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>1:51</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/abandoned-futuristic-fort-portland-maine">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDMvMjcvMDAvMDIvNTAvYTgwY2FkZTMtOWU3NS00MzQ4LWJmYTItZTg4NTE2MDEyY2IxL0JhdHRlcnlTdGVlbGVTdGlsbC5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMTIwMDB4MTIwMDA-Il1d"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>There&#39;s an Abandoned Futuristic Fort in Portland, Maine</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>3:32</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/a-conversation-in-america-s-most-metal-cemetery">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDMvMjUvMTgvMzYvMzAvZDA2NzgwNDQtMGRiZi00NTlhLThiNjMtMzY4NDE5NmU2YjU3L0VsbGEgJiBDYWl0bGluIDAzLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIxMjAwMHgxMjAwMD4iXV0"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>An Introduction to America&#39;s Most Metal Cemetery</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>6:04</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/inside-hawai-i-s-native-language-newspaper-archive">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDMvMjcvMTQvNTIvMDEvMjhiOWM0ZjAtNGNlOC00YTlhLTg4MTEtYWZmNjE3ZDRiZGQ2L0hhd2FpaVN0aWxsLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIxMjAwMHgxMjAwMD4iXV0"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video&nbsp;&bull; AO Docs</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>Hawaiʻi’s Native-Language Newspaper Archive</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>3:35</span></div>
+                        <div class="Card__footer VideoCard__footer --content-card-footer">
+                          <span class="sponsored-article-tag"><span class='js-tracked-sponsored-recirc'
+                              data-recirc-pid='video-54'>Sponsored by Olukai</span>
+                          </span>
+                        </div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/gaze-upon-a-million-monarch-butterflies-in-mexico">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDQvMDkvMjAvMzcvMzMvNDlmMGEzMjAtY2ViYS00MGYyLTg5NjktMzYzZjkyZDM1YmFlL21vbmFyY2gwMi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiMTIwMDB4MTIwMDA-Il1d"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video&nbsp;&bull; AO Docs</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>&#39;Discovering&#39; Mexico&#39;s Monarch Butterfly Migration</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>6:46</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+                <div class="CardWrapper js-CardWrapper">
+                  <div class="CardWrapper --VideoWrapper js-CardWrapper ">
+                    <a class="Card --content-card-v2 --content-card-item Card--flat Card--video"
+                      data-gtm-content-type="Video" href="/videos/what-were-george-washingtons-dentures-made-of">
+                      <figure class="Card__figure js-Card__figure -- content-card-figure js-content-card-figure">
+                        <img
+                          src="https://assets.atlasobscura.com/media/W1siZiIsIjIwMTkvMDkvMDMvMjAvMzIvMTQvNTUyZjg2YjAtMTg0NC00ZWI2LWIzMWEtOTllNzJkYWQxYTFiL0RlbnR1cmVzIDAzLmpwZyJdLFsicCIsImNvbnZlcnQiLCIiXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLWF1dG8tb3JpZW50Il0sWyJwIiwidGh1bWIiLCIxMjAwMHgxMjAwMD4iXV0"
+                          class="Card__img u-img-responsive --img-responsive --content-card-img lazy" alt="" />
+                      </figure>
+                      <div class="Card__content-wrap --content-card-text">
+                        <div class="Card__hat">Video&nbsp;&bull; Object of Intrigue</div>
+                        <h3 class="Card__heading --content-card-v2-title">
+                          <span>The Real Story Behind George Washington&#39;s Dentures</span>
+                        </h3>
+                        <div class="Card__subheading VideoCard__subheading --content-card-footer"><i
+                            class=" atlas-svg-wrap wrap-icon-aoc-video">
+                            <svg version="1.1" xmlns="http://www.w3.org/2000/svg"
+                              xmlns:xlink="http://www.w3.org/1999/xlink">
+                              <use href="#icon-aoc-video" xlink:href="#icon-aoc-video" />
+                            </svg>
+                          </i>
+                          <span>3:30</span></div>
+                      </div>
+                    </a>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="container ad-container">
+        <hr class="above-ad-border hidden-sm hidden-xs">
+        <div class='ad-wrapper hidden-print ad-inline-banner ad-banner-lg'>
+          <div class="htl-ad" data-unit="Site_Bottom_Full_Width" data-ref="Site_Bottom_Full_Width_div"
+            data-sizes="0x0:|668x0:728x90,970x250,1440x585" data-prebid="Site_Bottom_Full_Width" data-eager></div>
+        </div>
+      </div>
+      <div class="footer-reflow">
+      </div>
+    </div>
+    <div id="articleBody__interrupt-card" class="hidden hidden-print">
+      <div class="js-inject-gtm-data-in-child-links" data-gtm-category='Articles Page Recirc'
+        data-gtm-action='Recirc Item Clicked' data-gtm-label='Interrupt Related Article' data-gtm-template='Interruptor'
+        data-gtm-content-type='Article' data-gtm-recirc-association='Related Article'>
+        <div class="HorizontalCardWrapper --ArticleWrapper ">
+          <a class="HorizontalCard"
+            href="/articles/grim-history-hidden-under-baltimore-parking-lot-cemetery-african-american">
+            <div class="HorizontalCard__content-wrap">
+              <div class="HorizontalCard__hat">Related</div>
+              <h3 class="HorizontalCard__heading">
+                <span class="js-socket-title">The Grim History Hidden Under a Baltimore Parking Lot</span>
+              </h3>
+              <div class="HorizontalCard__content HorizontalCard__subheading js-subtitle-content js-socket-subtitle">
+                After an African-American cemetery was bulldozed, families wondered what happened to the graves.
+              </div>
+              <div class="HorizontalCard__footer">Read more</div>
+            </div>
+            <figure class="HorizontalCard__figure js-HorizontalCard__figure js-content-horizontal-card-figure">
+              <img
+                data-src="https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzk5N2EwYTgxZjlhYzA2MzRiYl9GcmFuayBBIEdyYXkgTmV3IE1hcCBvZiBCYWx0aW1vcmUgMTg3NiAoMSkuanBnIl0sWyJwIiwiY29udmVydCIsIi1hdXRvLW9yaWVudCAiXSxbInAiLCJ0aHVtYiIsIjg2NHg1NzYrMTc1KzU2Il0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9yaWVudCJdLFsicCIsInRodW1iIiwiNjAweDQwMCMiXV0/Frank%20A%20Gray%20New%20Map%20of%20Baltimore%201876%20%281%29.jpg"
+                alt="" data-width="1039" data-height="1074" class="lazy HorizontalCard__img u-img-responsive"
+                nopin="nopin"
+                src="https://assets.atlasobscura.com/assets/blank-11b9c95a68e295dddd0ea924647536578ce285b2c8469a223c01df1ff3166af1.png" />
+            </figure>
+          </a>
+        </div>
+      </div>
+    </div>
+    <div class="modal lightbox-modal fadeX" id="lightbox" tabindex="-1" role="dialog" aria-labelledby="lightbox">
+      <div id="lightbox-content">
+        <span class="icon-menu-close modal-close" data-dismiss="modal"></span>
+        <div id="lightbox-figure-box">
+          <figure id="lightbox-figure">
+            <img src="" id="lightbox-image" alt="" />
+            <figcaption id="lightbox-caption" class="caption">
+            </figcaption>
+          </figure>
+        </div>
+        <div id="lightbox-controls" class="hidden-sm hidden-xs">
+          <a class="js-lightbox-prev lightbox-gallery-control prev-arrow" href="javascript:void(0)"
+            aria-label="Previous image">
+            <i class="icon-expand_left"></i>
+          </a>
+          <a class="js-lightbox-next lightbox-gallery-control next-arrow" href="javascript:void(0)"
+            aria-label="Next image">
+            <i class="icon-expand_right"></i>
+          </a>
+        </div>
+        <div id="mobile-lightbox-control-prev" class="hidden-md hidden-lg">
+          <a class="js-lightbox-prev lightbox-gallery-control prev-arrow" href="javascript:void(0)">
+            <i class="icon-expand_left"></i>
+          </a>
+        </div>
+        <div id="mobile-lightbox-control-next" class="hidden-md hidden-lg">
+          <a class="js-lightbox-next lightbox-gallery-control next-arrow" href="javascript:void(0)">
+            <i class="icon-expand_right"></i>
+          </a>
+        </div>
+      </div>
+      <div class="lightbox-thumbnails hidden-sm hidden-xs hidden-md">
+        <div class="lightbox-thumbnails-container">
+        </div>
+      </div>
+    </div>
+    <div class="hidden-md hidden-lg m-social-adhesive-wrap">
+      <div id="js-item-social-adhesive" class="item-social-adhesive">
+        <div id="js-item-adhesive-btns" class="item-social-row ">
+          <a href=""
+            class="btn btn-adhesive btn-social-row btn-facebook btn-icon js-share-button-facebook js-social-action-tracked"
+            data-position="Bottom-Sticky-mobile" data-service="Facebook" data-action="Share"
+            aria-label="Share on Facebook">
+            <i class="icon-facebook"></i>
+          </a>
+          <a href="https://twitter.com/share?text=The%20Missing%20Grave%20of%20Margaret%20Corbin%2C%20Revolutionary%20War%20Veteran%3A%20@atlasobscura&amp;count=none&amp;url=https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point"
+            class="btn btn-adhesive btn-social-row btn-twitter btn-icon js-social-action-tracked js-social-ask-for-follow"
+            target="_blank" data-position="Bottom-Sticky-mobile" data-service="Twitter" data-action="Share"
+            aria-label="Share on Twitter">
+            <i class="icon-twitter"></i>
+          </a>
+          <a href="https://www.reddit.com/submit?url=https%3A%2F%2Fwww.atlasobscura.com%2Farticles%2Fmargaret-corbin-grave-west-point"
+            target="_blank"
+            class="btn btn-adhesive btn-social-row btn-reddit btn-icon icon-reddit js-social-action-tracked"
+            data-position="Bottom-Sticky-mobile" data-service="reddit" data-action="Share"
+            aria-label="Share on Reddit"></a>
+          <a href="mailto:?subject=The%20Missing%20Grave%20of%20Margaret%20Corbin%2C%20Revolutionary%20War%20Veteran&body=Discovered%20on%20Atlas%20Obscura%3A%20https://www.atlasobscura.com/articles/margaret-corbin-grave-west-point"
+            class="btn btn-adhesive btn-social-row btn-email btn-icon js-social-action-tracked"
+            data-position="Bottom-Sticky-mobile" data-service="Email" data-action="Send" aria-label="Email this">
+            <i class="icon-envelope"></i>
+          </a>
+        </div>
+      </div>
+    </div>
+  </div>
+  <footer class="new-footer page-footer">
+    <div class="footer-z-cover"></div>
+    <div class="container js-page-left-reference">
+      <div class="row">
+        <div class="col-md-6 col-lg-4">
+          <div class="footer-social">
+            <section class="subscribe-sm footer-subscribe">
+              <h4 class="heading-sm footer-links-heading js-footer-links-heading">Get Our Email Newsletter</h4>
+              <form class="footer-newsletter-form js-email-ask-form" action="/email_lists/signup" accept-charset="UTF-8"
+                data-remote="true" method="post"><input name="utf8" type="hidden" value="&#x2713;" />
+                <input type="hidden" name="source" value="footer-email-ask" />
+                <input type="hidden" name="subscribe_general" value="true" />
+                <input type="email" name="email" placeholder="enter your email" class="js-footer-email-ask-removable"
+                  aria-label="Email" />
+                <input type="submit" name="commit" value="Subscribe"
+                  class="btn btn-secondary btn-orange js-footer-email-ask-removable" />
+                <div id="js-footer-email-ask-thanks" class="subscribe-thanks detail">Thanks for subscribing!
+                  <a target="_parent" data-category="View All Newsletters Link" data-action="Click" data-label="Footer"
+                    class="js-view-newsletters" href="/newsletters">View all newsletters &raquo;</a>
+                </div>
+              </form>
+            </section>
+          </div>
+        </div>
+        <div class="col-md-3 social-icons">
+          <div class="row nested-row">
+            <h4 class="heading-sm footer-links-heading js-footer-links-heading social-icons-heading">Follow Us</h4>
+            <ul id="footer-social-list">
+              <li><a target="_blank" href="https://www.facebook.com/atlasobscura/"
+                  class="icon-facebook btn-icon footer-social-btn js-social-action-tracked" data-position="Footer"
+                  data-service="Facebook" data-action="Like" aria-label="Like us on Facebook"></a></li>
+              <li><a target="_blank" href="https://www.youtube.com/user/atlasobscura"
+                  class="icon-youtube btn-icon footer-social-btn js-social-action-tracked" data-position="Footer"
+                  data-service="Youtube" data-action="Follow" aria-label="Subscribe to our Youtube channel"></a></li>
+              <li><a target="_blank" href="https://twitter.com/atlasobscura"
+                  class="icon-twitter btn-icon footer-social-btn js-social-action-tracked" data-position="Footer"
+                  data-service="Twitter" data-action="Follow" aria-label="Follow us on Twitter"></a></li>
+              <li><a target="_blank" href="https://www.instagram.com/atlasobscura/"
+                  class="icon-instagram btn-icon footer-social-btn js-social-action-tracked" data-position="Footer"
+                  data-service="Instagram" data-action="Follow" aria-label="Follow us on Instagram"></a></li>
+              <li><a target="_blank" href="/feeds/latest"
+                  class="icon-rss btn-icon footer-social-btn js-social-action-tracked" data-position="Footer"
+                  data-service="RSS" data-action="Follow" aria-label="Subscribe to our RSS feed"></a></li>
+            </ul>
+          </div>
+        </div>
+        <div class="hidden-sm hidden-xs hidden-md promotional-content">
+          <div class="footer-shop-callout-wrap">
+            <a class="shop-callout non-decorated-link" target="" href="/unique-gifts/atlas-obscura-book">
+              <figure class="shop-callout-image-wrap">
+                <img class="img-responsive"
+                  src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvYXBwLWltYWdlcy9ib29rLzJuZC1lZGl0aW9uLW9uLXNpdGUtcHJvbW8ucG5nIl0sWyJwIiwidGh1bWIiLCIyNTB4PiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/2nd-edition-on-site-promo.png"
+                  alt="2nd edition on site promo" />
+              </figure>
+              <div class="shop-callout-text">
+                <div class="detail-md">Get the Atlas Obscura book</div>
+                <div class="cta-xs shop-action-text">Shop Now »</div>
+              </div>
+            </a>
+          </div>
+        </div>
+      </div>
+      <div class="row footer-links">
+        <div class="col-md-7 five-wide-3">
+          <section class="atlas-section col-md-4">
+            <h3 class="heading-sm footer-links-heading mobile-accordion-title js-footer-links-heading">
+              Places <i class="icon-expand_more footer-expand-arrow visible-sm visible-xs"></i>
+            </h3>
+            <div class="is-slider-hidden-m">
+              <ul class="links-column">
+                <li><a target="" href="/places">Recently Added</a></li>
+                <li><a target="" href="/places?sort=likes_count">Most Popular</a></li>
+                <li><a target="" href="/random">Random</a></li>
+                <li><a target="" href="/search/search_nearby">Nearby</a></li>
+                <li><a class="js-user-required" data-cause-key="p_add" target="" href="/places/new">Add a Place</a></li>
+              </ul>
+            </div>
+          </section>
+          <section class="col-md-4">
+            <h3 class="heading-sm footer-links-heading mobile-accordion-title js-footer-links-heading">
+              Foods <i class="icon-expand_more footer-expand-arrow visible-sm visible-xs"></i>
+            </h3>
+            <div class="is-slider-hidden-m">
+              <ul class="links-column">
+                <li><a target="" href="/gastro">Latest</a></li>
+                <li><a target="" href="/unique-food-drink">Food &amp; Drink</a></li>
+                <li><a target="" href="/gastro/stories">Stories</a></li>
+                <li><a target="" href="/gastro/places">Places</a></li>
+                <li style="display: none;"><a target="" href="/foods/new">Add a Food</a></li>
+              </ul>
+            </div>
+          </section>
+          <section class="col-md-4">
+            <h3 class="heading-sm footer-links-heading mobile-accordion-title js-footer-links-heading">
+              Experiences & Trips <i class="icon-expand_more footer-expand-arrow visible-sm visible-xs"></i>
+            </h3>
+            <div class="is-slider-hidden-m">
+              <ul class="links-column">
+                <li><a target="" href="/experiences">Upcoming Experiences</a></li>
+                <li><a target="" href="/unusual-trips/all">Upcoming Trips</a></li>
+                <li><a href="https://blog.atlasobscura.com">Trips Blog</a></li>
+              </ul>
+            </div>
+          </section>
+        </div>
+        <div class="col-md-5 five-wide-2">
+          <section class="col-md-6">
+            <h3 class="heading-sm footer-links-heading mobile-accordion-title js-footer-links-heading">
+              Community <i class="icon-expand_more footer-expand-arrow visible-sm visible-xs"></i>
+            </h3>
+            <div class="is-slider-hidden-m">
+              <ul class="links-column">
+                <li><a target="" href="https://community.atlasobscura.com">Travel Forum</a></li>
+                <li><a target="" href="https://community.atlasobscura.com/latest">Latest Posts</a></li>
+                <li><a target="" href="https://community.atlasobscura.com/top">Top Posts</a></li>
+              </ul>
+            </div>
+          </section>
+          <section class="col-md-6">
+            <h3 class="heading-sm footer-links-heading mobile-accordion-title js-footer-links-heading">
+              Company <i class="icon-expand_more footer-expand-arrow visible-sm visible-xs"></i>
+            </h3>
+            <div class="is-slider-hidden-m">
+              <ul class="links-column">
+                <li><a target="" href="/about">About</a></li>
+                <li class="hidden-md hidden-lg"><a
+                    onclick="window.open(this.href,'Contact Atlas Obscura','width=600,height=700,toolbar=no,menubar=no,scrollbars'); return false"
+                    href="https://www.atlasobscura.com/contact_form" target="_blank">Contact Us</a></li>
+                <li><a target="" href="/faq">FAQ</a></li>
+                <li><a target="" href="/jobs">Work With Us</a></li>
+                <li><a target="" href="mailto:ads@atlasobscura.com">Advertising</a></li>
+                <li><a target="" href="/unique-gifts">Unique Gifts</a></li>
+                <li><a target="" href="/privacy">Privacy Policy</a></li>
+                <li><a target="" href="/terms">Terms of Use</a></li>
+              </ul>
+            </div>
+          </section>
+        </div>
+      </div>
+      <div class="row">
+        <div class="col-lg-4 hidden-md hidden-lg hidden-xl promotional-content">
+          <div class="footer-shop-callout-wrap">
+            <a class="shop-callout non-decorated-link" target="" href="/unique-gifts/atlas-obscura-book">
+              <figure class="shop-callout-image-wrap">
+                <img class="img-responsive"
+                  src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvYXBwLWltYWdlcy9ib29rLzJuZC1lZGl0aW9uLW9uLXNpdGUtcHJvbW8ucG5nIl0sWyJwIiwidGh1bWIiLCIyNTB4PiJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/2nd-edition-on-site-promo.png"
+                  alt="2nd edition on site promo" />
+              </figure>
+              <div class="shop-callout-text">
+                <div class="detail-md">Get the Atlas Obscura book</div>
+                <div class="cta-xs shop-action-text">Shop Now »</div>
+              </div>
+            </a>
+          </div>
+        </div>
+      </div>
+      <div class="row">
+        <div class="copyright col-md-8 col-lg-6">
+          &copy; 2020 Atlas Obscura. All rights reserved.
+        </div>
+      </div>
+    </div>
+  </footer>
+  <a id="site-feedback-wrap" target="_blank"
+    onclick="window.open(this.href,'Contact Atlas Obscura','width=600,height=700,toolbar=no,menubar=no,scrollbars'); return false"
+    href="https://www.atlasobscura.com/contact_form">
+    <button id="btn-site-feedback" class="btn btn-stretch">Questions or Feedback? <span class="static-underline">Contact
+        Us</span></button>
+  </a>
+
+  <div class="js-paginate-content-modal-controls paginate-content-modal-controls close-button-container">
+    <button type="button" class="modal-close-button js-modal-close-button icon icon-menu-close"
+      aria-label="Close"></button>
+  </div>
+  <div class="js-paginate-content-modal paginate-content-modal modal">
+    <div class="modal-body">
+    </div>
+  </div>
+  <div class="js-confirmation-modal confirmation-modal modal">
+    <div class="modal-dialog">
+      <div class="modal-bg">
+        <div class="modal-header hidden"></div>
+        <div class="modal-body">
+          <div class="modal-dismiss">
+            <button type="button" data-dismiss="modal"
+              class="modal-close-button js-modal-close-button icon icon-menu-close" aria-label="Close"></button>
+          </div>
+          <div class="modal-content">
+            <div class="confirmation-modal-heading title-md baseline-standard baseline-mobile"></div>
+            <p class="confirmation-modal-text"></p>
+          </div>
+          <div class="modal-buttons">
+            <div class="submit-button btn btn-modal-cancel"></div>
+            <div data-dismiss="modal" class="back-button btn btn-modal-submit"></div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="social-follow-ask-modal" class="confirmation-modal modal">
+    <div class="modal-dialog">
+      <div class="modal-bg">
+        <div class="modal-body">
+          <div class="modal-dismiss">
+            <button type="button" data-dismiss="modal"
+              class="modal-close-button js-modal-close-button icon icon-menu-close" aria-label="Close"></button>
+          </div>
+          <div class="modal-content">
+            <div class="confirmation-modal-heading title-md baseline-standard baseline-mobile">Thanks for sharing!</div>
+            <p data-service="Twitter" style="display: none;" class="baseline-standard baseline-mobile">Follow us on
+              Twitter to get the latest on the world's hidden wonders.</p>
+            <p data-service="Facebook" style="display: none;" class="baseline-standard baseline-mobile">Like us on
+              Facebook to get the latest on the world's hidden wonders.</p>
+            <a href="https://twitter.com/atlasobscura"
+              class="js-social-action-tracked btn btn-twitter fullscreen-modal-social-btn" target="_blank"
+              data-service="Twitter" data-action="Follow" data-position="Modal After Social Action"
+              style="display: none;"><i class="icon icon-twitter"></i>Follow us on Twitter</a>
+            <a href="https://www.facebook.com/atlasobscura/"
+              class="js-social-action-tracked btn btn-facebook fullscreen-modal-social-btn" target="_blank"
+              data-service="Facebook" data-action="Like" data-position="Modal After Social Action"
+              style="display: none;"><i class="icon icon-facebook"></i>Like us on Facebook</a>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="book-contest-email-modal" class="modal modal-sm-fullscreen modal-md-fullscreen js-subscription-ask-modal"
+    role="dialog">
+    <div class="modal-body-fullscreen">
+      <div class="close-button-container">
+        <i class="modal-close-button icon icon-menu-close" data-dismiss="modal" aria-label="Close"></i>
+      </div>
+      <div id="contest-wrap" class="standalone-signup-wrap align-items-center fullpage-bg-modal plain-beige-version">
+        <div id="contest-bg" class="topographic transparent-topo"></div>
+        <div class="container pre-final-container">
+          <div class="row">
+            <center class="contest-contents col-lg-10 col-lg-push-1">
+              <div class="contest-form-wrap">
+                <form class="js-email-roadblock-form js-email-ask-form contest-signup-ui" id="contest-form"
+                  action="/email_lists/signup" accept-charset="UTF-8" data-remote="true" method="post"><input
+                    name="utf8" type="hidden" value="&#x2713;" />
+                  <input type="hidden" name="subscribe_general" value="true" />
+                  <input id="contest-source" type="hidden" name="source" value="Email Ask (Red, Free Book)" />
+                  <input type="hidden" name="merge_vars[MMERGE15]" id="merge_vars_MMERGE15" value="1" />
+                  <input type="hidden" name="merge_vars[MMERGE21]" id="merge_vars_MMERGE21"
+                    value="Book Contest - January 2020" />
+                  <h4 id="book-contest-title" class="title-lg baseline-standard baseline-mobile animate-swing-up">Want a
+                    Free Book?</h4>
+                  <div class="animate-text-reveal">
+                    <div class="subtitle-lg baseline-standard baseline-mobile">Sign up for our newsletter and enter to
+                      win the second edition of our book, <em>Atlas Obscura: An Explorer’s Guide to the World’s Hidden
+                        Wonders</em>.</div>
+                    <fieldset>
+                      <div class="cta-lg validate-message"></div>
+                      <div class="submit-inline baseline-standard baseline-mobile">
+                        <input type="email" name="email" class="detail-md" required="required"
+                          placeholder="Enter your email address" aria-label="email" />
+                        <button type="submit" class="g-recaptcha btn btn-default js-contest-submit-btn"
+                          data-badge="bottomright" data-callback="submitCaptchadContestForm"
+                          data-sitekey="6LeCJy0UAAAAAO5grI_UrlSR1oz9AceexUbkcHgC" eager-recaptcha="1">Subscribe</button>
+                      </div>
+                    </fieldset>
+                    <a href="javascript:void(0)" class="contest-dismiss-link cta-lg" data-dismiss="modal">No Thanks</a>
+                    <a href="/" class="contest-take-me-home-link cta-lg" data-dismiss="modal">Visit AtlasObscura.com</a>
+                  </div>
+                </form>
+              </div>
+              <div id="contest-image-wrap" class="hidden-xs hidden-sm">
+                <picture>
+                  <source
+                    data-srcset="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvZmF2aWNvbi0xNngxNi5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/favicon-16x16.png"
+                    media="(max-width: 667px)"
+                    srcset="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaWNvbnMvZmF2aWNvbi0xNngxNi5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/favicon-16x16.png" />
+                  <img class="img-responsive"
+                    data-src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaW50ZXJuYWwtb25lLW9mZnMvc2hvcC9zZWNvbmQtZWR0aW9uLW9wdGltLnBuZyJdLFsicCIsImNvbnZlcnQiLCItcXVhbGl0eSA4MSAtc3RyaXAiXV0/second-edtion-optim.png"
+                    src="https://assets.atlasobscura.com/media/W1siZnUiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vYXRsYXMtZGV2L21pc2MvaW50ZXJuYWwtb25lLW9mZnMvc2hvcC9zZWNvbmQtZWRpdGlvbi1vcHRpbS5wbmciXSxbInAiLCJjb252ZXJ0IiwiLXF1YWxpdHkgODEgLXN0cmlwIl1d/second-edition-optim.png"
+                    alt="Atlas Obscura: An Explorer's Guide to the World's Hidden Wonders" />
+                </picture>
+              </div>
+            </center>
+          </div>
+        </div>
+        <div class="final-state-asks">
+          <center>
+            <h1 class="title-lg baseline-standard baseline-mobile" style="color: #fff;">Stay in Touch!</h1>
+            <div class="subtitle-lg baseline-standard baseline-mobile">Follow us on social media to add even more wonder
+              to your day.</div>
+            <a href="https://twitter.com/atlasobscura"
+              class="js-social-action-tracked js-hidden-if-contest btn btn-twitter fullscreen-modal-social-btn"
+              target="_blank" data-service="Twitter" data-action="Follow" data-position="Contest Ask"><i
+                class="icon icon-twitter"></i>Follow us on Twitter</a>
+            <a href="https://www.facebook.com/atlasobscura/"
+              class="js-social-action-tracked btn btn-facebook fullscreen-modal-social-btn" target="_blank"
+              data-service="Facebook" data-action="Like" data-position="Contest Ask"><i
+                class="icon icon-facebook"></i>Like us on Facebook</a>
+            <a href="https://www.instagram.com/atlasobscura/"
+              class="js-social-action-tracked btn btn-instagram fullscreen-modal-social-btn" target="_blank"
+              data-service="Instagram" data-action="Follow" data-position="Contest Ask" style="margin-bottom: 24px;"><i
+                class="icon icon-instagram"></i>Follow Us on Instagram</a>
+            <a href="javascript:void(0)" style="" class="contest-dismiss-link cta-lg" data-dismiss="modal">No Thanks</a>
+            <a href="/" class="contest-take-me-home-link cta-lg" data-dismiss="modal">Visit AtlasObscura.com</a>
+          </center>
+        </div>
+        <div class="container contest-disclaimer contest-signup-ui">
+          <div class="row">
+            <div class="col-lg-6 col-lg-push-1">
+              <div class="contest-footnote">No purchase necessary. Winner will be selected at random on 02/01/2020.
+                Offer available only in the U.S. (including Puerto Rico). Offer subject to change without notice. See <a
+                  href="/newsletters/contest-rules">contest rules</a> for full details.</div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="email-roadblock-topographic-modal" class="modal js-subscription-ask-modal " role="dialog">
+    <div class="modal-dialog">
+      <div class="modal-content">
+        <div class="modal-wrap modal-wrap-topographic topographic modal-wrap-responsive">
+          <i class="icon-modal-close modal-close" data-dismiss="modal"></i>
+          <div class="row modal-bg roadblock-modal-content">
+            <div class="modal-body" id="newsletter-email-collection-modal">
+              <div id="js-email-roadblock-topographic-modal-thanks" class="form-complete-notice"></div>
+              <form class="js-email-roadblock-form js-email-ask-form" action="/email_lists/signup"
+                accept-charset="UTF-8" data-remote="true" method="post"><input name="utf8" type="hidden"
+                  value="&#x2713;" />
+                <input type="hidden" name="subscribe_general" value="true" />
+                <input type="hidden" name="source" value="email-roadblock-topographic-modal" />
+                <h4 class="title-lg modal-title-roadblock">Add Some Wonder to Your Inbox</h4>
+                <div class="subtitle-md">Every weekday we compile our most wondrous stories and deliver them straight to
+                  you.</div>
+                <div id="js-email-roadblock-topographic-modal-error"></div>
+                <fieldset class="modal-fieldset">
+                  <div class="cta-lg validate-message"></div>
+                  <div class="email-submit-group-m">
+                    <input type="email" name="email" class="col-md-12" required="required" placeholder="your email"
+                      aria-label="Email" />
+                    <button name="button" type="submit" class="btn btn-stretch btn-submit">
+                      <i class="icon-envelope"></i><span class="hidden-sm hidden-xs">Subscribe</span>
+                    </button> </div>
+                </fieldset>
+                <footer class="roadblock-footer">
+                  <a href="" class="roadblock-dismiss-link cta-lg" data-dismiss="modal">No Thanks</a>
+                </footer>
+              </form>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="facebook-topographic-modal" class="modal js-subscription-ask-modal " role="dialog">
+    <div class="modal-dialog">
+      <div class="modal-content">
+        <div class="modal-wrap modal-wrap-topographic topographic modal-wrap-responsive modal-wrap-fb">
+          <i class="icon-modal-close modal-close" data-dismiss="modal"></i>
+          <div class="row modal-bg roadblock-modal-content">
+            <div class="modal-body">
+              <div id="js-facebook-topographic-modal-thanks" class="form-complete-notice"></div>
+              <h4 class="title-lg modal-title-roadblock" style="font-size: 38px;">We'd Like You to Like Us</h4>
+              <div class="subtitle-md">Like Atlas Obscura and get our latest and greatest stories in your Facebook feed.
+              </div>
+              <fieldset class="modal-fieldset">
+                <div id="fb-modal-like-wrap"></div>
+              </fieldset>
+              <footer class="roadblock-footer">
+                <a href="" class="roadblock-dismiss-link cta-lg" data-dismiss="modal">No Thanks</a>
+              </footer>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="cookie-consent-modal" class="modal" data-backdrop="static" data-keyboard="false" role="dialog">
+    <div class="modal-dialog">
+      <div class="modal-content">
+        <div class="modal-wrap modal-wrap-topographic topographic modal-wrap-responsive">
+          <div class="row modal-bg roadblock-modal-content">
+            <div class="modal-body">
+              <h6 class="title-md baseline-near baseline-mobile">We value your privacy</h6>
+              <p style="margin-bottom: 21px;">Atlas Obscura and our trusted partners use technology such as cookies on
+                our website to personalise ads, support social media features, and analyse our traffic. Please click
+                below to consent to the use of this technology while browsing our site. To learn more or withdraw
+                consent, please visit our <a target="_blank" href="/privacy">privacy policy</a>.</p>
+              <div>
+                <a href="javascript:void(0)" class="btn btn-submit js-cookie-consent-accept" data-dismiss="modal">I
+                  Accept</a>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <div id="fixed-notice-m" class="js-notice">
+    <div class="notice">
+      <i class="icon-info"></i>
+      <span id="fixed-notice-m-text" class="flash-message"></span>
+      <i class="icon-menu-close js-dismiss-notice"></i>
+    </div>
+  </div>
+  <noscript>
+    <img src="https://sb.scorecardresearch.com/p?c1=2&c2=17564338&cv=2.0&cj=1" />
+  </noscript>
+
+
+  <noscript>
+    <div style="display:none;"><img src="//pixel.quantserve.com/pixel/p-wCQ2x-2BzmYPY.gif" border="0" height="1"
+        width="1" alt="Quantcast" /></div>
+  </noscript>
+
+  <div id="parsely-root" style="display: none">
+    <span id="parsely-cfg" data-parsely-site="atlasobscura.com"></span>
+  </div>
+
+  <svg aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1"
+    xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <defs>
+      <symbol id="icon-aoc-cancel" viewBox="0 0 24 24">
+        <title>aoc-cancel</title>
+        <path
+          d="M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10c5.53 0 10-4.47 10-10s-4.47-10-10-10v0zM17 15.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-video" viewBox="0 0 24 24">
+        <title>aoc-video</title>
+        <path
+          d="M10 16.5l6-4.5-6-4.5v9zM12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10c5.52 0 10-4.48 10-10s-4.48-10-10-10v0zM12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8c4.41 0 8 3.59 8 8s-3.59 8-8 8v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-building" viewBox="0 0 24 24">
+        <title>aoc-building</title>
+        <path
+          d="M16 8.050c-0.096 0.098-0.187 0.202-0.272 0.312-1.061 0.455-1.911 1.305-2.366 2.366-0.129 0.099-0.25 0.207-0.362 0.322v-0.050h-2v2h1.036c-0.024 0.164-0.036 0.331-0.036 0.5 0 1.883 1.487 3.419 3.351 3.497 0.2 0.177 0.418 0.334 0.649 0.468v4.535h-5v-6h-4v6h-5v-20h14v6.050zM5 11v2h2v-2h-2zM5 7v2h2v-2h-2zM8 7v2h2v-2h-2zM8 11v2h2v-2h-2zM11 7v2h2v-2h-2zM17 16.829c-0.485-0.171-0.913-0.464-1.247-0.842-0.083 0.008-0.167 0.013-0.253 0.013-1.381 0-2.5-1.119-2.5-2.5 0-0.898 0.474-1.686 1.185-2.127 0.349-1.027 1.161-1.839 2.188-2.188 0.441-0.711 1.228-1.185 2.127-1.185 1.381 0 2.5 1.119 2.5 2.5 0 0.185-0.020 0.365-0.058 0.539 1.17 0.209 2.058 1.231 2.058 2.461 0 1.381-1.119 2.5-2.5 2.5-0.085 0-0.17-0.004-0.253-0.013-0.334 0.378-0.762 0.67-1.247 0.842v5.171h-2v-5.171z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-clock" viewBox="0 0 24 24">
+        <title>aoc-clock</title>
+        <path
+          d="M11.99 2c5.53 0 10.010 4.48 10.010 10s-4.48 10-10.010 10c-5.52 0-9.99-4.48-9.99-10s4.47-10 9.99-10zM13 11.423v-5.423c0-0.552-0.448-1-1-1s-1 0.448-1 1v6.577l3.964 2.289c0.478 0.276 1.090 0.112 1.366-0.366s0.112-1.090-0.366-1.366l-2.964-1.711z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-clipboard" viewBox="0 0 19 24">
+        <title>aoc-clipboard</title>
+        <path
+          d="M12.984 2.4c-0.504-1.392-1.824-2.4-3.384-2.4s-2.88 1.008-3.384 2.4h-3.816c-1.32 0-2.4 1.080-2.4 2.4v16.8c0 1.32 1.080 2.4 2.4 2.4h14.4c1.32 0 2.4-1.080 2.4-2.4v-16.8c0-1.32-1.080-2.4-2.4-2.4h-3.816zM10.8 3.6c0 0.66-0.54 1.2-1.2 1.2s-1.2-0.54-1.2-1.2c0-0.66 0.54-1.2 1.2-1.2s1.2 0.54 1.2 1.2zM4.804 20.4c-0.665 0-1.204-0.533-1.204-1.2v0c0-0.663 0.525-1.2 1.204-1.2h5.993c0.665 0 1.204 0.533 1.204 1.2v0c0 0.663-0.525 1.2-1.204 1.2h-5.993zM4.794 15.6c-0.66 0-1.194-0.533-1.194-1.2v0c0-0.663 0.547-1.2 1.194-1.2h9.611c0.66 0 1.194 0.533 1.194 1.2v0c0 0.663-0.547 1.2-1.194 1.2h-9.611zM4.794 10.8c-0.66 0-1.194-0.533-1.194-1.2v0c0-0.663 0.547-1.2 1.194-1.2h9.611c0.66 0 1.194 0.533 1.194 1.2v0c0 0.663-0.547 1.2-1.194 1.2h-9.611z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-help" viewBox="0 0 24 24">
+        <title>aoc-help</title>
+        <path
+          d="M12 1c6.072 0 11 4.928 11 11s-4.928 11-11 11c-6.072 0-11-4.928-11-11s4.928-11 11-11zM12 19.5c0.69 0 1.25-0.56 1.25-1.25s-0.56-1.25-1.25-1.25c-0.69 0-1.25 0.56-1.25 1.25s0.56 1.25 1.25 1.25zM7.6 8.7c0 0.608 0.492 1.1 1.1 1.1s1.1-0.492 1.1-1.1c0-1.21 0.99-2.2 2.2-2.2s2.2 0.99 2.2 2.2c0 0.605-0.242 1.155-0.649 1.551l-1.364 1.386c-0.67 0.679-1.285 1.592-1.285 2.563h-0.002c0 0.608 0.492 1.1 1.1 1.1s1.1-0.492 1.1-1.1c0.067-1.003 0.7-1.417 1.287-2.013l0.99-1.012c0.627-0.627 1.023-1.507 1.023-2.475 0-2.431-1.969-4.4-4.4-4.4s-4.4 1.969-4.4 4.4z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-arrow-right" viewBox="0 0 24 24">
+        <title>aoc-arrow-right</title>
+        <path d="M9.295 7.115l1.41-1.41 6 6-6 6-1.41-1.41 4.58-4.59z"></path>
+      </symbol>
+      <symbol id="icon-aoc-arrow-left" viewBox="0 0 24 24">
+        <title>aoc-arrow-left</title>
+        <path d="M7.295 11.705l6-6 1.41 1.41-4.58 4.59 4.58 4.59-1.41 1.41z"></path>
+      </symbol>
+      <symbol id="icon-aoc-ticket" viewBox="0 0 24 24">
+        <title>aoc-ticket</title>
+        <path
+          d="M19.778 12.707l-8.485-8.485 2.828-2.828c0.391-0.391 1.024-0.391 1.414 0l2.311 2.311c-0.005 0.004-0.009 0.009-0.013 0.013-0.71 0.71-0.743 1.828-0.073 2.498s1.788 0.637 2.498-0.073c0.004-0.004 0.009-0.009 0.013-0.013l2.336 2.336c0.391 0.391 0.391 1.024 0 1.414l-2.828 2.828zM19.071 13.414l-9.192 9.192c-0.391 0.391-1.024 0.391-1.414 0l-2.336-2.336c0.697-0.711 0.725-1.819 0.060-2.484s-1.774-0.637-2.484 0.060l-2.311-2.311c-0.391-0.391-0.391-1.024 0-1.414l9.192-9.192 8.485 8.485zM5.636 14.121c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l4.95-4.95c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-4.95 4.95zM8.464 16.95c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l4.95-4.95c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-4.95 4.95z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-place-entry" viewBox="0 0 24 24">
+        <title>aoc-place-entry</title>
+        <path
+          d="M18 8c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 4.5 6 11 6 11s6-6.5 6-11v0zM10 8c0-1.1 0.9-2 2-2s2 0.9 2 2c0 1.1-0.89 2-2 2-1.1 0-2-0.9-2-2v0zM5 20v2h14v-2h-14z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-facebook" viewBox="0 0 24 24">
+        <title>aoc-facebook</title>
+        <path
+          d="M20.895 2h-17.789c-0.61 0-1.105 0.495-1.105 1.105v17.789c0 0.61 0.495 1.105 1.105 1.105h9.579v-7.719h-2.614v-3.042h2.6v-2.221c0-2.586 1.575-3.993 3.881-3.993 0.783 0.002 1.566 0.047 2.344 0.133v2.698h-1.593c-1.253 0-1.495 0.593-1.495 1.467v1.93h3l-0.389 3.028h-2.611v7.719h5.088c0.61 0 1.105-0.495 1.105-1.105v-17.789c0-0.61-0.495-1.105-1.105-1.105z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-instagram" viewBox="0 0 24 24">
+        <title>aoc-instagram</title>
+        <path
+          d="M12 2c2.716 0 3.056 0.012 4.123 0.060 1.064 0.049 1.791 0.218 2.427 0.465 0.658 0.256 1.215 0.597 1.771 1.153s0.898 1.114 1.153 1.771c0.247 0.636 0.416 1.363 0.465 2.427 0.049 1.067 0.060 1.407 0.060 4.123s-0.012 3.056-0.060 4.123c-0.049 1.064-0.218 1.791-0.465 2.427-0.256 0.658-0.597 1.215-1.153 1.771s-1.114 0.898-1.771 1.153c-0.636 0.247-1.363 0.416-2.427 0.465-1.067 0.049-1.407 0.060-4.123 0.060s-3.056-0.012-4.123-0.060c-1.064-0.049-1.791-0.218-2.427-0.465-0.658-0.256-1.215-0.597-1.771-1.153s-0.898-1.114-1.153-1.771c-0.247-0.636-0.416-1.363-0.465-2.427-0.049-1.067-0.060-1.407-0.060-4.123s0.012-3.056 0.060-4.123c0.049-1.064 0.218-1.791 0.465-2.427 0.256-0.658 0.597-1.215 1.153-1.771s1.114-0.898 1.771-1.153c0.636-0.247 1.363-0.416 2.427-0.465 1.067-0.049 1.407-0.060 4.123-0.060zM12 3.802c-2.67 0-2.986 0.010-4.041 0.058-0.975 0.044-1.504 0.207-1.857 0.344-0.467 0.181-0.8 0.398-1.15 0.748s-0.567 0.683-0.748 1.15c-0.137 0.352-0.3 0.882-0.344 1.857-0.048 1.054-0.058 1.371-0.058 4.041s0.010 2.986 0.058 4.041c0.044 0.975 0.207 1.504 0.344 1.857 0.181 0.467 0.398 0.8 0.748 1.15s0.683 0.567 1.15 0.748c0.352 0.137 0.882 0.3 1.857 0.344 1.054 0.048 1.371 0.058 4.041 0.058s2.987-0.010 4.041-0.058c0.975-0.044 1.504-0.207 1.857-0.344 0.467-0.181 0.8-0.398 1.15-0.748s0.567-0.683 0.748-1.15c0.137-0.352 0.3-0.882 0.344-1.857 0.048-1.054 0.058-1.371 0.058-4.041s-0.010-2.986-0.058-4.041c-0.044-0.975-0.207-1.504-0.344-1.857-0.181-0.467-0.398-0.8-0.748-1.15s-0.683-0.567-1.15-0.748c-0.352-0.137-0.882-0.3-1.857-0.344-1.054-0.048-1.371-0.058-4.041-0.058zM12 6.865c2.836 0 5.135 2.299 5.135 5.135s-2.299 5.135-5.135 5.135c-2.836 0-5.135-2.299-5.135-5.135s2.299-5.135 5.135-5.135zM12 15.333c1.841 0 3.333-1.492 3.333-3.333s-1.492-3.333-3.333-3.333c-1.841 0-3.333 1.492-3.333 3.333s1.492 3.333 3.333 3.333zM18.538 6.662c0 0.663-0.537 1.2-1.2 1.2s-1.2-0.537-1.2-1.2 0.537-1.2 1.2-1.2c0.663 0 1.2 0.537 1.2 1.2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-reddit" viewBox="0 0 24 24">
+        <title>aoc-reddit</title>
+        <path
+          d="M22.999 12.034c0-1.397-1.137-2.534-2.534-2.534-0.621 0-1.208 0.225-1.67 0.632-1.648-1.054-3.834-1.732-6.252-1.823l1.441-4.096 3.601 0.861c0.002 1.139 0.929 2.065 2.069 2.065 1.141 0 2.069-0.928 2.069-2.069s-0.929-2.069-2.069-2.069c-0.866 0-1.609 0.536-1.917 1.292l-4.265-1.020-1.771 5.030c-2.519 0.048-4.803 0.729-6.512 1.816-0.46-0.399-1.040-0.618-1.655-0.618-1.397 0-2.534 1.137-2.534 2.534 0 0.864 0.445 1.661 1.166 2.126-0.044 0.253-0.069 0.509-0.069 0.77 0 3.658 4.434 6.634 9.884 6.634s9.884-2.976 9.884-6.634c0-0.253-0.023-0.502-0.064-0.748 0.74-0.461 1.199-1.27 1.199-2.148l-0.001-0.001zM7.283 13.759c0-0.86 0.697-1.557 1.558-1.557 0.86 0 1.557 0.697 1.557 1.557 0 0.86-0.697 1.557-1.557 1.557-0.861 0-1.558-0.697-1.558-1.557zM15.652 17.971c-0.046 0.049-1.164 1.185-3.689 1.185-2.538 0-3.554-1.153-3.595-1.202-0.143-0.167-0.124-0.419 0.044-0.562 0.166-0.142 0.415-0.124 0.559 0.041 0.023 0.025 0.87 0.926 2.993 0.926 2.16 0 3.107-0.933 3.116-0.942 0.153-0.156 0.404-0.16 0.562-0.006s0.162 0.401 0.011 0.56l0.001-0.001zM15.342 15.316c-0.861 0-1.558-0.697-1.558-1.557s0.697-1.557 1.558-1.557c0.86 0 1.557 0.697 1.557 1.557 0 0.86-0.697 1.557-1.557 1.557z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-rss" viewBox="0 0 24 24">
+        <title>aoc-rss</title>
+        <path
+          d="M3 2c-0.552 0-1 0.448-1 1v18c0 0.552 0.448 1 1 1h18c0.552 0 1-0.448 1-1v-18c0-0.552-0.448-1-1-1h-18zM14.083 18.25h-2.381c0-3.282-2.671-5.952-5.953-5.952v-2.381c4.595 0 8.333 3.738 8.333 8.333zM18.25 18.25h-2.381c0-5.58-4.539-10.119-10.119-10.119v-2.381c6.892 0 12.5 5.608 12.5 12.5zM5.75 16.464c0-0.986 0.8-1.786 1.786-1.786s1.786 0.8 1.786 1.786c0 0.986-0.8 1.786-1.786 1.786s-1.786-0.8-1.786-1.786z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-twitter" viewBox="0 0 24 24">
+        <title>aoc-twitter</title>
+        <path
+          d="M23 6.072c-0.772 0.351-1.602 0.589-2.474 0.695 0.89-0.546 1.573-1.412 1.895-2.443-0.833 0.506-1.754 0.873-2.738 1.071-0.784-0.858-1.904-1.394-3.144-1.394-2.378 0-4.307 1.978-4.307 4.418 0 0.346 0.037 0.683 0.111 1.006-3.581-0.185-6.755-1.941-8.881-4.617-0.371 0.655-0.583 1.414-0.583 2.223 0 1.532 0.761 2.884 1.917 3.677-0.705-0.021-1.371-0.222-1.952-0.551v0.054c0 2.141 1.485 3.927 3.457 4.332-0.361 0.104-0.742 0.155-1.135 0.155-0.277 0-0.549-0.027-0.811-0.078 0.549 1.754 2.139 3.032 4.024 3.066-1.474 1.186-3.333 1.892-5.351 1.892-0.348 0-0.692-0.020-1.028-0.061 1.907 1.251 4.172 1.983 6.604 1.983 7.926 0 12.258-6.731 12.258-12.569 0-0.192-0.004-0.384-0.011-0.573 0.842-0.623 1.573-1.401 2.148-2.287z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-accommodation" viewBox="0 0 24 24">
+        <title>aoc-accommodation</title>
+        <path
+          d="M23 12v1h-17c-0.552 0-1-0.448-1-1s0.448-1 1-1h4v-2.834c0-0.552 0.448-1 1-1 0.051 0 0.102 0.004 0.152 0.012l11 1.692c0.488 0.075 0.848 0.495 0.848 0.988v2.142zM4 14h19v6h-3v-3h-16v3h-3v-15c0-0.552 0.448-1 1-1h1c0.552 0 1 0.448 1 1v9zM7 10c-1.105 0-2-0.895-2-2s0.895-2 2-2c1.105 0 2 0.895 2 2s-0.895 2-2 2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-activity-level" viewBox="0 0 24 24">
+        <title>aoc-activity-level</title>
+        <path
+          d="M22.994 17.99h-7.239c-0.366 0-0.72-0.134-0.994-0.377l-11.172-9.883 3.409-4.016c0.422-0.557 0.839-0.788 1.251-0.694 0.619 0.141 0.619 2.349 2.249 3.47 0.909 0.625 1.601 0.94 5 0.5 0.889 1.249 2.099 5.976 3.050 6.747s4.447 1.234 4.447 3.753v0.5zM22.994 18.99v1c0 0.552-0.448 1-1 1l-6.864-0c-0.73 0-1.435-0.266-1.983-0.749l-10.808-9.522c-0.409-0.36-0.454-0.982-0.101-1.397l0.704-0.829 11.157 9.87c0.457 0.404 1.046 0.628 1.656 0.628h7.239z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-add-a-photo" viewBox="0 0 24 24">
+        <title>aoc-add-a-photo</title>
+        <path
+          d="M3 4v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3zM6 10v-3h3v-3h7l1.83 2h3.17c1.1 0 2 0.9 2 2v12c0 1.1-0.9 2-2 2h-16c-1.1 0-2-0.9-2-2v-10h3zM13 19c2.76 0 5-2.24 5-5s-2.24-5-5-5c-2.76 0-5 2.24-5 5s2.24 5 5 5v0zM9.8 14c0 1.77 1.43 3.2 3.2 3.2s3.2-1.43 3.2-3.2c0-1.77-1.43-3.2-3.2-3.2s-3.2 1.43-3.2 3.2v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-add-box" viewBox="0 0 24 24">
+        <title>aoc-add-box</title>
+        <path
+          d="M19 3h-14c-1.11 0-2 0.9-2 2v14c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2v-14c0-1.1-0.9-2-2-2v0zM17 13h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-add-shape" viewBox="0 0 24 24">
+        <title>aoc-add-shape</title>
+        <path d="M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6z"></path>
+      </symbol>
+      <symbol id="icon-aoc-arrow-forward" viewBox="0 0 24 24">
+        <title>aoc-arrow-forward</title>
+        <path d="M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z"></path>
+      </symbol>
+      <symbol id="icon-aoc-been-here" viewBox="0 0 24 24">
+        <title>aoc-been-here</title>
+        <path d="M7 20h-2l-1-16h2l1 16zM8.625 15l-0.625-10h12l-3 5 3 5h-11.375z"></path>
+      </symbol>
+      <symbol id="icon-aoc-chat-bubbles" viewBox="0 0 24 24">
+        <title>aoc-chat-bubbles</title>
+        <path
+          d="M21 6h-2v9h-13v2c0 0.55 0.45 1 1 1h11l4 4v-15c0-0.55-0.45-1-1-1v0zM17 12v-9c0-0.55-0.45-1-1-1h-13c-0.55 0-1 0.45-1 1v14l4-4h10c0.55 0 1-0.45 1-1v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-close" viewBox="0 0 24 24">
+        <title>aoc-close</title>
+        <path
+          d="M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-expand-more" viewBox="0 0 24 24">
+        <title>aoc-expand-more</title>
+        <path d="M16.59 9l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z"></path>
+      </symbol>
+      <symbol id="icon-aoc-expand-less" viewBox="0 0 24 24">
+        <title>aoc-expand-less</title>
+        <path d="M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z"></path>
+      </symbol>
+      <symbol id="icon-aoc-forum-flag" viewBox="0 0 24 24">
+        <title>aoc-forum-flag</title>
+        <path
+          d="M6 15v6c0 0.552-0.448 1-1 1s-1-0.448-1-1v-18c0-0.552 0.448-1 1-1s1 0.448 1 1h14l-3 6 3 6h-14zM16.764 5h-10.764v8h10.764l-2-4 2-4z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-group-size" viewBox="0 0 24 24">
+        <title>aoc-group-size</title>
+        <path
+          d="M12 3c1.812 0 3.281 1.469 3.281 3.281s-1.469 3.281-3.281 3.281c-1.812 0-3.281-1.469-3.281-3.281s1.469-3.281 3.281-3.281zM6.292 10.178c-0.345 0.519-0.542 1.139-0.542 1.797v5.025h-4c-0.414 0-0.75-0.336-0.75-0.75v-5.266c0-0.688 0.468-1.288 1.136-1.455l0.71-0.178c0.582 0.63 1.416 1.024 2.341 1.024 0.388 0 0.76-0.069 1.104-0.197zM17.488 9.885c0.492 0.31 1.075 0.49 1.699 0.49 0.888 0 1.691-0.363 2.269-0.948l0.408 0.102c0.668 0.167 1.136 0.767 1.136 1.455v5.266c0 0.414-0.336 0.75-0.75 0.75h-4v-5.025c0-0.787-0.282-1.52-0.762-2.091zM19.188 9.375c-1.208 0-2.187-0.979-2.187-2.187s0.979-2.187 2.187-2.187c1.208 0 2.187 0.979 2.187 2.187s-0.979 2.187-2.187 2.187zM5.187 9.375c-1.208 0-2.187-0.979-2.187-2.187s0.979-2.187 2.187-2.187c1.208 0 2.187 0.979 2.187 2.187s-0.979 2.187-2.187 2.187zM9.279 9.587c0.74 0.61 1.688 0.976 2.721 0.976s1.981-0.366 2.721-0.976l0.824 0.206c1.002 0.25 1.704 1.15 1.704 2.183v6.9c0 0.621-0.504 1.125-1.125 1.125h-8.25c-0.621 0-1.125-0.504-1.125-1.125v-6.9c0-1.032 0.703-1.932 1.704-2.183l0.824-0.206z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-heart-outline" viewBox="0 0 24 24">
+        <title>aoc-heart-outline</title>
+        <path
+          d="M18.91 11.473c0.697-0.71 1.090-1.677 1.090-2.689s-0.394-1.979-1.091-2.689c-0.689-0.703-1.62-1.095-2.587-1.095s-1.897 0.393-2.587 1.095l-1.736 1.768-1.736-1.768c-1.433-1.46-3.741-1.46-5.174 0-1.454 1.481-1.454 3.897-0.031 5.347l6.941 6.765 6.91-6.734zM11.375 4.395l0.625 0.613 0.623-0.611c1.026-0.898 2.338-1.397 3.7-1.397 1.506 0 2.95 0.61 4.015 1.695s1.663 2.556 1.663 4.090-0.598 3.006-1.663 4.090l-8.337 8.125-8.337-8.125c-2.217-2.259-2.217-5.921 0-8.18 2.114-2.154 5.481-2.254 7.712-0.3z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-heart-solid" viewBox="0 0 24 24">
+        <title>aoc-heart-solid</title>
+        <path
+          d="M11.375 4.395l0.625 0.613 0.623-0.611c1.026-0.898 2.338-1.397 3.7-1.397 1.506 0 2.95 0.61 4.015 1.695s1.663 2.556 1.663 4.090-0.598 3.006-1.663 4.090l-8.337 8.125-8.337-8.125c-2.217-2.259-2.217-5.921 0-8.18 2.114-2.154 5.481-2.254 7.712-0.3z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-home" viewBox="0 0 24 24">
+        <title>aoc-home</title>
+        <path d="M15 22v-5c0-1.657-1.343-3-3-3s-3 1.343-3 3v5h-5v-11h-2v-1l9.995-8 10.005 8v1h-2v11h-5z"></path>
+      </symbol>
+      <symbol id="icon-aoc-important" viewBox="0 0 24 24">
+        <title>aoc-important</title>
+        <path
+          d="M21.775 18.469c0.641 1.125-0.164 2.531-1.444 2.531h-16.663c-1.283 0-2.083-1.408-1.444-2.531l8.331-14.626c0.641-1.125 2.247-1.123 2.887 0l8.331 14.626zM12 8c-0.552 0-1 0.448-1 1v5c0 0.552 0.448 1 1 1s1-0.448 1-1v-5c0-0.552-0.448-1-1-1zM12 19c0.552 0 1-0.448 1-1s-0.448-1-1-1c-0.552 0-1 0.448-1 1s0.448 1 1 1z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-knife-fork" viewBox="0 0 24 24">
+        <title>aoc-knife-fork</title>
+        <path
+          d="M9.25 2.75v4.625c0 0.345 0.28 0.625 0.625 0.625s0.625-0.28 0.625-0.625v-4.625c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75v6.25c0 1.306-0.835 2.417-2 2.829v8.671c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5v-8.671c-1.165-0.412-2-1.523-2-2.829v-6.25c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75v4.625c0 0.345 0.28 0.625 0.625 0.625s0.625-0.28 0.625-0.625v-4.625c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75zM19 1v19.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5v-7.5h-1c-0.552 0-1-0.448-1-1v-6c0-2.761 2.239-5 5-5z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-library-books" viewBox="0 0 24 24">
+        <title>aoc-library-books</title>
+        <path
+          d="M4 6h-2v14c0 1.1 0.9 2 2 2h14v-2h-14v-14zM20 2h-12c-1.1 0-2 0.9-2 2v12c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2v-12c0-1.1-0.9-2-2-2v0zM19 11h-10v-2h10v2zM15 15h-6v-2h6v2zM19 7h-10v-2h10v2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-link" viewBox="0 0 24 24">
+        <title>aoc-link</title>
+        <path
+          d="M9.937 12.2c0.441-0.33 1.067-0.24 1.397 0.201 0.542 0.724 1.372 1.178 2.274 1.242s1.788-0.266 2.428-0.906l2.451-2.451c1.187-1.229 1.171-3.173-0.032-4.377-1.201-1.201-3.146-1.221-4.355-0.053l-1.421 1.413c-0.391 0.389-1.023 0.387-1.412-0.004s-0.387-1.023 0.004-1.412l1.431-1.423c2.002-1.934 5.192-1.904 7.164 0.067 1.975 1.975 1.998 5.165 0.044 7.187l-2.463 2.463c-1.049 1.049-2.502 1.591-3.982 1.485s-2.841-0.85-3.73-2.038c-0.33-0.441-0.24-1.067 0.201-1.397zM14.425 12.152c-0.441 0.33-1.067 0.24-1.397-0.201-0.542-0.724-1.372-1.178-2.274-1.242s-1.788 0.266-2.428 0.906l-2.451 2.451c-1.187 1.229-1.171 3.173 0.032 4.377 1.201 1.201 3.145 1.221 4.352 0.056l1.414-1.414c0.39-0.39 1.022-0.39 1.412 0s0.39 1.022-0 1.412l-1.426 1.426c-2.002 1.933-5.191 1.903-7.163-0.068-1.975-1.975-1.998-5.165-0.044-7.187l2.463-2.463c1.049-1.049 2.502-1.591 3.982-1.485s2.841 0.85 3.73 2.038c0.33 0.441 0.24 1.067-0.201 1.397z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-list-circle-bullets" viewBox="0 0 24 24">
+        <title>aoc-list-circle-bullets</title>
+        <path
+          d="M4 10.5c-0.83 0-1.5 0.67-1.5 1.5s0.67 1.5 1.5 1.5c0.83 0 1.5-0.67 1.5-1.5s-0.67-1.5-1.5-1.5v0zM4 4.5c-0.83 0-1.5 0.67-1.5 1.5s0.67 1.5 1.5 1.5c0.83 0 1.5-0.67 1.5-1.5s-0.67-1.5-1.5-1.5v0zM4 16.5c-0.835 0-1.5 0.677-1.5 1.5s0.677 1.5 1.5 1.5c0.823 0 1.5-0.677 1.5-1.5s-0.665-1.5-1.5-1.5v0zM7 19h14v-2h-14v2zM7 13h14v-2h-14v2zM7 5v2h14v-2h-14z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-list" viewBox="0 0 24 24">
+        <title>aoc-list</title>
+        <path d="M3 13h2v-2h-2v2zM3 17h2v-2h-2v2zM3 9h2v-2h-2v2zM7 13h14v-2h-14v2zM7 17h14v-2h-14v2zM7 7v2h14v-2h-14z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-location-add" viewBox="0 0 24 24">
+        <title>aoc-location-add</title>
+        <path
+          d="M12 2c-3.86 0-7 3.14-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7v0zM16 10h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-location" viewBox="0 0 24 24">
+        <title>aoc-location</title>
+        <path
+          d="M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7v0zM12 11.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-mail" viewBox="0 0 24 24">
+        <title>aoc-mail</title>
+        <path
+          d="M20 4h-16c-1.1 0-1.99 0.9-1.99 2l-0.010 12c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2v-12c0-1.1-0.9-2-2-2v0zM20 8l-8 5-8-5v-2l8 5 8-5v2z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-map" viewBox="0 0 24 24">
+        <title>aoc-map</title>
+        <path
+          d="M20.5 3l-0.16 0.030-5.34 2.070-6-2.1-5.64 1.9c-0.21 0.070-0.36 0.25-0.36 0.48v15.12c0 0.28 0.22 0.5 0.5 0.5l0.16-0.030 5.34-2.070 6 2.1 5.64-1.9c0.21-0.070 0.36-0.25 0.36-0.48v-15.12c0-0.28-0.22-0.5-0.5-0.5v0zM15 19l-6-2.11v-11.89l6 2.11v11.89z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-menu" viewBox="0 0 24 24">
+        <title>aoc-menu</title>
+        <path d="M3 5h18v2h-18v-2zM3 11h18v2h-18v-2zM3 17h18v2h-18v-2z"></path>
+      </symbol>
+      <symbol id="icon-aoc-more-horizontal" viewBox="0 0 24 24">
+        <title>aoc-more-horizontal</title>
+        <path
+          d="M6 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0zM18 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0zM12 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-my-location" viewBox="0 0 24 24">
+        <title>aoc-my-location</title>
+        <path
+          d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4c2.21 0 4-1.79 4-4s-1.79-4-4-4v0zM20.94 11c-0.46-4.17-3.77-7.48-7.94-7.94v-2.060h-2v2.060c-4.17 0.46-7.48 3.77-7.94 7.94h-2.060v2h2.060c0.46 4.17 3.77 7.48 7.94 7.94v2.060h2v-2.060c4.17-0.46 7.48-3.77 7.94-7.94h2.060v-2h-2.060zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7c3.87 0 7 3.13 7 7s-3.13 7-7 7v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-near-me" viewBox="0 0 24 24">
+        <title>aoc-near-me</title>
+        <path d="M21 3l-18 7.53v0.98l6.84 2.65 2.64 6.84h0.98z"></path>
+      </symbol>
+      <symbol id="icon-aoc-notifications-alert" viewBox="0 0 24 24">
+        <title>aoc-notifications-alert</title>
+        <path
+          d="M18.988 10.589c0.008 0.136 0.012 0.273 0.012 0.411v5l2 1v2h-18v-2l2-1v-5c0-3.526 2.608-6.444 6-6.929v-1.071c0-0.552 0.448-1 1-1s1 0.447 1 1c-0.628 0.836-1 1.875-1 3 0 2.761 2.239 5 5 5 0.707 0 1.379-0.147 1.988-0.411zM10 20h4c0 1.105-0.895 2-2 2s-2-0.895-2-2zM17 9c-1.657 0-3-1.343-3-3s1.343-3 3-3c1.657 0 3 1.343 3 3s-1.343 3-3 3z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-notifications-mentions" viewBox="0 0 24 24">
+        <title>aoc-notifications-mentions</title>
+        <path
+          d="M15.52 15.487c-0.585 0.857-1.949 1.786-3.776 1.786-3.094 0-5.189-2.154-5.189-5.164 0-2.937 2.144-5.237 5.092-5.237 1.486 0 2.704 0.587 3.265 1.297v-1.126h2.12v6.534c0 1.126 0.39 1.835 1.535 1.835 1.34 0 2.388-1.786 2.388-4.601 0-4.943-3.411-7.978-8.771-7.978-5.677 0-9.039 4.185-9.039 9.201 0 5.555 3.898 9.103 9.623 9.103 2.68 0 4.848-1.003 6.383-2.349l1.121 1.37c-1.437 1.444-4.166 2.839-7.553 2.839-7.358 0-11.719-4.748-11.719-10.914 0-6.412 4.629-11.086 11.256-11.086 6.797 0 10.744 4.283 10.744 9.715 0 4.209-1.998 6.534-4.653 6.534-1.657 0-2.509-0.832-2.826-1.762zM8.75 12.011c0 1.747 1.19 2.989 2.929 2.989s3.071-1.149 3.071-2.989c0-1.839-1.357-3.011-3.095-3.011s-2.905 1.241-2.905 3.011z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-notifications-muted" viewBox="0 0 24 24">
+        <title>aoc-notifications-muted</title>
+        <path
+          d="M13 4.071c3.392 0.485 6 3.403 6 6.929v5l2 1v2h-18v-2l2-1v-5c0-3.526 2.608-6.444 6-6.929v-1.071c0-0.552 0.448-1 1-1s1 0.448 1 1v1.071zM10 20h4c0 1.105-0.895 2-2 2s-2-0.895-2-2zM13.407 11.993l2.828-2.828-1.414-1.414-2.828 2.828-2.828-2.828-1.414 1.414 2.828 2.828-2.828 2.828 1.414 1.414 2.828-2.828 2.828 2.828 1.414-1.414-2.828-2.828z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-notifications-tracking" viewBox="0 0 24 24">
+        <title>aoc-notifications-tracking</title>
+        <path
+          d="M19 9.9c0.323 0.066 0.658 0.1 1 0.1s0.677-0.034 1-0.1v10.1c0 1.105-0.895 2-2 2h-14c-1.105 0-2-0.895-2-2v-14c0-1.105 0.895-2 2-2h10.1c-0.066 0.323-0.1 0.658-0.1 1s0.034 0.677 0.1 1h-10.1v14h14v-10.1zM20 8c-1.657 0-3-1.343-3-3s1.343-3 3-3c1.657 0 3 1.343 3 3s-1.343 3-3 3z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-open-in-new" viewBox="0 0 24 24">
+        <title>aoc-open-in-new</title>
+        <path
+          d="M19 19h-14v-14h7v-2h-7c-1.11 0-2 0.9-2 2v14c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-pencil" viewBox="0 0 24 24">
+        <title>aoc-pencil</title>
+        <path
+          d="M3 17.25v3.75h3.75l11.060-11.060-3.75-3.75-11.060 11.060zM20.71 7.040c0.39-0.39 0.39-1.020 0-1.41l-2.34-2.34c-0.39-0.39-1.020-0.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-person" viewBox="0 0 24 24">
+        <title>aoc-person</title>
+        <path
+          d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4c-2.21 0-4 1.79-4 4s1.79 4 4 4v0zM12 14c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-pinned" viewBox="0 0 24 24">
+        <title>aoc-pinned</title>
+        <path
+          d="M6.515 16.077l-4.223-4.223c1.774-1.774 4.266-2.391 6.541-1.853l5.516-4.667c-0.493-1.098-0.288-2.433 0.614-3.335l7.039 7.039c-0.902 0.902-2.236 1.106-3.335 0.614l-4.667 5.516c0.539 2.274-0.079 4.767-1.852 6.541l-4.223-4.223-4.223 4.223c-0.389 0.389-1.019 0.389-1.408 0s-0.389-1.019 0-1.408l4.223-4.223z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-plane-takeoff" viewBox="0 0 24 24">
+        <title>aoc-plane-takeoff</title>
+        <path
+          d="M2.5 19h19v2h-19v-2zM22.070 9.64c-0.21-0.8-1.040-1.28-1.84-1.060l-5.31 1.42-6.9-6.43-1.93 0.51 4.14 7.17-4.97 1.33-1.97-1.54-1.45 0.39 1.82 3.16 0.77 1.33 1.6-0.43 14.97-4c0.81-0.23 1.28-1.050 1.070-1.85v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-plane" viewBox="0 0 24 24">
+        <title>aoc-plane</title>
+        <path
+          d="M21 16v-2l-8-5v-5.5c0-0.83-0.67-1.5-1.5-1.5s-1.5 0.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-print" viewBox="0 0 24 24">
+        <title>aoc-print</title>
+        <path
+          d="M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3v0zM16 19h-8v-5h8v5zM19 12c-0.55 0-1-0.45-1-1s0.45-1 1-1c0.55 0 1 0.45 1 1s-0.45 1-1 1v0zM18 3h-12v4h12v-4z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-reply" viewBox="0 0 24 24">
+        <title>aoc-reply</title>
+        <path d="M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11v0z"></path>
+      </symbol>
+      <symbol id="icon-aoc-search" viewBox="0 0 24 24">
+        <title>aoc-search</title>
+        <path
+          d="M15.5 14h-0.79l-0.28-0.27c0.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5c0 3.59 2.91 6.5 6.5 6.5 1.61 0 3.090-0.59 4.23-1.57l0.27 0.28v0.79l5 4.99 1.49-1.49-4.99-5zM9.5 14c-2.49 0-4.5-2.010-4.5-4.5s2.010-4.5 4.5-4.5c2.49 0 4.5 2.010 4.5 4.5s-2.010 4.5-4.5 4.5v0z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-shuffle" viewBox="0 0 24 24">
+        <title>aoc-shuffle</title>
+        <path
+          d="M10.59 9.17l-5.18-5.17-1.41 1.41 5.17 5.17 1.42-1.41zM14.5 4l2.040 2.040-12.54 12.55 1.41 1.41 12.55-12.54 2.040 2.040v-5.5h-5.5zM14.83 13.41l-1.41 1.41 3.13 3.13-2.050 2.050h5.5v-5.5l-2.040 2.040-3.13-3.13z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-star" viewBox="0 0 24 24">
+        <title>aoc-star</title>
+        <path
+          d="M18.18 21l-1.635-7.029 5.455-4.727-7.191-0.617-2.809-6.627-2.809 6.627-7.191 0.617 5.455 4.727-1.635 7.029 6.18-3.728z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-subject" viewBox="0 0 24 24">
+        <title>aoc-subject</title>
+        <path d="M14 17h-10v2h10v-2zM20 9h-16v2h16v-2zM4 15h16v-2h-16v2zM4 5v2h16v-2h-16z"></path>
+      </symbol>
+      <symbol id="icon-aoc-trip-style" viewBox="0 0 24 24">
+        <title>aoc-trip-style</title>
+        <path
+          d="M20 6c1.11 0 2 0.89 2 2v11c0 1.11-0.89 2-2 2h-16c-1.11 0-2-0.89-2-2l0.010-11c0-1.11 0.88-2 1.99-2h4v-2c0-1.11 0.89-2 2-2h4c1.11 0 2 0.89 2 2v2h4zM14 6v-2h-4v2h4zM6.5 14c0.828 0 1.5-0.672 1.5-1.5s-0.672-1.5-1.5-1.5c-0.828 0-1.5 0.672-1.5 1.5s0.672 1.5 1.5 1.5zM6 16.042l0.347 1.97 5.909-1.042-0.347-1.97-5.909 1.042z">
+        </path>
+      </symbol>
+      <symbol id="icon-aoc-unpinned" viewBox="0 0 24 24">
+        <title>aoc-unpinned</title>
+        <path
+          d="M5.416 12.15l6.433 6.433c0.362-0.93 0.439-1.959 0.203-2.955l-0.233-0.982 5.94-7.020-1.386-1.386-7.020 5.94-0.982-0.233c-0.996-0.236-2.025-0.16-2.955 0.203zM6.515 16.077l-4.223-4.223c1.774-1.774 4.266-2.391 6.541-1.853l5.516-4.667c-0.493-1.098-0.288-2.433 0.614-3.335l7.039 7.039c-0.902 0.902-2.236 1.106-3.335 0.614l-4.667 5.516c0.539 2.274-0.079 4.767-1.852 6.541l-4.223-4.223-4.223 4.223c-0.389 0.389-1.019 0.389-1.408 0s-0.389-1.019 0-1.408l4.223-4.223z">
+        </path>
+      </symbol>
+    </defs>
+  </svg>
+</body>
+<svg aria-hidden="true" style="position: absolute; width: 0; height: 0; overflow: hidden;" version="1.1"
+  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <defs>
+    <symbol id="icon-aoc-cancel" viewBox="0 0 24 24">
+      <title>aoc-cancel</title>
+      <path
+        d="M12 2c-5.53 0-10 4.47-10 10s4.47 10 10 10c5.53 0 10-4.47 10-10s-4.47-10-10-10v0zM17 15.59l-1.41 1.41-3.59-3.59-3.59 3.59-1.41-1.41 3.59-3.59-3.59-3.59 1.41-1.41 3.59 3.59 3.59-3.59 1.41 1.41-3.59 3.59 3.59 3.59z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-video" viewBox="0 0 24 24">
+      <title>aoc-video</title>
+      <path
+        d="M10 16.5l6-4.5-6-4.5v9zM12 2c-5.52 0-10 4.48-10 10s4.48 10 10 10c5.52 0 10-4.48 10-10s-4.48-10-10-10v0zM12 20c-4.41 0-8-3.59-8-8s3.59-8 8-8c4.41 0 8 3.59 8 8s-3.59 8-8 8v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-building" viewBox="0 0 24 24">
+      <title>aoc-building</title>
+      <path
+        d="M16 8.050c-0.096 0.098-0.187 0.202-0.272 0.312-1.061 0.455-1.911 1.305-2.366 2.366-0.129 0.099-0.25 0.207-0.362 0.322v-0.050h-2v2h1.036c-0.024 0.164-0.036 0.331-0.036 0.5 0 1.883 1.487 3.419 3.351 3.497 0.2 0.177 0.418 0.334 0.649 0.468v4.535h-5v-6h-4v6h-5v-20h14v6.050zM5 11v2h2v-2h-2zM5 7v2h2v-2h-2zM8 7v2h2v-2h-2zM8 11v2h2v-2h-2zM11 7v2h2v-2h-2zM17 16.829c-0.485-0.171-0.913-0.464-1.247-0.842-0.083 0.008-0.167 0.013-0.253 0.013-1.381 0-2.5-1.119-2.5-2.5 0-0.898 0.474-1.686 1.185-2.127 0.349-1.027 1.161-1.839 2.188-2.188 0.441-0.711 1.228-1.185 2.127-1.185 1.381 0 2.5 1.119 2.5 2.5 0 0.185-0.020 0.365-0.058 0.539 1.17 0.209 2.058 1.231 2.058 2.461 0 1.381-1.119 2.5-2.5 2.5-0.085 0-0.17-0.004-0.253-0.013-0.334 0.378-0.762 0.67-1.247 0.842v5.171h-2v-5.171z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-clock" viewBox="0 0 24 24">
+      <title>aoc-clock</title>
+      <path
+        d="M11.99 2c5.53 0 10.010 4.48 10.010 10s-4.48 10-10.010 10c-5.52 0-9.99-4.48-9.99-10s4.47-10 9.99-10zM13 11.423v-5.423c0-0.552-0.448-1-1-1s-1 0.448-1 1v6.577l3.964 2.289c0.478 0.276 1.090 0.112 1.366-0.366s0.112-1.090-0.366-1.366l-2.964-1.711z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-clipboard" viewBox="0 0 19 24">
+      <title>aoc-clipboard</title>
+      <path
+        d="M12.984 2.4c-0.504-1.392-1.824-2.4-3.384-2.4s-2.88 1.008-3.384 2.4h-3.816c-1.32 0-2.4 1.080-2.4 2.4v16.8c0 1.32 1.080 2.4 2.4 2.4h14.4c1.32 0 2.4-1.080 2.4-2.4v-16.8c0-1.32-1.080-2.4-2.4-2.4h-3.816zM10.8 3.6c0 0.66-0.54 1.2-1.2 1.2s-1.2-0.54-1.2-1.2c0-0.66 0.54-1.2 1.2-1.2s1.2 0.54 1.2 1.2zM4.804 20.4c-0.665 0-1.204-0.533-1.204-1.2v0c0-0.663 0.525-1.2 1.204-1.2h5.993c0.665 0 1.204 0.533 1.204 1.2v0c0 0.663-0.525 1.2-1.204 1.2h-5.993zM4.794 15.6c-0.66 0-1.194-0.533-1.194-1.2v0c0-0.663 0.547-1.2 1.194-1.2h9.611c0.66 0 1.194 0.533 1.194 1.2v0c0 0.663-0.547 1.2-1.194 1.2h-9.611zM4.794 10.8c-0.66 0-1.194-0.533-1.194-1.2v0c0-0.663 0.547-1.2 1.194-1.2h9.611c0.66 0 1.194 0.533 1.194 1.2v0c0 0.663-0.547 1.2-1.194 1.2h-9.611z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-help" viewBox="0 0 24 24">
+      <title>aoc-help</title>
+      <path
+        d="M12 1c6.072 0 11 4.928 11 11s-4.928 11-11 11c-6.072 0-11-4.928-11-11s4.928-11 11-11zM12 19.5c0.69 0 1.25-0.56 1.25-1.25s-0.56-1.25-1.25-1.25c-0.69 0-1.25 0.56-1.25 1.25s0.56 1.25 1.25 1.25zM7.6 8.7c0 0.608 0.492 1.1 1.1 1.1s1.1-0.492 1.1-1.1c0-1.21 0.99-2.2 2.2-2.2s2.2 0.99 2.2 2.2c0 0.605-0.242 1.155-0.649 1.551l-1.364 1.386c-0.67 0.679-1.285 1.592-1.285 2.563h-0.002c0 0.608 0.492 1.1 1.1 1.1s1.1-0.492 1.1-1.1c0.067-1.003 0.7-1.417 1.287-2.013l0.99-1.012c0.627-0.627 1.023-1.507 1.023-2.475 0-2.431-1.969-4.4-4.4-4.4s-4.4 1.969-4.4 4.4z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-arrow-right" viewBox="0 0 24 24">
+      <title>aoc-arrow-right</title>
+      <path d="M9.295 7.115l1.41-1.41 6 6-6 6-1.41-1.41 4.58-4.59z"></path>
+    </symbol>
+    <symbol id="icon-aoc-arrow-left" viewBox="0 0 24 24">
+      <title>aoc-arrow-left</title>
+      <path d="M7.295 11.705l6-6 1.41 1.41-4.58 4.59 4.58 4.59-1.41 1.41z"></path>
+    </symbol>
+    <symbol id="icon-aoc-ticket" viewBox="0 0 24 24">
+      <title>aoc-ticket</title>
+      <path
+        d="M19.778 12.707l-8.485-8.485 2.828-2.828c0.391-0.391 1.024-0.391 1.414 0l2.311 2.311c-0.005 0.004-0.009 0.009-0.013 0.013-0.71 0.71-0.743 1.828-0.073 2.498s1.788 0.637 2.498-0.073c0.004-0.004 0.009-0.009 0.013-0.013l2.336 2.336c0.391 0.391 0.391 1.024 0 1.414l-2.828 2.828zM19.071 13.414l-9.192 9.192c-0.391 0.391-1.024 0.391-1.414 0l-2.336-2.336c0.697-0.711 0.725-1.819 0.060-2.484s-1.774-0.637-2.484 0.060l-2.311-2.311c-0.391-0.391-0.391-1.024 0-1.414l9.192-9.192 8.485 8.485zM5.636 14.121c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l4.95-4.95c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-4.95 4.95zM8.464 16.95c-0.391 0.391-0.391 1.024 0 1.414s1.024 0.391 1.414 0l4.95-4.95c0.391-0.391 0.391-1.024 0-1.414s-1.024-0.391-1.414 0l-4.95 4.95z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-place-entry" viewBox="0 0 24 24">
+      <title>aoc-place-entry</title>
+      <path
+        d="M18 8c0-3.31-2.69-6-6-6s-6 2.69-6 6c0 4.5 6 11 6 11s6-6.5 6-11v0zM10 8c0-1.1 0.9-2 2-2s2 0.9 2 2c0 1.1-0.89 2-2 2-1.1 0-2-0.9-2-2v0zM5 20v2h14v-2h-14z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-facebook" viewBox="0 0 24 24">
+      <title>aoc-facebook</title>
+      <path
+        d="M20.895 2h-17.789c-0.61 0-1.105 0.495-1.105 1.105v17.789c0 0.61 0.495 1.105 1.105 1.105h9.579v-7.719h-2.614v-3.042h2.6v-2.221c0-2.586 1.575-3.993 3.881-3.993 0.783 0.002 1.566 0.047 2.344 0.133v2.698h-1.593c-1.253 0-1.495 0.593-1.495 1.467v1.93h3l-0.389 3.028h-2.611v7.719h5.088c0.61 0 1.105-0.495 1.105-1.105v-17.789c0-0.61-0.495-1.105-1.105-1.105z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-instagram" viewBox="0 0 24 24">
+      <title>aoc-instagram</title>
+      <path
+        d="M12 2c2.716 0 3.056 0.012 4.123 0.060 1.064 0.049 1.791 0.218 2.427 0.465 0.658 0.256 1.215 0.597 1.771 1.153s0.898 1.114 1.153 1.771c0.247 0.636 0.416 1.363 0.465 2.427 0.049 1.067 0.060 1.407 0.060 4.123s-0.012 3.056-0.060 4.123c-0.049 1.064-0.218 1.791-0.465 2.427-0.256 0.658-0.597 1.215-1.153 1.771s-1.114 0.898-1.771 1.153c-0.636 0.247-1.363 0.416-2.427 0.465-1.067 0.049-1.407 0.060-4.123 0.060s-3.056-0.012-4.123-0.060c-1.064-0.049-1.791-0.218-2.427-0.465-0.658-0.256-1.215-0.597-1.771-1.153s-0.898-1.114-1.153-1.771c-0.247-0.636-0.416-1.363-0.465-2.427-0.049-1.067-0.060-1.407-0.060-4.123s0.012-3.056 0.060-4.123c0.049-1.064 0.218-1.791 0.465-2.427 0.256-0.658 0.597-1.215 1.153-1.771s1.114-0.898 1.771-1.153c0.636-0.247 1.363-0.416 2.427-0.465 1.067-0.049 1.407-0.060 4.123-0.060zM12 3.802c-2.67 0-2.986 0.010-4.041 0.058-0.975 0.044-1.504 0.207-1.857 0.344-0.467 0.181-0.8 0.398-1.15 0.748s-0.567 0.683-0.748 1.15c-0.137 0.352-0.3 0.882-0.344 1.857-0.048 1.054-0.058 1.371-0.058 4.041s0.010 2.986 0.058 4.041c0.044 0.975 0.207 1.504 0.344 1.857 0.181 0.467 0.398 0.8 0.748 1.15s0.683 0.567 1.15 0.748c0.352 0.137 0.882 0.3 1.857 0.344 1.054 0.048 1.371 0.058 4.041 0.058s2.987-0.010 4.041-0.058c0.975-0.044 1.504-0.207 1.857-0.344 0.467-0.181 0.8-0.398 1.15-0.748s0.567-0.683 0.748-1.15c0.137-0.352 0.3-0.882 0.344-1.857 0.048-1.054 0.058-1.371 0.058-4.041s-0.010-2.986-0.058-4.041c-0.044-0.975-0.207-1.504-0.344-1.857-0.181-0.467-0.398-0.8-0.748-1.15s-0.683-0.567-1.15-0.748c-0.352-0.137-0.882-0.3-1.857-0.344-1.054-0.048-1.371-0.058-4.041-0.058zM12 6.865c2.836 0 5.135 2.299 5.135 5.135s-2.299 5.135-5.135 5.135c-2.836 0-5.135-2.299-5.135-5.135s2.299-5.135 5.135-5.135zM12 15.333c1.841 0 3.333-1.492 3.333-3.333s-1.492-3.333-3.333-3.333c-1.841 0-3.333 1.492-3.333 3.333s1.492 3.333 3.333 3.333zM18.538 6.662c0 0.663-0.537 1.2-1.2 1.2s-1.2-0.537-1.2-1.2 0.537-1.2 1.2-1.2c0.663 0 1.2 0.537 1.2 1.2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-reddit" viewBox="0 0 24 24">
+      <title>aoc-reddit</title>
+      <path
+        d="M22.999 12.034c0-1.397-1.137-2.534-2.534-2.534-0.621 0-1.208 0.225-1.67 0.632-1.648-1.054-3.834-1.732-6.252-1.823l1.441-4.096 3.601 0.861c0.002 1.139 0.929 2.065 2.069 2.065 1.141 0 2.069-0.928 2.069-2.069s-0.929-2.069-2.069-2.069c-0.866 0-1.609 0.536-1.917 1.292l-4.265-1.020-1.771 5.030c-2.519 0.048-4.803 0.729-6.512 1.816-0.46-0.399-1.040-0.618-1.655-0.618-1.397 0-2.534 1.137-2.534 2.534 0 0.864 0.445 1.661 1.166 2.126-0.044 0.253-0.069 0.509-0.069 0.77 0 3.658 4.434 6.634 9.884 6.634s9.884-2.976 9.884-6.634c0-0.253-0.023-0.502-0.064-0.748 0.74-0.461 1.199-1.27 1.199-2.148l-0.001-0.001zM7.283 13.759c0-0.86 0.697-1.557 1.558-1.557 0.86 0 1.557 0.697 1.557 1.557 0 0.86-0.697 1.557-1.557 1.557-0.861 0-1.558-0.697-1.558-1.557zM15.652 17.971c-0.046 0.049-1.164 1.185-3.689 1.185-2.538 0-3.554-1.153-3.595-1.202-0.143-0.167-0.124-0.419 0.044-0.562 0.166-0.142 0.415-0.124 0.559 0.041 0.023 0.025 0.87 0.926 2.993 0.926 2.16 0 3.107-0.933 3.116-0.942 0.153-0.156 0.404-0.16 0.562-0.006s0.162 0.401 0.011 0.56l0.001-0.001zM15.342 15.316c-0.861 0-1.558-0.697-1.558-1.557s0.697-1.557 1.558-1.557c0.86 0 1.557 0.697 1.557 1.557 0 0.86-0.697 1.557-1.557 1.557z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-rss" viewBox="0 0 24 24">
+      <title>aoc-rss</title>
+      <path
+        d="M3 2c-0.552 0-1 0.448-1 1v18c0 0.552 0.448 1 1 1h18c0.552 0 1-0.448 1-1v-18c0-0.552-0.448-1-1-1h-18zM14.083 18.25h-2.381c0-3.282-2.671-5.952-5.953-5.952v-2.381c4.595 0 8.333 3.738 8.333 8.333zM18.25 18.25h-2.381c0-5.58-4.539-10.119-10.119-10.119v-2.381c6.892 0 12.5 5.608 12.5 12.5zM5.75 16.464c0-0.986 0.8-1.786 1.786-1.786s1.786 0.8 1.786 1.786c0 0.986-0.8 1.786-1.786 1.786s-1.786-0.8-1.786-1.786z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-twitter" viewBox="0 0 24 24">
+      <title>aoc-twitter</title>
+      <path
+        d="M23 6.072c-0.772 0.351-1.602 0.589-2.474 0.695 0.89-0.546 1.573-1.412 1.895-2.443-0.833 0.506-1.754 0.873-2.738 1.071-0.784-0.858-1.904-1.394-3.144-1.394-2.378 0-4.307 1.978-4.307 4.418 0 0.346 0.037 0.683 0.111 1.006-3.581-0.185-6.755-1.941-8.881-4.617-0.371 0.655-0.583 1.414-0.583 2.223 0 1.532 0.761 2.884 1.917 3.677-0.705-0.021-1.371-0.222-1.952-0.551v0.054c0 2.141 1.485 3.927 3.457 4.332-0.361 0.104-0.742 0.155-1.135 0.155-0.277 0-0.549-0.027-0.811-0.078 0.549 1.754 2.139 3.032 4.024 3.066-1.474 1.186-3.333 1.892-5.351 1.892-0.348 0-0.692-0.020-1.028-0.061 1.907 1.251 4.172 1.983 6.604 1.983 7.926 0 12.258-6.731 12.258-12.569 0-0.192-0.004-0.384-0.011-0.573 0.842-0.623 1.573-1.401 2.148-2.287z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-accommodation" viewBox="0 0 24 24">
+      <title>aoc-accommodation</title>
+      <path
+        d="M23 12v1h-17c-0.552 0-1-0.448-1-1s0.448-1 1-1h4v-2.834c0-0.552 0.448-1 1-1 0.051 0 0.102 0.004 0.152 0.012l11 1.692c0.488 0.075 0.848 0.495 0.848 0.988v2.142zM4 14h19v6h-3v-3h-16v3h-3v-15c0-0.552 0.448-1 1-1h1c0.552 0 1 0.448 1 1v9zM7 10c-1.105 0-2-0.895-2-2s0.895-2 2-2c1.105 0 2 0.895 2 2s-0.895 2-2 2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-activity-level" viewBox="0 0 24 24">
+      <title>aoc-activity-level</title>
+      <path
+        d="M22.994 17.99h-7.239c-0.366 0-0.72-0.134-0.994-0.377l-11.172-9.883 3.409-4.016c0.422-0.557 0.839-0.788 1.251-0.694 0.619 0.141 0.619 2.349 2.249 3.47 0.909 0.625 1.601 0.94 5 0.5 0.889 1.249 2.099 5.976 3.050 6.747s4.447 1.234 4.447 3.753v0.5zM22.994 18.99v1c0 0.552-0.448 1-1 1l-6.864-0c-0.73 0-1.435-0.266-1.983-0.749l-10.808-9.522c-0.409-0.36-0.454-0.982-0.101-1.397l0.704-0.829 11.157 9.87c0.457 0.404 1.046 0.628 1.656 0.628h7.239z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-add-a-photo" viewBox="0 0 24 24">
+      <title>aoc-add-a-photo</title>
+      <path
+        d="M3 4v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3zM6 10v-3h3v-3h7l1.83 2h3.17c1.1 0 2 0.9 2 2v12c0 1.1-0.9 2-2 2h-16c-1.1 0-2-0.9-2-2v-10h3zM13 19c2.76 0 5-2.24 5-5s-2.24-5-5-5c-2.76 0-5 2.24-5 5s2.24 5 5 5v0zM9.8 14c0 1.77 1.43 3.2 3.2 3.2s3.2-1.43 3.2-3.2c0-1.77-1.43-3.2-3.2-3.2s-3.2 1.43-3.2 3.2v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-add-box" viewBox="0 0 24 24">
+      <title>aoc-add-box</title>
+      <path
+        d="M19 3h-14c-1.11 0-2 0.9-2 2v14c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2v-14c0-1.1-0.9-2-2-2v0zM17 13h-4v4h-2v-4h-4v-2h4v-4h2v4h4v2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-add-shape" viewBox="0 0 24 24">
+      <title>aoc-add-shape</title>
+      <path d="M19 13h-6v6h-2v-6h-6v-2h6v-6h2v6h6z"></path>
+    </symbol>
+    <symbol id="icon-aoc-arrow-forward" viewBox="0 0 24 24">
+      <title>aoc-arrow-forward</title>
+      <path d="M12 4l-1.41 1.41 5.58 5.59h-12.17v2h12.17l-5.58 5.59 1.41 1.41 8-8z"></path>
+    </symbol>
+    <symbol id="icon-aoc-been-here" viewBox="0 0 24 24">
+      <title>aoc-been-here</title>
+      <path d="M7 20h-2l-1-16h2l1 16zM8.625 15l-0.625-10h12l-3 5 3 5h-11.375z"></path>
+    </symbol>
+    <symbol id="icon-aoc-chat-bubbles" viewBox="0 0 24 24">
+      <title>aoc-chat-bubbles</title>
+      <path
+        d="M21 6h-2v9h-13v2c0 0.55 0.45 1 1 1h11l4 4v-15c0-0.55-0.45-1-1-1v0zM17 12v-9c0-0.55-0.45-1-1-1h-13c-0.55 0-1 0.45-1 1v14l4-4h10c0.55 0 1-0.45 1-1v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-close" viewBox="0 0 24 24">
+      <title>aoc-close</title>
+      <path
+        d="M19 6.41l-1.41-1.41-5.59 5.59-5.59-5.59-1.41 1.41 5.59 5.59-5.59 5.59 1.41 1.41 5.59-5.59 5.59 5.59 1.41-1.41-5.59-5.59z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-expand-more" viewBox="0 0 24 24">
+      <title>aoc-expand-more</title>
+      <path d="M16.59 9l-4.59 4.58-4.59-4.58-1.41 1.41 6 6 6-6z"></path>
+    </symbol>
+    <symbol id="icon-aoc-expand-less" viewBox="0 0 24 24">
+      <title>aoc-expand-less</title>
+      <path d="M12 8l-6 6 1.41 1.41 4.59-4.58 4.59 4.58 1.41-1.41z"></path>
+    </symbol>
+    <symbol id="icon-aoc-forum-flag" viewBox="0 0 24 24">
+      <title>aoc-forum-flag</title>
+      <path
+        d="M6 15v6c0 0.552-0.448 1-1 1s-1-0.448-1-1v-18c0-0.552 0.448-1 1-1s1 0.448 1 1h14l-3 6 3 6h-14zM16.764 5h-10.764v8h10.764l-2-4 2-4z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-group-size" viewBox="0 0 24 24">
+      <title>aoc-group-size</title>
+      <path
+        d="M12 3c1.812 0 3.281 1.469 3.281 3.281s-1.469 3.281-3.281 3.281c-1.812 0-3.281-1.469-3.281-3.281s1.469-3.281 3.281-3.281zM6.292 10.178c-0.345 0.519-0.542 1.139-0.542 1.797v5.025h-4c-0.414 0-0.75-0.336-0.75-0.75v-5.266c0-0.688 0.468-1.288 1.136-1.455l0.71-0.178c0.582 0.63 1.416 1.024 2.341 1.024 0.388 0 0.76-0.069 1.104-0.197zM17.488 9.885c0.492 0.31 1.075 0.49 1.699 0.49 0.888 0 1.691-0.363 2.269-0.948l0.408 0.102c0.668 0.167 1.136 0.767 1.136 1.455v5.266c0 0.414-0.336 0.75-0.75 0.75h-4v-5.025c0-0.787-0.282-1.52-0.762-2.091zM19.188 9.375c-1.208 0-2.187-0.979-2.187-2.187s0.979-2.187 2.187-2.187c1.208 0 2.187 0.979 2.187 2.187s-0.979 2.187-2.187 2.187zM5.187 9.375c-1.208 0-2.187-0.979-2.187-2.187s0.979-2.187 2.187-2.187c1.208 0 2.187 0.979 2.187 2.187s-0.979 2.187-2.187 2.187zM9.279 9.587c0.74 0.61 1.688 0.976 2.721 0.976s1.981-0.366 2.721-0.976l0.824 0.206c1.002 0.25 1.704 1.15 1.704 2.183v6.9c0 0.621-0.504 1.125-1.125 1.125h-8.25c-0.621 0-1.125-0.504-1.125-1.125v-6.9c0-1.032 0.703-1.932 1.704-2.183l0.824-0.206z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-heart-outline" viewBox="0 0 24 24">
+      <title>aoc-heart-outline</title>
+      <path
+        d="M18.91 11.473c0.697-0.71 1.090-1.677 1.090-2.689s-0.394-1.979-1.091-2.689c-0.689-0.703-1.62-1.095-2.587-1.095s-1.897 0.393-2.587 1.095l-1.736 1.768-1.736-1.768c-1.433-1.46-3.741-1.46-5.174 0-1.454 1.481-1.454 3.897-0.031 5.347l6.941 6.765 6.91-6.734zM11.375 4.395l0.625 0.613 0.623-0.611c1.026-0.898 2.338-1.397 3.7-1.397 1.506 0 2.95 0.61 4.015 1.695s1.663 2.556 1.663 4.090-0.598 3.006-1.663 4.090l-8.337 8.125-8.337-8.125c-2.217-2.259-2.217-5.921 0-8.18 2.114-2.154 5.481-2.254 7.712-0.3z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-heart-solid" viewBox="0 0 24 24">
+      <title>aoc-heart-solid</title>
+      <path
+        d="M11.375 4.395l0.625 0.613 0.623-0.611c1.026-0.898 2.338-1.397 3.7-1.397 1.506 0 2.95 0.61 4.015 1.695s1.663 2.556 1.663 4.090-0.598 3.006-1.663 4.090l-8.337 8.125-8.337-8.125c-2.217-2.259-2.217-5.921 0-8.18 2.114-2.154 5.481-2.254 7.712-0.3z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-home" viewBox="0 0 24 24">
+      <title>aoc-home</title>
+      <path d="M15 22v-5c0-1.657-1.343-3-3-3s-3 1.343-3 3v5h-5v-11h-2v-1l9.995-8 10.005 8v1h-2v11h-5z"></path>
+    </symbol>
+    <symbol id="icon-aoc-important" viewBox="0 0 24 24">
+      <title>aoc-important</title>
+      <path
+        d="M21.775 18.469c0.641 1.125-0.164 2.531-1.444 2.531h-16.663c-1.283 0-2.083-1.408-1.444-2.531l8.331-14.626c0.641-1.125 2.247-1.123 2.887 0l8.331 14.626zM12 8c-0.552 0-1 0.448-1 1v5c0 0.552 0.448 1 1 1s1-0.448 1-1v-5c0-0.552-0.448-1-1-1zM12 19c0.552 0 1-0.448 1-1s-0.448-1-1-1c-0.552 0-1 0.448-1 1s0.448 1 1 1z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-knife-fork" viewBox="0 0 24 24">
+      <title>aoc-knife-fork</title>
+      <path
+        d="M9.25 2.75v4.625c0 0.345 0.28 0.625 0.625 0.625s0.625-0.28 0.625-0.625v-4.625c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75v6.25c0 1.306-0.835 2.417-2 2.829v8.671c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5v-8.671c-1.165-0.412-2-1.523-2-2.829v-6.25c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75v4.625c0 0.345 0.28 0.625 0.625 0.625s0.625-0.28 0.625-0.625v-4.625c0-0.414 0.336-0.75 0.75-0.75s0.75 0.336 0.75 0.75zM19 1v19.5c0 0.828-0.672 1.5-1.5 1.5s-1.5-0.672-1.5-1.5v-7.5h-1c-0.552 0-1-0.448-1-1v-6c0-2.761 2.239-5 5-5z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-library-books" viewBox="0 0 24 24">
+      <title>aoc-library-books</title>
+      <path
+        d="M4 6h-2v14c0 1.1 0.9 2 2 2h14v-2h-14v-14zM20 2h-12c-1.1 0-2 0.9-2 2v12c0 1.1 0.9 2 2 2h12c1.1 0 2-0.9 2-2v-12c0-1.1-0.9-2-2-2v0zM19 11h-10v-2h10v2zM15 15h-6v-2h6v2zM19 7h-10v-2h10v2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-link" viewBox="0 0 24 24">
+      <title>aoc-link</title>
+      <path
+        d="M9.937 12.2c0.441-0.33 1.067-0.24 1.397 0.201 0.542 0.724 1.372 1.178 2.274 1.242s1.788-0.266 2.428-0.906l2.451-2.451c1.187-1.229 1.171-3.173-0.032-4.377-1.201-1.201-3.146-1.221-4.355-0.053l-1.421 1.413c-0.391 0.389-1.023 0.387-1.412-0.004s-0.387-1.023 0.004-1.412l1.431-1.423c2.002-1.934 5.192-1.904 7.164 0.067 1.975 1.975 1.998 5.165 0.044 7.187l-2.463 2.463c-1.049 1.049-2.502 1.591-3.982 1.485s-2.841-0.85-3.73-2.038c-0.33-0.441-0.24-1.067 0.201-1.397zM14.425 12.152c-0.441 0.33-1.067 0.24-1.397-0.201-0.542-0.724-1.372-1.178-2.274-1.242s-1.788 0.266-2.428 0.906l-2.451 2.451c-1.187 1.229-1.171 3.173 0.032 4.377 1.201 1.201 3.145 1.221 4.352 0.056l1.414-1.414c0.39-0.39 1.022-0.39 1.412 0s0.39 1.022-0 1.412l-1.426 1.426c-2.002 1.933-5.191 1.903-7.163-0.068-1.975-1.975-1.998-5.165-0.044-7.187l2.463-2.463c1.049-1.049 2.502-1.591 3.982-1.485s2.841 0.85 3.73 2.038c0.33 0.441 0.24 1.067-0.201 1.397z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-list-circle-bullets" viewBox="0 0 24 24">
+      <title>aoc-list-circle-bullets</title>
+      <path
+        d="M4 10.5c-0.83 0-1.5 0.67-1.5 1.5s0.67 1.5 1.5 1.5c0.83 0 1.5-0.67 1.5-1.5s-0.67-1.5-1.5-1.5v0zM4 4.5c-0.83 0-1.5 0.67-1.5 1.5s0.67 1.5 1.5 1.5c0.83 0 1.5-0.67 1.5-1.5s-0.67-1.5-1.5-1.5v0zM4 16.5c-0.835 0-1.5 0.677-1.5 1.5s0.677 1.5 1.5 1.5c0.823 0 1.5-0.677 1.5-1.5s-0.665-1.5-1.5-1.5v0zM7 19h14v-2h-14v2zM7 13h14v-2h-14v2zM7 5v2h14v-2h-14z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-list" viewBox="0 0 24 24">
+      <title>aoc-list</title>
+      <path d="M3 13h2v-2h-2v2zM3 17h2v-2h-2v2zM3 9h2v-2h-2v2zM7 13h14v-2h-14v2zM7 17h14v-2h-14v2zM7 7v2h14v-2h-14z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-location-add" viewBox="0 0 24 24">
+      <title>aoc-location-add</title>
+      <path
+        d="M12 2c-3.86 0-7 3.14-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.86-3.14-7-7-7v0zM16 10h-3v3h-2v-3h-3v-2h3v-3h2v3h3v2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-location" viewBox="0 0 24 24">
+      <title>aoc-location</title>
+      <path
+        d="M12 2c-3.87 0-7 3.13-7 7 0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7v0zM12 11.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5c1.38 0 2.5 1.12 2.5 2.5s-1.12 2.5-2.5 2.5v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-mail" viewBox="0 0 24 24">
+      <title>aoc-mail</title>
+      <path
+        d="M20 4h-16c-1.1 0-1.99 0.9-1.99 2l-0.010 12c0 1.1 0.9 2 2 2h16c1.1 0 2-0.9 2-2v-12c0-1.1-0.9-2-2-2v0zM20 8l-8 5-8-5v-2l8 5 8-5v2z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-map" viewBox="0 0 24 24">
+      <title>aoc-map</title>
+      <path
+        d="M20.5 3l-0.16 0.030-5.34 2.070-6-2.1-5.64 1.9c-0.21 0.070-0.36 0.25-0.36 0.48v15.12c0 0.28 0.22 0.5 0.5 0.5l0.16-0.030 5.34-2.070 6 2.1 5.64-1.9c0.21-0.070 0.36-0.25 0.36-0.48v-15.12c0-0.28-0.22-0.5-0.5-0.5v0zM15 19l-6-2.11v-11.89l6 2.11v11.89z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-menu" viewBox="0 0 24 24">
+      <title>aoc-menu</title>
+      <path d="M3 5h18v2h-18v-2zM3 11h18v2h-18v-2zM3 17h18v2h-18v-2z"></path>
+    </symbol>
+    <symbol id="icon-aoc-more-horizontal" viewBox="0 0 24 24">
+      <title>aoc-more-horizontal</title>
+      <path
+        d="M6 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0zM18 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0zM12 10c-1.1 0-2 0.9-2 2s0.9 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-my-location" viewBox="0 0 24 24">
+      <title>aoc-my-location</title>
+      <path
+        d="M12 8c-2.21 0-4 1.79-4 4s1.79 4 4 4c2.21 0 4-1.79 4-4s-1.79-4-4-4v0zM20.94 11c-0.46-4.17-3.77-7.48-7.94-7.94v-2.060h-2v2.060c-4.17 0.46-7.48 3.77-7.94 7.94h-2.060v2h2.060c0.46 4.17 3.77 7.48 7.94 7.94v2.060h2v-2.060c4.17-0.46 7.48-3.77 7.94-7.94h2.060v-2h-2.060zM12 19c-3.87 0-7-3.13-7-7s3.13-7 7-7c3.87 0 7 3.13 7 7s-3.13 7-7 7v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-near-me" viewBox="0 0 24 24">
+      <title>aoc-near-me</title>
+      <path d="M21 3l-18 7.53v0.98l6.84 2.65 2.64 6.84h0.98z"></path>
+    </symbol>
+    <symbol id="icon-aoc-notifications-alert" viewBox="0 0 24 24">
+      <title>aoc-notifications-alert</title>
+      <path
+        d="M18.988 10.589c0.008 0.136 0.012 0.273 0.012 0.411v5l2 1v2h-18v-2l2-1v-5c0-3.526 2.608-6.444 6-6.929v-1.071c0-0.552 0.448-1 1-1s1 0.447 1 1c-0.628 0.836-1 1.875-1 3 0 2.761 2.239 5 5 5 0.707 0 1.379-0.147 1.988-0.411zM10 20h4c0 1.105-0.895 2-2 2s-2-0.895-2-2zM17 9c-1.657 0-3-1.343-3-3s1.343-3 3-3c1.657 0 3 1.343 3 3s-1.343 3-3 3z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-notifications-mentions" viewBox="0 0 24 24">
+      <title>aoc-notifications-mentions</title>
+      <path
+        d="M15.52 15.487c-0.585 0.857-1.949 1.786-3.776 1.786-3.094 0-5.189-2.154-5.189-5.164 0-2.937 2.144-5.237 5.092-5.237 1.486 0 2.704 0.587 3.265 1.297v-1.126h2.12v6.534c0 1.126 0.39 1.835 1.535 1.835 1.34 0 2.388-1.786 2.388-4.601 0-4.943-3.411-7.978-8.771-7.978-5.677 0-9.039 4.185-9.039 9.201 0 5.555 3.898 9.103 9.623 9.103 2.68 0 4.848-1.003 6.383-2.349l1.121 1.37c-1.437 1.444-4.166 2.839-7.553 2.839-7.358 0-11.719-4.748-11.719-10.914 0-6.412 4.629-11.086 11.256-11.086 6.797 0 10.744 4.283 10.744 9.715 0 4.209-1.998 6.534-4.653 6.534-1.657 0-2.509-0.832-2.826-1.762zM8.75 12.011c0 1.747 1.19 2.989 2.929 2.989s3.071-1.149 3.071-2.989c0-1.839-1.357-3.011-3.095-3.011s-2.905 1.241-2.905 3.011z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-notifications-muted" viewBox="0 0 24 24">
+      <title>aoc-notifications-muted</title>
+      <path
+        d="M13 4.071c3.392 0.485 6 3.403 6 6.929v5l2 1v2h-18v-2l2-1v-5c0-3.526 2.608-6.444 6-6.929v-1.071c0-0.552 0.448-1 1-1s1 0.448 1 1v1.071zM10 20h4c0 1.105-0.895 2-2 2s-2-0.895-2-2zM13.407 11.993l2.828-2.828-1.414-1.414-2.828 2.828-2.828-2.828-1.414 1.414 2.828 2.828-2.828 2.828 1.414 1.414 2.828-2.828 2.828 2.828 1.414-1.414-2.828-2.828z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-notifications-tracking" viewBox="0 0 24 24">
+      <title>aoc-notifications-tracking</title>
+      <path
+        d="M19 9.9c0.323 0.066 0.658 0.1 1 0.1s0.677-0.034 1-0.1v10.1c0 1.105-0.895 2-2 2h-14c-1.105 0-2-0.895-2-2v-14c0-1.105 0.895-2 2-2h10.1c-0.066 0.323-0.1 0.658-0.1 1s0.034 0.677 0.1 1h-10.1v14h14v-10.1zM20 8c-1.657 0-3-1.343-3-3s1.343-3 3-3c1.657 0 3 1.343 3 3s-1.343 3-3 3z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-open-in-new" viewBox="0 0 24 24">
+      <title>aoc-open-in-new</title>
+      <path
+        d="M19 19h-14v-14h7v-2h-7c-1.11 0-2 0.9-2 2v14c0 1.1 0.89 2 2 2h14c1.1 0 2-0.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41 9.83-9.83v3.59h2v-7h-7z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-pencil" viewBox="0 0 24 24">
+      <title>aoc-pencil</title>
+      <path
+        d="M3 17.25v3.75h3.75l11.060-11.060-3.75-3.75-11.060 11.060zM20.71 7.040c0.39-0.39 0.39-1.020 0-1.41l-2.34-2.34c-0.39-0.39-1.020-0.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-person" viewBox="0 0 24 24">
+      <title>aoc-person</title>
+      <path
+        d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4c-2.21 0-4 1.79-4 4s1.79 4 4 4v0zM12 14c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-pinned" viewBox="0 0 24 24">
+      <title>aoc-pinned</title>
+      <path
+        d="M6.515 16.077l-4.223-4.223c1.774-1.774 4.266-2.391 6.541-1.853l5.516-4.667c-0.493-1.098-0.288-2.433 0.614-3.335l7.039 7.039c-0.902 0.902-2.236 1.106-3.335 0.614l-4.667 5.516c0.539 2.274-0.079 4.767-1.852 6.541l-4.223-4.223-4.223 4.223c-0.389 0.389-1.019 0.389-1.408 0s-0.389-1.019 0-1.408l4.223-4.223z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-plane-takeoff" viewBox="0 0 24 24">
+      <title>aoc-plane-takeoff</title>
+      <path
+        d="M2.5 19h19v2h-19v-2zM22.070 9.64c-0.21-0.8-1.040-1.28-1.84-1.060l-5.31 1.42-6.9-6.43-1.93 0.51 4.14 7.17-4.97 1.33-1.97-1.54-1.45 0.39 1.82 3.16 0.77 1.33 1.6-0.43 14.97-4c0.81-0.23 1.28-1.050 1.070-1.85v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-plane" viewBox="0 0 24 24">
+      <title>aoc-plane</title>
+      <path
+        d="M21 16v-2l-8-5v-5.5c0-0.83-0.67-1.5-1.5-1.5s-1.5 0.67-1.5 1.5v5.5l-8 5v2l8-2.5v5.5l-2 1.5v1.5l3.5-1 3.5 1v-1.5l-2-1.5v-5.5l8 2.5z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-print" viewBox="0 0 24 24">
+      <title>aoc-print</title>
+      <path
+        d="M19 8h-14c-1.66 0-3 1.34-3 3v6h4v4h12v-4h4v-6c0-1.66-1.34-3-3-3v0zM16 19h-8v-5h8v5zM19 12c-0.55 0-1-0.45-1-1s0.45-1 1-1c0.55 0 1 0.45 1 1s-0.45 1-1 1v0zM18 3h-12v4h12v-4z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-reply" viewBox="0 0 24 24">
+      <title>aoc-reply</title>
+      <path d="M10 9v-4l-7 7 7 7v-4.1c5 0 8.5 1.6 11 5.1-1-5-4-10-11-11v0z"></path>
+    </symbol>
+    <symbol id="icon-aoc-search" viewBox="0 0 24 24">
+      <title>aoc-search</title>
+      <path
+        d="M15.5 14h-0.79l-0.28-0.27c0.98-1.14 1.57-2.62 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 2.91-6.5 6.5c0 3.59 2.91 6.5 6.5 6.5 1.61 0 3.090-0.59 4.23-1.57l0.27 0.28v0.79l5 4.99 1.49-1.49-4.99-5zM9.5 14c-2.49 0-4.5-2.010-4.5-4.5s2.010-4.5 4.5-4.5c2.49 0 4.5 2.010 4.5 4.5s-2.010 4.5-4.5 4.5v0z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-shuffle" viewBox="0 0 24 24">
+      <title>aoc-shuffle</title>
+      <path
+        d="M10.59 9.17l-5.18-5.17-1.41 1.41 5.17 5.17 1.42-1.41zM14.5 4l2.040 2.040-12.54 12.55 1.41 1.41 12.55-12.54 2.040 2.040v-5.5h-5.5zM14.83 13.41l-1.41 1.41 3.13 3.13-2.050 2.050h5.5v-5.5l-2.040 2.040-3.13-3.13z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-star" viewBox="0 0 24 24">
+      <title>aoc-star</title>
+      <path
+        d="M18.18 21l-1.635-7.029 5.455-4.727-7.191-0.617-2.809-6.627-2.809 6.627-7.191 0.617 5.455 4.727-1.635 7.029 6.18-3.728z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-subject" viewBox="0 0 24 24">
+      <title>aoc-subject</title>
+      <path d="M14 17h-10v2h10v-2zM20 9h-16v2h16v-2zM4 15h16v-2h-16v2zM4 5v2h16v-2h-16z"></path>
+    </symbol>
+    <symbol id="icon-aoc-trip-style" viewBox="0 0 24 24">
+      <title>aoc-trip-style</title>
+      <path
+        d="M20 6c1.11 0 2 0.89 2 2v11c0 1.11-0.89 2-2 2h-16c-1.11 0-2-0.89-2-2l0.010-11c0-1.11 0.88-2 1.99-2h4v-2c0-1.11 0.89-2 2-2h4c1.11 0 2 0.89 2 2v2h4zM14 6v-2h-4v2h4zM6.5 14c0.828 0 1.5-0.672 1.5-1.5s-0.672-1.5-1.5-1.5c-0.828 0-1.5 0.672-1.5 1.5s0.672 1.5 1.5 1.5zM6 16.042l0.347 1.97 5.909-1.042-0.347-1.97-5.909 1.042z">
+      </path>
+    </symbol>
+    <symbol id="icon-aoc-unpinned" viewBox="0 0 24 24">
+      <title>aoc-unpinned</title>
+      <path
+        d="M5.416 12.15l6.433 6.433c0.362-0.93 0.439-1.959 0.203-2.955l-0.233-0.982 5.94-7.020-1.386-1.386-7.020 5.94-0.982-0.233c-0.996-0.236-2.025-0.16-2.955 0.203zM6.515 16.077l-4.223-4.223c1.774-1.774 4.266-2.391 6.541-1.853l5.516-4.667c-0.493-1.098-0.288-2.433 0.614-3.335l7.039 7.039c-0.902 0.902-2.236 1.106-3.335 0.614l-4.667 5.516c0.539 2.274-0.079 4.767-1.852 6.541l-4.223-4.223-4.223 4.223c-0.389 0.389-1.019 0.389-1.408 0s-0.389-1.019 0-1.408l4.223-4.223z">
+      </path>
+    </symbol>
+  </defs>
+</svg>
+
+</html>
\ No newline at end of file
index 087bdbcc2b8a77d08c809595c1040e50fdb81c0f..37f8bb80075cd9ebd03beb4a18d8e671e9a5f93a 100644 (file)
@@ -119,7 +119,20 @@ defmodule Pleroma.FormatterTest do
     end
   end
 
-  describe "add_user_links" do
+  describe "Formatter.linkify" do
+    test "correctly finds mentions that contain the domain name" do
+      _user = insert(:user, %{nickname: "lain"})
+      _remote_user = insert(:user, %{nickname: "lain@lain.com", local: false})
+
+      text = "hey @lain@lain.com what's up"
+
+      {_text, mentions, []} = Formatter.linkify(text)
+      [{username, user}] = mentions
+
+      assert username == "@lain@lain.com"
+      assert user.nickname == "lain@lain.com"
+    end
+
     test "gives a replacement for user links, using local nicknames in user links text" do
       text = "@gsimg According to @archa_eme_, that is @daggsy. Also hello @archaeme@archae.me"
       gsimg = insert(:user, %{nickname: "gsimg"})
index 9b4e6f0bf6767299d03335a45fb13b613e5d5b53..c6b2bc399cc7e5748c5ce35ab6df4cff64ef04a1 100644 (file)
@@ -177,6 +177,39 @@ defmodule Pleroma.ObjectTest do
 
       assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
     end
+
+    test "With custom base_url" do
+      Pleroma.Config.put([Pleroma.Upload, :uploader], Pleroma.Uploaders.Local)
+      Pleroma.Config.put([Pleroma.Upload, :base_url], "https://sub.domain.tld/dir/")
+
+      file = %Plug.Upload{
+        content_type: "image/jpg",
+        path: Path.absname("test/fixtures/image.jpg"),
+        filename: "an_image.jpg"
+      }
+
+      user = insert(:user)
+
+      {:ok, %Object{} = attachment} =
+        Pleroma.Web.ActivityPub.ActivityPub.upload(file, actor: user.ap_id)
+
+      %{data: %{"attachment" => [%{"url" => [%{"href" => href}]}]}} =
+        note = insert(:note, %{user: user, data: %{"attachment" => [attachment.data]}})
+
+      uploads_dir = Pleroma.Config.get!([Pleroma.Uploaders.Local, :uploads])
+
+      path = href |> Path.dirname() |> Path.basename()
+
+      assert {:ok, ["an_image.jpg"]} == File.ls("#{uploads_dir}/#{path}")
+
+      Object.delete(note)
+
+      ObanHelpers.perform(all_enqueued(worker: Pleroma.Workers.AttachmentsCleanupWorker))
+
+      assert Object.get_by_id(attachment.id) == nil
+
+      assert {:ok, []} == File.ls("#{uploads_dir}/#{path}")
+    end
   end
 
   describe "normalizer" do
index f7b6f23d46e00a763dea47754581648fd5601465..6bde608ae1becefe6aa6ec2509dad0fa51bf165d 100644 (file)
@@ -6,6 +6,6 @@ defmodule Pleroma.RuntimeTest do
   use ExUnit.Case, async: true
 
   test "it loads custom runtime modules" do
-    assert Code.ensure_compiled?(RuntimeModule)
+    assert {:module, RuntimeModule} == Code.ensure_compiled(RuntimeModule)
   end
 end
index f43de700d98a210bb4f2f98340d3d88879277587..ba33413271277862951af05391008094896e83e9 100644 (file)
@@ -19,7 +19,7 @@ defmodule HttpRequestMock do
     else
       error ->
         with {:error, message} <- error do
-          Logger.warn(message)
+          Logger.warn(to_string(message))
         end
 
         {_, _r} = error
diff --git a/test/tasks/email_test.exs b/test/tasks/email_test.exs
new file mode 100644 (file)
index 0000000..944c070
--- /dev/null
@@ -0,0 +1,52 @@
+defmodule Mix.Tasks.Pleroma.EmailTest do
+  use Pleroma.DataCase
+
+  import Swoosh.TestAssertions
+
+  alias Pleroma.Config
+  alias Pleroma.Tests.ObanHelpers
+
+  setup_all do
+    Mix.shell(Mix.Shell.Process)
+
+    on_exit(fn ->
+      Mix.shell(Mix.Shell.IO)
+    end)
+
+    :ok
+  end
+
+  describe "pleroma.email test" do
+    test "Sends test email with no given address" do
+      mail_to = Config.get([:instance, :email])
+
+      :ok = Mix.Tasks.Pleroma.Email.run(["test"])
+
+      ObanHelpers.perform_all()
+
+      assert_receive {:mix_shell, :info, [message]}
+      assert message =~ "Test email has been sent"
+
+      assert_email_sent(
+        to: mail_to,
+        html_body: ~r/a test email was requested./i
+      )
+    end
+
+    test "Sends test email with given address" do
+      mail_to = "hewwo@example.com"
+
+      :ok = Mix.Tasks.Pleroma.Email.run(["test", "--to", mail_to])
+
+      ObanHelpers.perform_all()
+
+      assert_receive {:mix_shell, :info, [message]}
+      assert message =~ "Test email has been sent"
+
+      assert_email_sent(
+        to: mail_to,
+        html_body: ~r/a test email was requested./i
+      )
+    end
+  end
+end
index 158f98e6600488ba5d693704e784a9c0eacb1884..1b5e63bd4d9cdfe8509496998c45b6dbe9019f2c 100644 (file)
@@ -585,7 +585,7 @@ defmodule Pleroma.UserTest do
     user = insert(:user)
 
     assert User.ap_id(user) ==
-             Pleroma.Web.Router.Helpers.feed_url(
+             Pleroma.Web.Router.Helpers.user_feed_url(
                Pleroma.Web.Endpoint,
                :feed_redirect,
                user.nickname
@@ -596,7 +596,7 @@ defmodule Pleroma.UserTest do
     user = insert(:user)
 
     assert User.ap_followers(user) ==
-             Pleroma.Web.Router.Helpers.feed_url(
+             Pleroma.Web.Router.Helpers.user_feed_url(
                Pleroma.Web.Endpoint,
                :feed_redirect,
                user.nickname
diff --git a/test/web/feed/tag_controller_test.exs b/test/web/feed/tag_controller_test.exs
new file mode 100644 (file)
index 0000000..2aa1b95
--- /dev/null
@@ -0,0 +1,154 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Web.Feed.TagControllerTest do
+  use Pleroma.Web.ConnCase
+
+  import Pleroma.Factory
+  import SweetXml
+
+  alias Pleroma.Web.Feed.FeedView
+
+  clear_config([:feed])
+
+  test "gets a feed (ATOM)", %{conn: conn} do
+    Pleroma.Config.put(
+      [:feed, :post_title],
+      %{max_length: 25, omission: "..."}
+    )
+
+    user = insert(:user)
+    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"})
+
+    object = Pleroma.Object.normalize(activity1)
+
+    object_data =
+      Map.put(object.data, "attachment", [
+        %{
+          "url" => [
+            %{
+              "href" =>
+                "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",
+              "mediaType" => "video/mp4",
+              "type" => "Link"
+            }
+          ]
+        }
+      ])
+
+    object
+    |> Ecto.Changeset.change(data: object_data)
+    |> Pleroma.Repo.update()
+
+    {:ok, _activity2} =
+      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"})
+
+    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"})
+
+    response =
+      conn
+      |> put_req_header("content-type", "application/atom+xml")
+      |> get(tag_feed_path(conn, :feed, "pleromaart.atom"))
+      |> response(200)
+
+    xml = parse(response)
+
+    assert xpath(xml, ~x"//feed/title/text()") == '#pleromaart'
+
+    assert xpath(xml, ~x"//feed/entry/title/text()"l) == [
+             '42 This is :moominmamm...',
+             'yeah #PleromaArt'
+           ]
+
+    assert xpath(xml, ~x"//feed/entry/author/name/text()"ls) == [user.nickname, user.nickname]
+    assert xpath(xml, ~x"//feed/entry/author/id/text()"ls) == [user.ap_id, user.ap_id]
+  end
+
+  test "gets a feed (RSS)", %{conn: conn} do
+    Pleroma.Config.put(
+      [:feed, :post_title],
+      %{max_length: 25, omission: "..."}
+    )
+
+    user = insert(:user)
+    {:ok, activity1} = Pleroma.Web.CommonAPI.post(user, %{"status" => "yeah #PleromaArt"})
+
+    object = Pleroma.Object.normalize(activity1)
+
+    object_data =
+      Map.put(object.data, "attachment", [
+        %{
+          "url" => [
+            %{
+              "href" =>
+                "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4",
+              "mediaType" => "video/mp4",
+              "type" => "Link"
+            }
+          ]
+        }
+      ])
+
+    object
+    |> Ecto.Changeset.change(data: object_data)
+    |> Pleroma.Repo.update()
+
+    {:ok, activity2} =
+      Pleroma.Web.CommonAPI.post(user, %{"status" => "42 This is :moominmamma #PleromaArt"})
+
+    {:ok, _activity3} = Pleroma.Web.CommonAPI.post(user, %{"status" => "This is :moominmamma"})
+
+    response =
+      conn
+      |> put_req_header("content-type", "application/rss+xml")
+      |> get(tag_feed_path(conn, :feed, "pleromaart.rss"))
+      |> response(200)
+
+    xml = parse(response)
+    assert xpath(xml, ~x"//channel/title/text()") == '#pleromaart'
+
+    assert xpath(xml, ~x"//channel/description/text()"s) ==
+             "These are public toots tagged with #pleromaart. You can interact with them if you have an account anywhere in the fediverse."
+
+    assert xpath(xml, ~x"//channel/link/text()") ==
+             '#{Pleroma.Web.base_url()}/tags/pleromaart.rss'
+
+    assert xpath(xml, ~x"//channel/webfeeds:logo/text()") ==
+             '#{Pleroma.Web.base_url()}/static/logo.png'
+
+    assert xpath(xml, ~x"//channel/item/title/text()"l) == [
+             '42 This is :moominmamm...',
+             'yeah #PleromaArt'
+           ]
+
+    assert xpath(xml, ~x"//channel/item/pubDate/text()"sl) == [
+             FeedView.pub_date(activity1.data["published"]),
+             FeedView.pub_date(activity2.data["published"])
+           ]
+
+    assert xpath(xml, ~x"//channel/item/enclosure/@url"sl) == [
+             "https://peertube.moe/static/webseed/df5f464b-be8d-46fb-ad81-2d4c2d1630e3-480.mp4"
+           ]
+
+    obj1 = Pleroma.Object.normalize(activity1)
+    obj2 = Pleroma.Object.normalize(activity2)
+
+    assert xpath(xml, ~x"//channel/item/description/text()"sl) == [
+             HtmlEntities.decode(FeedView.activity_content(obj2)),
+             HtmlEntities.decode(FeedView.activity_content(obj1))
+           ]
+
+    response =
+      conn
+      |> put_req_header("content-type", "application/atom+xml")
+      |> get(tag_feed_path(conn, :feed, "pleromaart"))
+      |> response(200)
+
+    xml = parse(response)
+    assert xpath(xml, ~x"//channel/title/text()") == '#pleromaart'
+
+    assert xpath(xml, ~x"//channel/description/text()"s) ==
+             "These are public toots tagged with #pleromaart. You can interact with them if you have an account anywhere in the fediverse."
+  end
+end
similarity index 97%
rename from test/web/feed/feed_controller_test.exs
rename to test/web/feed/user_controller_test.exs
index 6f61acf43b2d4b6303a1f673ca0074d20e650d06..41cc9e07ee24021aed7fdb258c99c9bf6bcff0be 100644 (file)
@@ -2,7 +2,7 @@
 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
-defmodule Pleroma.Web.Feed.FeedControllerTest do
+defmodule Pleroma.Web.Feed.UserControllerTest do
   use Pleroma.Web.ConnCase
 
   import Pleroma.Factory
@@ -49,7 +49,7 @@ defmodule Pleroma.Web.Feed.FeedControllerTest do
     resp =
       conn
       |> put_req_header("content-type", "application/atom+xml")
-      |> get("/users/#{user.nickname}/feed.atom")
+      |> get(user_feed_path(conn, :feed, user.nickname))
       |> response(200)
 
     activity_titles =
@@ -65,7 +65,7 @@ defmodule Pleroma.Web.Feed.FeedControllerTest do
     conn =
       conn
       |> put_req_header("content-type", "application/atom+xml")
-      |> get("/users/nonexisting/feed.atom")
+      |> get(user_feed_path(conn, :feed, "nonexisting"))
 
     assert response(conn, 404)
   end
@@ -91,7 +91,7 @@ defmodule Pleroma.Web.Feed.FeedControllerTest do
       response =
         conn
         |> put_req_header("accept", "application/xml")
-        |> get("/users/jimm")
+        |> get(user_feed_path(conn, :feed, "jimm"))
         |> response(404)
 
       assert response == ~S({"error":"Not found"})
index c4118a57674d6d8f4c24c15cfa116e9d2f8e5c0a..0319d347507cbacd0010c2c188097647771fcdea 100644 (file)
@@ -7,7 +7,6 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do
 
   alias Pleroma.Config
 
-  import ExUnit.CaptureLog
   import Pleroma.Factory
   import Tesla.Mock
 
@@ -36,11 +35,7 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do
     [other_user: other_user]
   end
 
-  clear_config(:suggestions)
-
-  test "returns empty result when suggestions disabled", %{conn: conn} do
-    Config.put([:suggestions, :enabled], false)
-
+  test "returns empty result", %{conn: conn} do
     res =
       conn
       |> get("/api/v1/suggestions")
@@ -48,43 +43,4 @@ defmodule Pleroma.Web.MastodonAPI.SuggestionControllerTest do
 
     assert res == []
   end
-
-  test "returns error", %{conn: conn} do
-    Config.put([:suggestions, :enabled], true)
-    Config.put([:suggestions, :third_party_engine], "http://test500?{{host}}&{{user}}")
-
-    assert capture_log(fn ->
-             res =
-               conn
-               |> get("/api/v1/suggestions")
-               |> json_response(500)
-
-             assert res == "Something went wrong"
-           end) =~ "Could not retrieve suggestions"
-  end
-
-  test "returns suggestions", %{conn: conn, other_user: other_user} do
-    Config.put([:suggestions, :enabled], true)
-    Config.put([:suggestions, :third_party_engine], "http://test200?{{host}}&{{user}}")
-
-    res =
-      conn
-      |> get("/api/v1/suggestions")
-      |> json_response(200)
-
-    assert res == [
-             %{
-               "acct" => "yj455",
-               "avatar" => "https://social.heldscal.la/avatar/201.jpeg",
-               "avatar_static" => "https://social.heldscal.la/avatar/s/201.jpeg",
-               "id" => 0
-             },
-             %{
-               "acct" => other_user.ap_id,
-               "avatar" => "https://social.heldscal.la/avatar/202.jpeg",
-               "avatar_static" => "https://social.heldscal.la/avatar/s/202.jpeg",
-               "id" => other_user.id
-             }
-           ]
-  end
 end
index f8e1c9b407b612abce763ba2937ef111ccde3d99..e2610f4c2905636d92ad998bbb35dcbb940bdb76 100644 (file)
@@ -66,4 +66,23 @@ defmodule Pleroma.Web.RichMedia.Parsers.TwitterCardTest do
                   "https://www.nytimes.com/2019/08/01/nyregion/nypd-facial-recognition-children-teenagers.html"
               }}
   end
+
+  test "respect only first title tag on the page" do
+    image_path =
+      "https://assets.atlasobscura.com/media/W1siZiIsInVwbG9hZHMvYXNzZXRzLzkwYzgyMzI4LThlMDUtNGRiNS05MDg3LTUzMGUxZTM5N2RmMmVkOTM5ZDM4MGM4OTIx" <>
+        "YTQ5MF9EQVIgZXhodW1hdGlvbiBvZiBNYXJnYXJldCBDb3JiaW4gZ3JhdmUgMTkyNi5qcGciXSxbInAiLCJjb252ZXJ0IiwiIl0sWyJwIiwiY29udmVydCIsIi1xdWFsaXR5IDgxIC1hdXRvLW9" <>
+        "yaWVudCJdLFsicCIsInRodW1iIiwiNjAweD4iXV0/DAR%20exhumation%20of%20Margaret%20Corbin%20grave%201926.jpg"
+
+    html = File.read!("test/fixtures/margaret-corbin-grave-west-point.html")
+
+    assert TwitterCard.parse(html, %{}) ==
+             {:ok,
+              %{
+                site: "@atlasobscura",
+                title:
+                  "The Missing Grave of Margaret Corbin, Revolutionary War Veteran - Atlas Obscura",
+                card: "summary_large_image",
+                image: image_path
+              }}
+  end
 end