Bug 1548042 - Special FxA Snippet on New Tab for Firefox 67. r=mardak a=pascalc
authorRicky Rosario <rickyrosario@gmail.com>
Thu, 09 May 2019 21:35:24 +0300
changeset 526523 306b6635505681131acd230eb8685d2c4c54311c
parent 526522 432e429f9663a23a3be48459cc0f0fe8324d4722
child 526524 9c4cd169d5d07b75453e6574e13bf4f912814fb0
push id2032
push userffxbld-merge
push dateMon, 13 May 2019 09:36:57 +0000
treeherdermozilla-release@455c1065dcbe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmardak, pascalc
bugs1548042
milestone67.0
Bug 1548042 - Special FxA Snippet on New Tab for Firefox 67. r=mardak a=pascalc Reviewers: Mardak Reviewed By: Mardak Subscribers: flod Bug #: 1548042 Differential Revision: https://phabricator.services.mozilla.com/D30184
browser/components/newtab/bin/render-activity-stream-html.js
browser/components/newtab/common/Actions.jsm
browser/components/newtab/common/PrerenderData.jsm
browser/components/newtab/content-src/activity-stream.jsx
browser/components/newtab/content-src/asrouter/asrouter-content.jsx
browser/components/newtab/content-src/asrouter/components/SnippetBase/SnippetBase.jsx
browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet.jsx
browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet.schema.json
browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/_SimpleBelowSearchSnippet.scss
browser/components/newtab/content-src/asrouter/templates/template-manifest.jsx
browser/components/newtab/content-src/components/Base/Base.jsx
browser/components/newtab/content-src/components/ManualMigration/ManualMigration.jsx
browser/components/newtab/content-src/components/ManualMigration/_ManualMigration.scss
browser/components/newtab/content-src/components/Search/_Search.scss
browser/components/newtab/content-src/lib/asroutercontent.js
browser/components/newtab/content-src/styles/_activity-stream.scss
browser/components/newtab/content-src/styles/_icons.scss
browser/components/newtab/css/activity-stream-linux.css
browser/components/newtab/css/activity-stream-mac.css
browser/components/newtab/css/activity-stream-windows.css
browser/components/newtab/data/content/activity-stream.bundle.js
browser/components/newtab/data/content/assets/glyph-import-16.svg
browser/components/newtab/lib/ActivityStream.jsm
browser/components/newtab/lib/HighlightsFeed.jsm
browser/components/newtab/lib/ManualMigration.jsm
browser/components/newtab/lib/SnippetsTestMessageProvider.jsm
browser/components/newtab/lib/TopSitesFeed.jsm
browser/components/newtab/locales-src/en-US/strings.properties
browser/components/newtab/prerendered/locales/ach/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ach/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ach/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ach/activity-stream.html
browser/components/newtab/prerendered/locales/an/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/an/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/an/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/an/activity-stream-strings.js
browser/components/newtab/prerendered/locales/an/activity-stream.html
browser/components/newtab/prerendered/locales/ar/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ar/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ar/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ar/activity-stream.html
browser/components/newtab/prerendered/locales/ast/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ast/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ast/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ast/activity-stream.html
browser/components/newtab/prerendered/locales/az/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/az/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/az/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/az/activity-stream-strings.js
browser/components/newtab/prerendered/locales/az/activity-stream.html
browser/components/newtab/prerendered/locales/be/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/be/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/be/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/be/activity-stream-strings.js
browser/components/newtab/prerendered/locales/be/activity-stream.html
browser/components/newtab/prerendered/locales/bg/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bg/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bg/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bg/activity-stream-strings.js
browser/components/newtab/prerendered/locales/bg/activity-stream.html
browser/components/newtab/prerendered/locales/bn-BD/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bn-BD/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bn-BD/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bn-BD/activity-stream-strings.js
browser/components/newtab/prerendered/locales/bn-BD/activity-stream.html
browser/components/newtab/prerendered/locales/bn-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bn-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bn-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bn-IN/activity-stream-strings.js
browser/components/newtab/prerendered/locales/bn-IN/activity-stream.html
browser/components/newtab/prerendered/locales/br/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/br/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/br/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/br/activity-stream-strings.js
browser/components/newtab/prerendered/locales/br/activity-stream.html
browser/components/newtab/prerendered/locales/bs/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/bs/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/bs/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/bs/activity-stream-strings.js
browser/components/newtab/prerendered/locales/bs/activity-stream.html
browser/components/newtab/prerendered/locales/ca/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ca/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ca/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ca/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ca/activity-stream.html
browser/components/newtab/prerendered/locales/cak/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cak/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cak/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cak/activity-stream-strings.js
browser/components/newtab/prerendered/locales/cak/activity-stream.html
browser/components/newtab/prerendered/locales/crh/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/crh/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/crh/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/crh/activity-stream-strings.js
browser/components/newtab/prerendered/locales/crh/activity-stream.html
browser/components/newtab/prerendered/locales/cs/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cs/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cs/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cs/activity-stream-strings.js
browser/components/newtab/prerendered/locales/cs/activity-stream.html
browser/components/newtab/prerendered/locales/cy/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/cy/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/cy/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/cy/activity-stream-strings.js
browser/components/newtab/prerendered/locales/cy/activity-stream.html
browser/components/newtab/prerendered/locales/da/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/da/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/da/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/da/activity-stream-strings.js
browser/components/newtab/prerendered/locales/da/activity-stream.html
browser/components/newtab/prerendered/locales/de/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/de/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/de/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/de/activity-stream-strings.js
browser/components/newtab/prerendered/locales/de/activity-stream.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/dsb/activity-stream-strings.js
browser/components/newtab/prerendered/locales/dsb/activity-stream.html
browser/components/newtab/prerendered/locales/el/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/el/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/el/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/el/activity-stream-strings.js
browser/components/newtab/prerendered/locales/el/activity-stream.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-CA/activity-stream-strings.js
browser/components/newtab/prerendered/locales/en-CA/activity-stream.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-GB/activity-stream-strings.js
browser/components/newtab/prerendered/locales/en-GB/activity-stream.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/en-US/activity-stream-strings.js
browser/components/newtab/prerendered/locales/en-US/activity-stream.html
browser/components/newtab/prerendered/locales/eo/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/eo/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/eo/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/eo/activity-stream-strings.js
browser/components/newtab/prerendered/locales/eo/activity-stream.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-AR/activity-stream-strings.js
browser/components/newtab/prerendered/locales/es-AR/activity-stream.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-CL/activity-stream-strings.js
browser/components/newtab/prerendered/locales/es-CL/activity-stream.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-ES/activity-stream-strings.js
browser/components/newtab/prerendered/locales/es-ES/activity-stream.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/es-MX/activity-stream-strings.js
browser/components/newtab/prerendered/locales/es-MX/activity-stream.html
browser/components/newtab/prerendered/locales/et/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/et/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/et/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/et/activity-stream-strings.js
browser/components/newtab/prerendered/locales/et/activity-stream.html
browser/components/newtab/prerendered/locales/eu/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/eu/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/eu/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/eu/activity-stream-strings.js
browser/components/newtab/prerendered/locales/eu/activity-stream.html
browser/components/newtab/prerendered/locales/fa/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fa/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fa/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fa/activity-stream-strings.js
browser/components/newtab/prerendered/locales/fa/activity-stream.html
browser/components/newtab/prerendered/locales/ff/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ff/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ff/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ff/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ff/activity-stream.html
browser/components/newtab/prerendered/locales/fi/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fi/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fi/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fi/activity-stream-strings.js
browser/components/newtab/prerendered/locales/fi/activity-stream.html
browser/components/newtab/prerendered/locales/fr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fr/activity-stream-strings.js
browser/components/newtab/prerendered/locales/fr/activity-stream.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/fy-NL/activity-stream-strings.js
browser/components/newtab/prerendered/locales/fy-NL/activity-stream.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ga-IE/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ga-IE/activity-stream.html
browser/components/newtab/prerendered/locales/gd/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gd/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gd/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gd/activity-stream-strings.js
browser/components/newtab/prerendered/locales/gd/activity-stream.html
browser/components/newtab/prerendered/locales/gl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gl/activity-stream-strings.js
browser/components/newtab/prerendered/locales/gl/activity-stream.html
browser/components/newtab/prerendered/locales/gn/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gn/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gn/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gn/activity-stream-strings.js
browser/components/newtab/prerendered/locales/gn/activity-stream.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/gu-IN/activity-stream-strings.js
browser/components/newtab/prerendered/locales/gu-IN/activity-stream.html
browser/components/newtab/prerendered/locales/he/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/he/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/he/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/he/activity-stream-strings.js
browser/components/newtab/prerendered/locales/he/activity-stream.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hi-IN/activity-stream-strings.js
browser/components/newtab/prerendered/locales/hi-IN/activity-stream.html
browser/components/newtab/prerendered/locales/hr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hr/activity-stream-strings.js
browser/components/newtab/prerendered/locales/hr/activity-stream.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hsb/activity-stream-strings.js
browser/components/newtab/prerendered/locales/hsb/activity-stream.html
browser/components/newtab/prerendered/locales/hu/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hu/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hu/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hu/activity-stream-strings.js
browser/components/newtab/prerendered/locales/hu/activity-stream.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/hy-AM/activity-stream-strings.js
browser/components/newtab/prerendered/locales/hy-AM/activity-stream.html
browser/components/newtab/prerendered/locales/ia/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ia/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ia/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ia/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ia/activity-stream.html
browser/components/newtab/prerendered/locales/id/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/id/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/id/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/id/activity-stream-strings.js
browser/components/newtab/prerendered/locales/id/activity-stream.html
browser/components/newtab/prerendered/locales/is/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/is/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/is/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/is/activity-stream-strings.js
browser/components/newtab/prerendered/locales/is/activity-stream.html
browser/components/newtab/prerendered/locales/it/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/it/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/it/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/it/activity-stream-strings.js
browser/components/newtab/prerendered/locales/it/activity-stream.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ja-JP-mac/activity-stream.html
browser/components/newtab/prerendered/locales/ja/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ja/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ja/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ja/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ja/activity-stream.html
browser/components/newtab/prerendered/locales/ka/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ka/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ka/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ka/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ka/activity-stream.html
browser/components/newtab/prerendered/locales/kab/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kab/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kab/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kab/activity-stream-strings.js
browser/components/newtab/prerendered/locales/kab/activity-stream.html
browser/components/newtab/prerendered/locales/kk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kk/activity-stream-strings.js
browser/components/newtab/prerendered/locales/kk/activity-stream.html
browser/components/newtab/prerendered/locales/km/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/km/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/km/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/km/activity-stream-strings.js
browser/components/newtab/prerendered/locales/km/activity-stream.html
browser/components/newtab/prerendered/locales/kn/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/kn/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/kn/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/kn/activity-stream-strings.js
browser/components/newtab/prerendered/locales/kn/activity-stream.html
browser/components/newtab/prerendered/locales/ko/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ko/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ko/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ko/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ko/activity-stream.html
browser/components/newtab/prerendered/locales/lij/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lij/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lij/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lij/activity-stream-strings.js
browser/components/newtab/prerendered/locales/lij/activity-stream.html
browser/components/newtab/prerendered/locales/lo/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lo/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lo/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lo/activity-stream-strings.js
browser/components/newtab/prerendered/locales/lo/activity-stream.html
browser/components/newtab/prerendered/locales/lt/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lt/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lt/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lt/activity-stream-strings.js
browser/components/newtab/prerendered/locales/lt/activity-stream.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ltg/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ltg/activity-stream.html
browser/components/newtab/prerendered/locales/lv/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/lv/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/lv/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/lv/activity-stream-strings.js
browser/components/newtab/prerendered/locales/lv/activity-stream.html
browser/components/newtab/prerendered/locales/mai/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/mai/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/mai/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/mai/activity-stream-strings.js
browser/components/newtab/prerendered/locales/mai/activity-stream.html
browser/components/newtab/prerendered/locales/mk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/mk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/mk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/mk/activity-stream-strings.js
browser/components/newtab/prerendered/locales/mk/activity-stream.html
browser/components/newtab/prerendered/locales/ml/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ml/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ml/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ml/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ml/activity-stream.html
browser/components/newtab/prerendered/locales/mr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/mr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/mr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/mr/activity-stream-strings.js
browser/components/newtab/prerendered/locales/mr/activity-stream.html
browser/components/newtab/prerendered/locales/ms/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ms/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ms/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ms/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ms/activity-stream.html
browser/components/newtab/prerendered/locales/my/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/my/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/my/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/my/activity-stream-strings.js
browser/components/newtab/prerendered/locales/my/activity-stream.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nb-NO/activity-stream-strings.js
browser/components/newtab/prerendered/locales/nb-NO/activity-stream.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ne-NP/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ne-NP/activity-stream.html
browser/components/newtab/prerendered/locales/nl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nl/activity-stream-strings.js
browser/components/newtab/prerendered/locales/nl/activity-stream.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/nn-NO/activity-stream-strings.js
browser/components/newtab/prerendered/locales/nn-NO/activity-stream.html
browser/components/newtab/prerendered/locales/oc/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/oc/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/oc/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/oc/activity-stream-strings.js
browser/components/newtab/prerendered/locales/oc/activity-stream.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pa-IN/activity-stream-strings.js
browser/components/newtab/prerendered/locales/pa-IN/activity-stream.html
browser/components/newtab/prerendered/locales/pl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pl/activity-stream-strings.js
browser/components/newtab/prerendered/locales/pl/activity-stream.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pt-BR/activity-stream-strings.js
browser/components/newtab/prerendered/locales/pt-BR/activity-stream.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/pt-PT/activity-stream-strings.js
browser/components/newtab/prerendered/locales/pt-PT/activity-stream.html
browser/components/newtab/prerendered/locales/rm/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/rm/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/rm/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/rm/activity-stream-strings.js
browser/components/newtab/prerendered/locales/rm/activity-stream.html
browser/components/newtab/prerendered/locales/ro/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ro/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ro/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ro/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ro/activity-stream.html
browser/components/newtab/prerendered/locales/ru/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ru/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ru/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ru/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ru/activity-stream.html
browser/components/newtab/prerendered/locales/si/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/si/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/si/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/si/activity-stream-strings.js
browser/components/newtab/prerendered/locales/si/activity-stream.html
browser/components/newtab/prerendered/locales/sk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sk/activity-stream-strings.js
browser/components/newtab/prerendered/locales/sk/activity-stream.html
browser/components/newtab/prerendered/locales/sl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sl/activity-stream-strings.js
browser/components/newtab/prerendered/locales/sl/activity-stream.html
browser/components/newtab/prerendered/locales/sq/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sq/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sq/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sq/activity-stream-strings.js
browser/components/newtab/prerendered/locales/sq/activity-stream.html
browser/components/newtab/prerendered/locales/sr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sr/activity-stream-strings.js
browser/components/newtab/prerendered/locales/sr/activity-stream.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/sv-SE/activity-stream-strings.js
browser/components/newtab/prerendered/locales/sv-SE/activity-stream.html
browser/components/newtab/prerendered/locales/ta/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ta/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ta/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ta/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ta/activity-stream.html
browser/components/newtab/prerendered/locales/te/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/te/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/te/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/te/activity-stream-strings.js
browser/components/newtab/prerendered/locales/te/activity-stream.html
browser/components/newtab/prerendered/locales/th/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/th/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/th/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/th/activity-stream-strings.js
browser/components/newtab/prerendered/locales/th/activity-stream.html
browser/components/newtab/prerendered/locales/tl/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/tl/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/tl/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/tl/activity-stream-strings.js
browser/components/newtab/prerendered/locales/tl/activity-stream.html
browser/components/newtab/prerendered/locales/tr/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/tr/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/tr/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/tr/activity-stream-strings.js
browser/components/newtab/prerendered/locales/tr/activity-stream.html
browser/components/newtab/prerendered/locales/uk/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/uk/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/uk/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/uk/activity-stream-strings.js
browser/components/newtab/prerendered/locales/uk/activity-stream.html
browser/components/newtab/prerendered/locales/ur/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/ur/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/ur/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/ur/activity-stream-strings.js
browser/components/newtab/prerendered/locales/ur/activity-stream.html
browser/components/newtab/prerendered/locales/uz/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/uz/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/uz/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/uz/activity-stream-strings.js
browser/components/newtab/prerendered/locales/uz/activity-stream.html
browser/components/newtab/prerendered/locales/vi/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/vi/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/vi/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/vi/activity-stream-strings.js
browser/components/newtab/prerendered/locales/vi/activity-stream.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/zh-CN/activity-stream-strings.js
browser/components/newtab/prerendered/locales/zh-CN/activity-stream.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-noscripts.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-prerendered-noscripts.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-prerendered.html
browser/components/newtab/prerendered/locales/zh-TW/activity-stream-strings.js
browser/components/newtab/prerendered/locales/zh-TW/activity-stream.html
browser/components/newtab/prerendered/static/activity-stream-debug.html
browser/components/newtab/prerendered/static/activity-stream-initial-state.js
browser/components/newtab/prerendered/static/activity-stream-prerendered-debug.html
browser/components/newtab/test/unit/activity-stream.test.jsx
browser/components/newtab/test/unit/asrouter/SnippetsTestMessageProvider.test.js
browser/components/newtab/test/unit/asrouter/asrouter-content.test.jsx
browser/components/newtab/test/unit/asrouter/constants.js
browser/components/newtab/test/unit/asrouter/templates/SimpleBelowSearchSnippet.test.jsx
browser/components/newtab/test/unit/common/Reducers.test.js
browser/components/newtab/test/unit/content-src/components/ConfirmDialog.test.jsx
browser/components/newtab/test/unit/content-src/components/ManualMigration.test.jsx
browser/components/newtab/test/unit/lib/ActivityStream.test.js
browser/components/newtab/test/unit/lib/HighlightsFeed.test.js
browser/components/newtab/test/unit/lib/ManualMigration.test.js
browser/components/newtab/test/unit/lib/TopSitesFeed.test.js
--- a/browser/components/newtab/bin/render-activity-stream-html.js
+++ b/browser/components/newtab/bin/render-activity-stream-html.js
@@ -100,19 +100,17 @@ for (const src of ${JSON.stringify(scrip
     <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' resource: chrome:; connect-src https:; img-src https: data: blob:; style-src 'unsafe-inline';">
     <title>${options.strings.newtab_page_title}</title>
     <link rel="icon" type="image/png" href="chrome://branding/content/icon32.png"/>
     <link rel="stylesheet" href="chrome://browser/content/contentSearchUI.css" />
     <link rel="stylesheet" href="${options.baseUrl}css/activity-stream.css" />
   </head>
   <body class="activity-stream">
     <div id="root">${isPrerendered ? html : "<!-- Regular React Rendering -->"}</div>
-    <div id="snippets-container">
-      <div id="snippets"></div>
-    </div>${options.noscripts ? "" : scriptTag}
+    <div id="footer-snippets-container" />${options.noscripts ? "" : scriptTag}
   </body>
 </html>
 `;
 }
 
 /**
  * templateJs - Generates a js file that passes the initial state of the prerendered
  * DOM to the React version. This is necessary to ensure the checksum matches when
--- a/browser/components/newtab/common/Actions.jsm
+++ b/browser/components/newtab/common/Actions.jsm
@@ -51,19 +51,16 @@ for (const type of [
   "DISCOVERY_STREAM_SPOCS_UPDATE",
   "DISCOVERY_STREAM_SPOC_IMPRESSION",
   "DOWNLOAD_CHANGED",
   "FAKE_FOCUS_SEARCH",
   "FILL_SEARCH_TERM",
   "HANDOFF_SEARCH_TO_AWESOMEBAR",
   "HIDE_SEARCH",
   "INIT",
-  "MIGRATION_CANCEL",
-  "MIGRATION_COMPLETED",
-  "MIGRATION_START",
   "NEW_TAB_INIT",
   "NEW_TAB_INITIAL_STATE",
   "NEW_TAB_LOAD",
   "NEW_TAB_REHYDRATED",
   "NEW_TAB_STATE_REQUEST",
   "NEW_TAB_UNLOAD",
   "OPEN_DOWNLOAD_FILE",
   "OPEN_LINK",
--- a/browser/components/newtab/common/PrerenderData.jsm
+++ b/browser/components/newtab/common/PrerenderData.jsm
@@ -69,17 +69,16 @@ class _PrerenderData {
       }
     }
     return true;
   }
 }
 
 this.PrerenderData = new _PrerenderData({
   initialPrefs: {
-    "migrationExpired": true,
     "feeds.topsites": true,
     "showSearch": true,
     "topSitesRows": 1,
     "feeds.section.topstories": true,
     "feeds.section.highlights": true,
     "sectionOrder": "topsites,topstories,highlights",
     "collapsed": false,
     "discoverystream.config": {"enabled": false},
--- a/browser/components/newtab/content-src/activity-stream.jsx
+++ b/browser/components/newtab/content-src/activity-stream.jsx
@@ -1,32 +1,28 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {addSnippetsSubscriber} from "content-src/lib/snippets";
-import {ASRouterContent} from "content-src/asrouter/asrouter-content";
 import {Base} from "content-src/components/Base/Base";
 import {DetectUserSessionStart} from "content-src/lib/detect-user-session-start";
-import {enableASRouterContent} from "content-src/lib/asroutercontent";
 import {initStore} from "content-src/lib/init-store";
 import {Provider} from "react-redux";
 import React from "react";
 import ReactDOM from "react-dom";
 import {reducers} from "common/Reducers.jsm";
 
 const store = initStore(reducers, global.gActivityStreamPrerenderedState);
-const asrouterContent = new ASRouterContent();
 
 new DetectUserSessionStart(store).sendEventOrAddListener();
 
 // If we are starting in a prerendered state, we must wait until the first render
 // to request state rehydration (see Base.jsx). If we are NOT in a prerendered state,
 // we can request it immedately.
 if (!global.gActivityStreamPrerenderedState) {
   store.dispatch(ac.AlsoToMain({type: at.NEW_TAB_STATE_REQUEST}));
 }
-enableASRouterContent(store, asrouterContent);
 
 ReactDOM.hydrate(<Provider store={store}>
   <Base
     isFirstrun={global.document.location.href === "about:welcome"}
     isPrerendered={!!global.gActivityStreamPrerenderedState}
     locale={global.document.documentElement.lang}
     strings={global.gActivityStreamStrings} />
 </Provider>, document.getElementById("root"));
--- a/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
+++ b/browser/components/newtab/content-src/asrouter/asrouter-content.jsx
@@ -8,27 +8,33 @@ import {OnboardingMessage} from "./templ
 import React from "react";
 import ReactDOM from "react-dom";
 import {ReturnToAMO} from "./templates/ReturnToAMO/ReturnToAMO";
 import {SnippetsTemplates} from "./templates/template-manifest";
 import {StartupOverlay} from "./templates/StartupOverlay/StartupOverlay";
 
 const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
 const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
-const ASR_CONTAINER_ID = "asr-newtab-container";
+const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
 
 export const ASRouterUtils = {
   addListener(listener) {
-    global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, listener);
+    if (global.RPMAddMessageListener) {
+      global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, listener);
+    }
   },
   removeListener(listener) {
-    global.RPMRemoveMessageListener(INCOMING_MESSAGE_NAME, listener);
+    if (global.RPMRemoveMessageListener) {
+      global.RPMRemoveMessageListener(INCOMING_MESSAGE_NAME, listener);
+    }
   },
   sendMessage(action) {
-    global.RPMSendAsyncMessage(OUTGOING_MESSAGE_NAME, action);
+    if (global.RPMSendAsyncMessage) {
+      global.RPMSendAsyncMessage(OUTGOING_MESSAGE_NAME, action);
+    }
   },
   blockById(id, options) {
     ASRouterUtils.sendMessage({type: "BLOCK_MESSAGE_BY_ID", data: {id, ...options}});
   },
   dismissById(id) {
     ASRouterUtils.sendMessage({type: "DISMISS_MESSAGE_BY_ID", data: {id}});
   },
   dismissBundle(bundle) {
@@ -45,22 +51,24 @@ export const ASRouterUtils = {
   },
   unblockBundle(bundle) {
     ASRouterUtils.sendMessage({type: "UNBLOCK_BUNDLE", data: {bundle}});
   },
   overrideMessage(id) {
     ASRouterUtils.sendMessage({type: "OVERRIDE_MESSAGE", data: {id}});
   },
   sendTelemetry(ping) {
-    const payload = ac.ASRouterUserEvent(ping);
-    global.RPMSendAsyncMessage(AS_GENERAL_OUTGOING_MESSAGE_NAME, payload);
+    if (global.RPMSendAsyncMessage) {
+      const payload = ac.ASRouterUserEvent(ping);
+      global.RPMSendAsyncMessage(AS_GENERAL_OUTGOING_MESSAGE_NAME, payload);
+    }
   },
   getPreviewEndpoint() {
-    if (window.location.href.includes("endpoint")) {
-      const params = new URLSearchParams(window.location.href.slice(window.location.href.indexOf("endpoint")));
+    if (global.location && global.location.href.includes("endpoint")) {
+      const params = new URLSearchParams(global.location.href.slice(global.location.href.indexOf("endpoint")));
       try {
         const endpoint = new URL(params.get("endpoint"));
         return {
           url: endpoint.href,
           snippetId: params.get("snippetId"),
         };
       } catch (e) {}
     }
@@ -77,16 +85,19 @@ function shouldSendImpressionOnUpdate(ne
 export class ASRouterUISurface extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onMessageFromParent = this.onMessageFromParent.bind(this);
     this.sendClick = this.sendClick.bind(this);
     this.sendImpression = this.sendImpression.bind(this);
     this.sendUserActionTelemetry = this.sendUserActionTelemetry.bind(this);
     this.state = {message: {}, bundle: {}};
+    if (props.document) {
+      this.portalContainer = props.document.getElementById("footer-snippets-container");
+    }
   }
 
   sendUserActionTelemetry(extraProps = {}) {
     const {message, bundle} = this.state;
     if (!message && !extraProps.message_id) {
       throw new Error(`You must provide a message_id for bundled messages`);
     }
     const eventType = `${message.provider || bundle.provider}_user_event`;
@@ -174,24 +185,26 @@ export class ASRouterUISurface extends R
         }
         break;
       case "CLEAR_ALL":
         this.setState({message: {}, bundle: {}});
     }
   }
 
   componentWillMount() {
-    // Add locale data for StartupOverlay because it uses react-intl
-    addLocaleData(global.document.documentElement.lang);
+    if (global.document) {
+      // Add locale data for StartupOverlay because it uses react-intl
+      addLocaleData(global.document.documentElement.lang);
+    }
 
     const endpoint = ASRouterUtils.getPreviewEndpoint();
     ASRouterUtils.addListener(this.onMessageFromParent);
 
     // If we are loading about:welcome we want to trigger the onboarding messages
-    if (this.props.document.location.href === "about:welcome") {
+    if (this.props.document && this.props.document.location.href === "about:welcome") {
       ASRouterUtils.sendMessage({type: "TRIGGER", data: {trigger: {id: "firstRun"}}});
     } else {
       ASRouterUtils.sendMessage({type: "SNIPPETS_REQUEST", data: {endpoint}});
     }
   }
 
   componentWillUnmount() {
     ASRouterUtils.removeListener(this.onMessageFromParent);
@@ -244,18 +257,17 @@ export class ASRouterUISurface extends R
     const {message} = this.state;
     if (message.template === "fxa_overlay") {
       global.document.body.classList.add("fxa");
       return (
         <IntlProvider locale={global.document.documentElement.lang} messages={global.gActivityStreamStrings}>
           <StartupOverlay
             onReady={this.triggerOnboarding}
             onBlock={this.onDismissById(message.id)}
-            dispatch={this.props.activityStreamStore.dispatch}
-            store={this.props.activityStreamStore} />
+            dispatch={this.props.dispatch} />
         </IntlProvider>
       );
     } else if (message.template === "return_to_amo_overlay") {
       global.document.body.classList.add("amo");
       return (
         <LocalizationProvider messages={generateMessages({"amo_html": message.content.text})}>
           <ReturnToAMO
             {...message}
@@ -279,56 +291,28 @@ export class ASRouterUISurface extends R
         <span>Preview Purposes Only</span>
       </div>
     );
   }
 
   render() {
     const {message, bundle} = this.state;
     if (!message.id && !bundle.template) { return null; }
-    return (
-      <React.Fragment>
-        {this.renderPreviewBanner()}
-        {this.renderFirstRunOverlay()}
-        {this.renderOnboarding()}
-        {this.renderSnippets()}
-      </React.Fragment>
-    );
+    const shouldRenderBelowSearch = TEMPLATES_BELOW_SEARCH.includes(message.template);
+
+    return shouldRenderBelowSearch ?
+      // Render special below search snippets in place;
+      <div className="below-search-snippet">{this.renderSnippets()}</div> :
+      // For onboarding, regular snippets etc. we should render
+      // everything in our footer container.
+      ReactDOM.createPortal(
+        <React.Fragment>
+          {this.renderPreviewBanner()}
+          {this.renderFirstRunOverlay()}
+          {this.renderOnboarding()}
+          {this.renderSnippets()}
+        </React.Fragment>,
+        this.portalContainer
+      );
   }
 }
 
 ASRouterUISurface.defaultProps = {document: global.document};
-
-export class ASRouterContent {
-  constructor() {
-    this.initialized = false;
-    this.containerElement = null;
-  }
-
-  _mount() {
-    this.containerElement = global.document.getElementById(ASR_CONTAINER_ID);
-    if (!this.containerElement) {
-      this.containerElement = global.document.createElement("div");
-      this.containerElement.id = ASR_CONTAINER_ID;
-      this.containerElement.style.zIndex = 1;
-      global.document.body.appendChild(this.containerElement);
-    }
-
-    ReactDOM.render(<ASRouterUISurface activityStreamStore={this._activityStreamStore} />, this.containerElement);
-  }
-
-  _unmount() {
-    ReactDOM.unmountComponentAtNode(this.containerElement);
-  }
-
-  init(store) {
-    this._activityStreamStore = store;
-    this._mount();
-    this.initialized = true;
-  }
-
-  uninit() {
-    if (this.initialized) {
-      this._unmount();
-      this.initialized = false;
-    }
-  }
-}
--- a/browser/components/newtab/content-src/asrouter/components/SnippetBase/SnippetBase.jsx
+++ b/browser/components/newtab/content-src/asrouter/components/SnippetBase/SnippetBase.jsx
@@ -1,16 +1,46 @@
 import React from "react";
 import schema from "../../templates/SimpleSnippet/SimpleSnippet.schema.json";
 
 export class SnippetBase extends React.PureComponent {
   constructor(props) {
     super(props);
     this.onBlockClicked = this.onBlockClicked.bind(this);
     this.onDismissClicked = this.onDismissClicked.bind(this);
+    this.setBlockButtonRef = this.setBlockButtonRef.bind(this);
+    this.onBlockButtonMouseEnter = this.onBlockButtonMouseEnter.bind(this);
+    this.onBlockButtonMouseLeave = this.onBlockButtonMouseLeave.bind(this);
+    this.state = {blockButtonHover: false};
+  }
+
+  componentDidMount() {
+    if (this.blockButtonRef) {
+      this.blockButtonRef.addEventListener("mouseenter", this.onBlockButtonMouseEnter);
+      this.blockButtonRef.addEventListener("mouseleave", this.onBlockButtonMouseLeave);
+    }
+  }
+
+  componentWillUnmount() {
+    if (this.blockButtonRef) {
+      this.blockButtonRef.removeEventListener("mouseenter", this.onBlockButtonMouseEnter);
+      this.blockButtonRef.removeEventListener("mouseleave", this.onBlockButtonMouseLeave);
+    }
+  }
+
+  setBlockButtonRef(element) {
+    this.blockButtonRef = element;
+  }
+
+  onBlockButtonMouseEnter() {
+    this.setState({blockButtonHover: true});
+  }
+
+  onBlockButtonMouseLeave() {
+    this.setState({blockButtonHover: false});
   }
 
   onBlockClicked() {
     if (this.props.provider !== "preview") {
       this.props.sendUserActionTelemetry({event: "BLOCK", id: this.props.UISurface});
     }
 
     this.props.onBlock();
@@ -34,26 +64,27 @@ export class SnippetBase extends React.P
               onClick={this.onDismissClicked}>
               {this.props.content.scene2_dismiss_button_text}
             </button>
           </div>
         </div>
       );
     }
 
-    const defaultTitle = schema.properties.block_button_text.default;
+    const label = this.props.content.block_button_text || schema.properties.block_button_text.default;
     return (
-      <button className="blockButton" title={this.props.content.block_button_text || defaultTitle} onClick={this.onBlockClicked} />
+      <button className="blockButton" title={label} aria-label={label} onClick={this.onBlockClicked} ref={this.setBlockButtonRef} />
     );
   }
 
   render() {
     const {props} = this;
+    const {blockButtonHover} = this.state;
 
-    const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}`;
+    const containerClassName = `SnippetBaseContainer${props.className ? ` ${props.className}` : ""}${blockButtonHover ? " active" : ""}`;
 
     return (<div className={containerClassName} style={this.props.textStyle}>
       <div className="innerWrapper">
         {props.children}
       </div>
       {this.renderDismissButton()}
     </div>);
   }
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet.jsx
@@ -0,0 +1,34 @@
+import React from "react";
+import {RichText} from "../../components/RichText/RichText";
+import {safeURI} from "../../template-utils";
+import {SnippetBase} from "../../components/SnippetBase/SnippetBase";
+
+const DEFAULT_ICON_PATH = "chrome://branding/content/icon64.png";
+
+export class SimpleBelowSearchSnippet extends React.PureComponent {
+  renderText() {
+    const {props} = this;
+    return (<RichText text={props.content.text}
+      customElements={this.props.customElements}
+      localization_id="text"
+      links={props.content.links}
+      sendClick={props.sendClick} />);
+  }
+
+  render() {
+    const {props} = this;
+    let className = "SimpleBelowSearchSnippet";
+
+    if (props.className) {
+      className += ` ${props.className}`;
+    }
+
+    return (<SnippetBase {...props} className={className} textStyle={this.props.textStyle}>
+      <img src={safeURI(props.content.icon) || DEFAULT_ICON_PATH} className="icon" />
+      <div>
+        <p className="body">{this.renderText()}</p>
+        {this.props.extraContent}
+      </div>
+    </SnippetBase>);
+  }
+}
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet.schema.json
@@ -0,0 +1,59 @@
+{
+  "title": "SimpleBelowSearchSnippet",
+  "description": "A simple template with just an icon and rich text. It gets inserted below the Activity Stream search box.",
+  "version": "1.1.0",
+  "type": "object",
+  "definitions": {
+    "richText": {
+      "description": "Text with HTML subset allowed: i, b, u, strong, em, br",
+      "type": "string"
+    },
+    "link_url": {
+      "description": "Target for links or buttons",
+      "type": "string",
+      "format": "uri"
+    }
+  },
+  "properties": {
+    "text": {
+      "allOf": [
+        {"$ref": "#/definitions/richText"},
+        {"description": "Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}
+      ]
+    },
+    "icon": {
+      "type": "string",
+      "description": "Snippet icon. 64x64px. SVG or PNG preferred."
+    },
+    "block_button_text": {
+      "type": "string",
+      "description": "Tooltip text used for dismiss button.",
+      "default": "Remove this"
+    },
+    "do_not_autoblock": {
+      "type": "boolean",
+      "description": "Used to prevent blocking the snippet after the CTA link has been clicked"
+    },
+    "links": {
+      "additionalProperties": {
+        "url": {
+          "allOf": [
+            {"$ref": "#/definitions/link_url"},
+            {"description": "The url where the link points to."}
+          ]
+        },
+        "metric": {
+          "type": "string",
+          "description": "Custom event name sent with telemetry event."
+        },
+        "args": {
+          "type": "string",
+          "description": "Additional parameters for link action, example which specific menu the button should open"
+        }
+      }
+    }
+  },
+  "additionalProperties": false,
+  "required": ["text"],
+  "dependencies": {}
+}
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/content-src/asrouter/templates/SimpleBelowSearchSnippet/_SimpleBelowSearchSnippet.scss
@@ -0,0 +1,88 @@
+.SimpleBelowSearchSnippet {
+  background-color: inherit;
+  border: 0;
+  box-shadow: none;
+  position: relative;
+  z-index: auto;
+
+  .innerWrapper {
+    align-items: center;
+    background-color: var(--newtab-card-background-color);
+    border-radius: 4px;
+    box-shadow: var(--newtab-card-shadow);
+    flex-direction: column;
+    padding: 16px;
+    text-align: center;
+    width: 100%;
+
+    @mixin full-width-styles {
+      align-items: flex-start;
+      background-color: inherit;
+      box-shadow: none;
+      flex-direction: row;
+      padding: 0;
+      padding-inline-end: 36px;
+      text-align: inherit;
+    }
+
+    @media (min-width: $break-point-medium) {
+      @include full-width-styles;
+    }
+
+    // Disable breakpoints for now if discovery stream is enabled.
+    .ds-outer-wrapper-breakpoint-override & {
+      @include full-width-styles;
+    }
+  }
+
+  &.active {
+    .innerWrapper {
+      background-color: var(--newtab-element-hover-color);
+    }
+  }
+
+  .blockButton {
+    display: block;
+    inset-inline-end: 15px;
+    opacity: 1;
+    top: 24px;
+  }
+
+  .icon {
+    height: 32px;
+    margin-inline-start: 12px;
+    width: 32px;
+
+    @mixin full-width-styles {
+      height: 24px;
+      margin-top: 10px;
+      width: 24px;
+    }
+
+    @media (min-width: $break-point-medium) {
+      @include full-width-styles;
+    }
+
+    // Disable breakpoints for now if discovery stream is enabled.
+    .ds-outer-wrapper-breakpoint-override & {
+      @include full-width-styles;
+    }
+  }
+
+  .body {
+    margin: 8px 0 0;
+
+    @media (min-width: $break-point-medium) {
+      margin: 12px 0;
+    }
+
+    // Disable breakpoints for now if discovery stream is enabled.
+    .ds-outer-wrapper-breakpoint-override & {
+      margin: 12px 0;
+    }
+
+    a {
+      font-weight: 600;
+    }
+  }
+}
--- a/browser/components/newtab/content-src/asrouter/templates/template-manifest.jsx
+++ b/browser/components/newtab/content-src/asrouter/templates/template-manifest.jsx
@@ -1,14 +1,16 @@
 import {EOYSnippet} from "./EOYSnippet/EOYSnippet";
 import {FXASignupSnippet} from "./FXASignupSnippet/FXASignupSnippet";
 import {NewsletterSnippet} from "./NewsletterSnippet/NewsletterSnippet";
 import {SendToDeviceSnippet} from "./SendToDeviceSnippet/SendToDeviceSnippet";
+import {SimpleBelowSearchSnippet} from "./SimpleBelowSearchSnippet/SimpleBelowSearchSnippet";
 import {SimpleSnippet} from "./SimpleSnippet/SimpleSnippet";
 
 // Key names matching schema name of templates
 export const SnippetsTemplates = {
   simple_snippet: SimpleSnippet,
   newsletter_snippet: NewsletterSnippet,
   fxa_signup_snippet: FXASignupSnippet,
   send_to_device_snippet: SendToDeviceSnippet,
   eoy_snippet: EOYSnippet,
+  simple_below_search_snippet: SimpleBelowSearchSnippet,
 };
--- a/browser/components/newtab/content-src/components/Base/Base.jsx
+++ b/browser/components/newtab/content-src/components/Base/Base.jsx
@@ -1,17 +1,17 @@
 import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
 import {addLocaleData, injectIntl, IntlProvider} from "react-intl";
 import {ASRouterAdmin} from "content-src/components/ASRouterAdmin/ASRouterAdmin";
+import {ASRouterUISurface} from "../../asrouter/asrouter-content";
 import {ConfirmDialog} from "content-src/components/ConfirmDialog/ConfirmDialog";
 import {connect} from "react-redux";
 import {DarkModeMessage} from "content-src/components/DarkModeMessage/DarkModeMessage";
 import {DiscoveryStreamBase} from "content-src/components/DiscoveryStreamBase/DiscoveryStreamBase";
 import {ErrorBoundary} from "content-src/components/ErrorBoundary/ErrorBoundary";
-import {ManualMigration} from "content-src/components/ManualMigration/ManualMigration";
 import {PrerenderData} from "common/PrerenderData.jsm";
 import React from "react";
 import {Search} from "content-src/components/Search/Search";
 import {Sections} from "content-src/components/Sections/Sections";
 
 let didLogDevtoolsHelpText = false;
 
 const PrefsButton = injectIntl(props => (
@@ -83,17 +83,20 @@ export class _Base extends React.PureCom
     const {props} = this;
     const {App, locale, strings} = props;
     const {initialized} = App;
 
     const prefs = props.Prefs.values;
     if (prefs["asrouter.devtoolsEnabled"]) {
       if (window.location.hash.startsWith("#asrouter") ||
           window.location.hash.startsWith("#devtools")) {
-        return (<ASRouterAdmin />);
+        return (<div>
+          <ASRouterAdmin />
+          <ASRouterUISurface dispatch={this.props.dispatch} />
+        </div>);
       } else if (!didLogDevtoolsHelpText) {
         console.log("Activity Stream devtools enabled. To access visit %cabout:newtab#devtools", "font-weight: bold"); // eslint-disable-line no-console
         didLogDevtoolsHelpText = true;
       }
     }
 
     if (!props.isPrerendered && !initialized) {
       return null;
@@ -163,22 +166,18 @@ export class BaseContent extends React.P
           <main>
             {prefs.showSearch &&
               <div className="non-collapsible-section">
                 <ErrorBoundary>
                   <Search showLogo={noSectionsEnabled} handoffEnabled={searchHandoffEnabled} {...props.Search} />
                 </ErrorBoundary>
               </div>
             }
+            <ASRouterUISurface dispatch={this.props.dispatch} />
             <div className={`body-wrapper${(initialized ? " on" : "")}`}>
-              {!isDiscoveryStream && !prefs.migrationExpired &&
-                <div className="non-collapsible-section">
-                  <ManualMigration />
-                </div>
-                }
               {isDiscoveryStream ? (
                 <ErrorBoundary className="borderless-error">
                   {prefs.darkModeMessage && <DarkModeMessage />}
                   <DiscoveryStreamBase />
                 </ErrorBoundary>) : <Sections />}
               <PrefsButton onClick={this.openPreferences} />
             </div>
             <ConfirmDialog />
deleted file mode 100644
--- a/browser/components/newtab/content-src/components/ManualMigration/ManualMigration.jsx
+++ /dev/null
@@ -1,49 +0,0 @@
-import {actionCreators as ac, actionTypes as at} from "common/Actions.jsm";
-import {connect} from "react-redux";
-import {FormattedMessage} from "react-intl";
-import React from "react";
-
-/**
- * Manual migration component used to start the profile import wizard.
- * Message is presented temporarily and will go away if:
- * 1.  User clicks "No Thanks"
- * 2.  User completed the data import
- * 3.  After 3 active days
- * 4.  User clicks "Cancel" on the import wizard (currently not implemented).
- */
-export class _ManualMigration extends React.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onLaunchTour = this.onLaunchTour.bind(this);
-    this.onCancelTour = this.onCancelTour.bind(this);
-  }
-
-  onLaunchTour() {
-    this.props.dispatch(ac.AlsoToMain({type: at.MIGRATION_START}));
-    this.props.dispatch(ac.UserEvent({event: at.MIGRATION_START}));
-  }
-
-  onCancelTour() {
-    this.props.dispatch(ac.AlsoToMain({type: at.MIGRATION_CANCEL}));
-    this.props.dispatch(ac.UserEvent({event: at.MIGRATION_CANCEL}));
-  }
-
-  render() {
-    return (<div className="manual-migration-container">
-        <p>
-          <span className="icon icon-import" />
-          <FormattedMessage id="manual_migration_explanation2" />
-        </p>
-        <div className="manual-migration-actions actions">
-          <button className="dismiss" onClick={this.onCancelTour}>
-            <FormattedMessage id="manual_migration_cancel_button" />
-          </button>
-          <button onClick={this.onLaunchTour}>
-            <FormattedMessage id="manual_migration_import_button" />
-          </button>
-        </div>
-    </div>);
-  }
-}
-
-export const ManualMigration = connect()(_ManualMigration);
deleted file mode 100644
--- a/browser/components/newtab/content-src/components/ManualMigration/_ManualMigration.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-.manual-migration-container {
-  color: var(--newtab-text-conditional-color);
-  font-size: 13px;
-  line-height: 15px;
-  margin-bottom: $section-spacing;
-  text-align: center;
-
-  @media (min-width: $break-point-medium) {
-    display: flex;
-    justify-content: space-between;
-    text-align: left;
-  }
-
-  p {
-    margin: 0;
-    @media (min-width: $break-point-medium) {
-      align-self: center;
-      display: flex;
-      justify-content: space-between;
-    }
-  }
-
-  .icon {
-    display: none;
-    @media (min-width: $break-point-medium) {
-      align-self: center;
-      display: block;
-      fill: var(--newtab-icon-secondary-color);
-      margin-inline-end: 6px;
-    }
-  }
-}
-
-.manual-migration-actions {
-  border: 0;
-  display: block;
-  flex-wrap: nowrap;
-
-  @media (min-width: $break-point-medium) {
-    display: flex;
-    justify-content: space-between;
-    padding: 0;
-  }
-
-  button {
-    align-self: center;
-    height: 26px;
-    margin: 0;
-    margin-inline-start: 20px;
-    padding: 0 12px;
-  }
-}
--- a/browser/components/newtab/content-src/components/Search/_Search.scss
+++ b/browser/components/newtab/content-src/components/Search/_Search.scss
@@ -3,22 +3,16 @@
 $search-icon-padding: 12px;
 $search-icon-width: 2 * $search-icon-padding + $search-icon-size -2;
 $search-button-width: 48px;
 $glyph-forward: url('chrome://browser/skin/forward.svg');
 
 .search-wrapper {
   padding: 34px 0 64px;
 
-  @media (max-height: 700px) {
-    & {
-      padding: 0 0 30px;
-    }
-  }
-
   .only-search & {
     padding: 0 0 64px;
   }
 
   .logo-and-wordmark {
     $logo-size: 97px;
     $wordmark-size: 142px;
 
@@ -132,16 +126,54 @@
     }
 
     &:dir(rtl) {
       transform: scaleX(-1);
     }
   }
 }
 
+.below-search-snippet {
+  margin: 0 auto 16px;
+  width: $searchbar-width-small;
+
+  @media (min-width: $break-point-medium) {
+    width: $searchbar-width-medium;
+  }
+
+  @media (min-width: $break-point-large) {
+    width: $searchbar-width-large;
+  }
+
+  // Disable breakpoints for now if discovery stream is enabled.
+  .ds-outer-wrapper-breakpoint-override & {
+    width: $searchbar-width-large;
+  }
+}
+
+.non-collapsible-section + .below-search-snippet {
+  // If search is enabled, we need to invade its large bottom padding.
+  margin-top: -48px;
+}
+
+@media (max-height: 700px) {
+  .search-wrapper {
+    padding: 0 0 30px;
+  }
+
+  .non-collapsible-section + .below-search-snippet {
+    // In shorter windows, search doesn't have such a large padding.
+    margin-top: -14px;
+  }
+
+  .below-search-snippet {
+    min-height: 0;
+  }
+}
+
 .search-handoff-button {
   background: var(--newtab-textbox-background-color) var(--newtab-search-icon) $search-icon-padding center no-repeat;
   background-size: $search-icon-size;
   border: solid 1px var(--newtab-search-border-color);
   border-radius: 3px;
   box-shadow: $shadow-secondary, 0 0 0 1px $black-15;
   cursor: text;
   font-size: 15px;
deleted file mode 100644
--- a/browser/components/newtab/content-src/lib/asroutercontent.js
+++ /dev/null
@@ -1,15 +0,0 @@
-export function enableASRouterContent(store, asrouterContent) {
-  // Enable asrouter content
-  store.subscribe(() => {
-    const state = store.getState();
-    if (!state.ASRouter.initialized) {
-      return;
-    }
-
-    if (!asrouterContent.initialized) {
-      asrouterContent.init(store);
-    }
-  });
-  // Return this for testing purposes
-  return {asrouterContent};
-}
--- a/browser/components/newtab/content-src/styles/_activity-stream.scss
+++ b/browser/components/newtab/content-src/styles/_activity-stream.scss
@@ -119,32 +119,26 @@ a {
 
 input {
   &[type='text'],
   &[type='search'] {
     border-radius: $border-radius;
   }
 }
 
-// Make sure snippets show up above other UI elements
-#snippets-container { // sass-lint:disable-line no-ids
-  z-index: 1;
-}
-
 // Components
 @import '../components/Base/Base';
 @import '../components/ErrorBoundary/ErrorBoundary';
 @import '../components/TopSites/TopSites';
 @import '../components/Sections/Sections';
 @import '../components/Topics/Topics';
 @import '../components/Search/Search';
 @import '../components/ContextMenu/ContextMenu';
 @import '../components/ConfirmDialog/ConfirmDialog';
 @import '../components/Card/Card';
-@import '../components/ManualMigration/ManualMigration';
 @import '../components/CollapsibleSection/CollapsibleSection';
 @import '../components/ASRouterAdmin/ASRouterAdmin';
 @import '../components/PocketLoggedInCta/PocketLoggedInCta';
 @import '../components/MoreRecommendations/MoreRecommendations';
 @import '../components/DiscoveryStreamBase/DiscoveryStreamBase';
 @import '../components/DarkModeMessage/DarkModeMessage';
 
 // Discovery Stream Components
@@ -160,13 +154,14 @@ input {
 @import '../components/DiscoveryStreamComponents/DSMessage/DSMessage';
 @import '../components/DiscoveryStreamImpressionStats/ImpressionStats';
 
 // AS Router
 @import '../asrouter/components/Button/Button';
 @import '../asrouter/components/SnippetBase/SnippetBase';
 @import '../asrouter/components/ModalOverlay/ModalOverlay';
 @import '../asrouter/templates/ReturnToAMO/ReturnToAMO';
+@import '../asrouter/templates/SimpleBelowSearchSnippet/SimpleBelowSearchSnippet';
 @import '../asrouter/templates/SimpleSnippet/SimpleSnippet';
 @import '../asrouter/templates/SubmitFormSnippet/SubmitFormSnippet';
 @import '../asrouter/templates/OnboardingMessage/OnboardingMessage';
 @import '../asrouter/templates/EOYSnippet/EOYSnippet';
 @import '../asrouter/templates/StartupOverlay/StartupOverlay';
--- a/browser/components/newtab/content-src/styles/_icons.scss
+++ b/browser/components/newtab/content-src/styles/_icons.scss
@@ -49,20 +49,16 @@
   &.icon-dismiss {
     background-image: url('#{$image-path}glyph-dismiss-16.svg');
   }
 
   &.icon-info {
     background-image: url('#{$image-path}glyph-info-16.svg');
   }
 
-  &.icon-import {
-    background-image: url('#{$image-path}glyph-import-16.svg');
-  }
-
   &.icon-new-window {
     @include flip-icon;
     background-image: url('#{$image-path}glyph-newWindow-16.svg');
   }
 
   &.icon-new-window-private {
     background-image: url('chrome://browser/skin/privateBrowsing.svg');
   }
--- a/browser/components/newtab/css/activity-stream-linux.css
+++ b/browser/components/newtab/css/activity-stream-linux.css
@@ -143,18 +143,16 @@ body {
     background-image: url("../data/content/assets/glyph-modal-delete-32.svg");
     background-size: 32px;
     height: 32px;
     width: 32px; }
   .icon.icon-dismiss {
     background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
   .icon.icon-info {
     background-image: url("../data/content/assets/glyph-info-16.svg"); }
-  .icon.icon-import {
-    background-image: url("../data/content/assets/glyph-import-16.svg"); }
   .icon.icon-new-window {
     background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
     .icon.icon-new-window:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-new-window-private {
     background-image: url("chrome://browser/skin/privateBrowsing.svg"); }
   .icon.icon-settings {
     background-image: url("chrome://browser/skin/settings.svg"); }
@@ -314,19 +312,16 @@ a {
     background-color: var(--newtab-button-primary-color);
     border: solid 1px var(--newtab-button-primary-color);
     color: #FFF;
     margin-inline-start: auto; }
 
 input[type='text'], input[type='search'] {
   border-radius: 3px; }
 
-#snippets-container {
-  z-index: 1; }
-
 .outer-wrapper {
   color: var(--newtab-text-primary-color);
   display: flex;
   flex-grow: 1;
   min-height: 100vh;
   padding: 30px 32px 32px; }
   .outer-wrapper.fixed-to-top {
     display: block; }
@@ -974,19 +969,16 @@ main {
   .topics ul li::after {
     content: '•';
     padding: 8px; }
   .topics ul li:last-child::after {
     content: none; }
 
 .search-wrapper {
   padding: 34px 0 64px; }
-  @media (max-height: 700px) {
-    .search-wrapper {
-      padding: 0 0 30px; } }
   .only-search .search-wrapper {
     padding: 0 0 64px; }
   .search-wrapper .logo-and-wordmark {
     align-items: center;
     display: flex;
     justify-content: center;
     margin-bottom: 49px; }
     .search-wrapper .logo-and-wordmark .logo {
@@ -1060,16 +1052,39 @@ main {
     .search-wrapper .search-button:focus, .search-wrapper .search-button:hover {
       background-color: rgba(12, 12, 13, 0.1);
       cursor: pointer; }
     .search-wrapper .search-button:active {
       background-color: rgba(12, 12, 13, 0.2); }
     .search-wrapper .search-button:dir(rtl) {
       transform: scaleX(-1); }
 
+.below-search-snippet {
+  margin: 0 auto 16px;
+  width: 224px; }
+  @media (min-width: 610px) {
+    .below-search-snippet {
+      width: 480px; } }
+  @media (min-width: 866px) {
+    .below-search-snippet {
+      width: 736px; } }
+  .ds-outer-wrapper-breakpoint-override .below-search-snippet {
+    width: 736px; }
+
+.non-collapsible-section + .below-search-snippet {
+  margin-top: -48px; }
+
+@media (max-height: 700px) {
+  .search-wrapper {
+    padding: 0 0 30px; }
+  .non-collapsible-section + .below-search-snippet {
+    margin-top: -14px; }
+  .below-search-snippet {
+    min-height: 0; } }
+
 .search-handoff-button {
   background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
   background-size: 24px;
   border: solid 1px var(--newtab-search-border-color);
   border-radius: 3px;
   box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.15);
   cursor: text;
   font-size: 15px;
@@ -1507,59 +1522,16 @@ main {
         fill: #D70022; }
     .compact-cards .card-outer .card-context .card-context-label {
       display: none; }
 
 @media not all and (min-width: 1122px) {
   .compact-cards .hide-for-narrow {
     display: none; } }
 
-.manual-migration-container {
-  color: var(--newtab-text-conditional-color);
-  font-size: 13px;
-  line-height: 15px;
-  margin-bottom: 20px;
-  text-align: center; }
-  @media (min-width: 610px) {
-    .manual-migration-container {
-      display: flex;
-      justify-content: space-between;
-      text-align: left; } }
-  .manual-migration-container p {
-    margin: 0; }
-    @media (min-width: 610px) {
-      .manual-migration-container p {
-        align-self: center;
-        display: flex;
-        justify-content: space-between; } }
-  .manual-migration-container .icon {
-    display: none; }
-    @media (min-width: 610px) {
-      .manual-migration-container .icon {
-        align-self: center;
-        display: block;
-        fill: var(--newtab-icon-secondary-color);
-        margin-inline-end: 6px; } }
-
-.manual-migration-actions {
-  border: 0;
-  display: block;
-  flex-wrap: nowrap; }
-  @media (min-width: 610px) {
-    .manual-migration-actions {
-      display: flex;
-      justify-content: space-between;
-      padding: 0; } }
-  .manual-migration-actions button {
-    align-self: center;
-    height: 26px;
-    margin: 0;
-    margin-inline-start: 20px;
-    padding: 0 12px; }
-
 .collapsible-section {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
@@ -2947,16 +2919,78 @@ main {
     background-position: center center;
     background-repeat: no-repeat;
     background-image: url("resource://activity-stream/data/content/assets/gift-extension.svg"); }
   .ReturnToAMOOverlay .icon-add,
   .amo + body.hide-main .icon-add {
     fill: #FFF;
     vertical-align: sub; }
 
+.SimpleBelowSearchSnippet {
+  background-color: inherit;
+  border: 0;
+  box-shadow: none;
+  position: relative;
+  z-index: auto; }
+  .SimpleBelowSearchSnippet .innerWrapper {
+    align-items: center;
+    background-color: var(--newtab-card-background-color);
+    border-radius: 4px;
+    box-shadow: var(--newtab-card-shadow);
+    flex-direction: column;
+    padding: 16px;
+    text-align: center;
+    width: 100%; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .innerWrapper {
+        align-items: flex-start;
+        background-color: inherit;
+        box-shadow: none;
+        flex-direction: row;
+        padding: 0;
+        padding-inline-end: 36px;
+        text-align: inherit; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
+      align-items: flex-start;
+      background-color: inherit;
+      box-shadow: none;
+      flex-direction: row;
+      padding: 0;
+      padding-inline-end: 36px;
+      text-align: inherit; }
+  .SimpleBelowSearchSnippet.active .innerWrapper {
+    background-color: var(--newtab-element-hover-color); }
+  .SimpleBelowSearchSnippet .blockButton {
+    display: block;
+    inset-inline-end: 15px;
+    opacity: 1;
+    top: 24px; }
+  .SimpleBelowSearchSnippet .icon {
+    height: 32px;
+    margin-inline-start: 12px;
+    width: 32px; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .icon {
+        height: 24px;
+        margin-top: 10px;
+        width: 24px; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .icon {
+      height: 24px;
+      margin-top: 10px;
+      width: 24px; }
+  .SimpleBelowSearchSnippet .body {
+    margin: 8px 0 0; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .body {
+        margin: 12px 0; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
+      margin: 12px 0; }
+    .SimpleBelowSearchSnippet .body a {
+      font-weight: 600; }
+
 .SimpleSnippet.tall {
   padding: 27px 0; }
 
 .SimpleSnippet p em {
   color: #0C0C0D;
   font-style: normal;
   background: #FFE900; }
 
--- a/browser/components/newtab/css/activity-stream-mac.css
+++ b/browser/components/newtab/css/activity-stream-mac.css
@@ -146,18 +146,16 @@ body {
     background-image: url("../data/content/assets/glyph-modal-delete-32.svg");
     background-size: 32px;
     height: 32px;
     width: 32px; }
   .icon.icon-dismiss {
     background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
   .icon.icon-info {
     background-image: url("../data/content/assets/glyph-info-16.svg"); }
-  .icon.icon-import {
-    background-image: url("../data/content/assets/glyph-import-16.svg"); }
   .icon.icon-new-window {
     background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
     .icon.icon-new-window:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-new-window-private {
     background-image: url("chrome://browser/skin/privateBrowsing.svg"); }
   .icon.icon-settings {
     background-image: url("chrome://browser/skin/settings.svg"); }
@@ -317,19 +315,16 @@ a {
     background-color: var(--newtab-button-primary-color);
     border: solid 1px var(--newtab-button-primary-color);
     color: #FFF;
     margin-inline-start: auto; }
 
 input[type='text'], input[type='search'] {
   border-radius: 3px; }
 
-#snippets-container {
-  z-index: 1; }
-
 .outer-wrapper {
   color: var(--newtab-text-primary-color);
   display: flex;
   flex-grow: 1;
   min-height: 100vh;
   padding: 30px 32px 32px; }
   .outer-wrapper.fixed-to-top {
     display: block; }
@@ -977,19 +972,16 @@ main {
   .topics ul li::after {
     content: '•';
     padding: 8px; }
   .topics ul li:last-child::after {
     content: none; }
 
 .search-wrapper {
   padding: 34px 0 64px; }
-  @media (max-height: 700px) {
-    .search-wrapper {
-      padding: 0 0 30px; } }
   .only-search .search-wrapper {
     padding: 0 0 64px; }
   .search-wrapper .logo-and-wordmark {
     align-items: center;
     display: flex;
     justify-content: center;
     margin-bottom: 49px; }
     .search-wrapper .logo-and-wordmark .logo {
@@ -1063,16 +1055,39 @@ main {
     .search-wrapper .search-button:focus, .search-wrapper .search-button:hover {
       background-color: rgba(12, 12, 13, 0.1);
       cursor: pointer; }
     .search-wrapper .search-button:active {
       background-color: rgba(12, 12, 13, 0.2); }
     .search-wrapper .search-button:dir(rtl) {
       transform: scaleX(-1); }
 
+.below-search-snippet {
+  margin: 0 auto 16px;
+  width: 224px; }
+  @media (min-width: 610px) {
+    .below-search-snippet {
+      width: 480px; } }
+  @media (min-width: 866px) {
+    .below-search-snippet {
+      width: 736px; } }
+  .ds-outer-wrapper-breakpoint-override .below-search-snippet {
+    width: 736px; }
+
+.non-collapsible-section + .below-search-snippet {
+  margin-top: -48px; }
+
+@media (max-height: 700px) {
+  .search-wrapper {
+    padding: 0 0 30px; }
+  .non-collapsible-section + .below-search-snippet {
+    margin-top: -14px; }
+  .below-search-snippet {
+    min-height: 0; } }
+
 .search-handoff-button {
   background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
   background-size: 24px;
   border: solid 1px var(--newtab-search-border-color);
   border-radius: 3px;
   box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.15);
   cursor: text;
   font-size: 15px;
@@ -1510,59 +1525,16 @@ main {
         fill: #D70022; }
     .compact-cards .card-outer .card-context .card-context-label {
       display: none; }
 
 @media not all and (min-width: 1122px) {
   .compact-cards .hide-for-narrow {
     display: none; } }
 
-.manual-migration-container {
-  color: var(--newtab-text-conditional-color);
-  font-size: 13px;
-  line-height: 15px;
-  margin-bottom: 20px;
-  text-align: center; }
-  @media (min-width: 610px) {
-    .manual-migration-container {
-      display: flex;
-      justify-content: space-between;
-      text-align: left; } }
-  .manual-migration-container p {
-    margin: 0; }
-    @media (min-width: 610px) {
-      .manual-migration-container p {
-        align-self: center;
-        display: flex;
-        justify-content: space-between; } }
-  .manual-migration-container .icon {
-    display: none; }
-    @media (min-width: 610px) {
-      .manual-migration-container .icon {
-        align-self: center;
-        display: block;
-        fill: var(--newtab-icon-secondary-color);
-        margin-inline-end: 6px; } }
-
-.manual-migration-actions {
-  border: 0;
-  display: block;
-  flex-wrap: nowrap; }
-  @media (min-width: 610px) {
-    .manual-migration-actions {
-      display: flex;
-      justify-content: space-between;
-      padding: 0; } }
-  .manual-migration-actions button {
-    align-self: center;
-    height: 26px;
-    margin: 0;
-    margin-inline-start: 20px;
-    padding: 0 12px; }
-
 .collapsible-section {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
@@ -2950,16 +2922,78 @@ main {
     background-position: center center;
     background-repeat: no-repeat;
     background-image: url("resource://activity-stream/data/content/assets/gift-extension.svg"); }
   .ReturnToAMOOverlay .icon-add,
   .amo + body.hide-main .icon-add {
     fill: #FFF;
     vertical-align: sub; }
 
+.SimpleBelowSearchSnippet {
+  background-color: inherit;
+  border: 0;
+  box-shadow: none;
+  position: relative;
+  z-index: auto; }
+  .SimpleBelowSearchSnippet .innerWrapper {
+    align-items: center;
+    background-color: var(--newtab-card-background-color);
+    border-radius: 4px;
+    box-shadow: var(--newtab-card-shadow);
+    flex-direction: column;
+    padding: 16px;
+    text-align: center;
+    width: 100%; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .innerWrapper {
+        align-items: flex-start;
+        background-color: inherit;
+        box-shadow: none;
+        flex-direction: row;
+        padding: 0;
+        padding-inline-end: 36px;
+        text-align: inherit; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
+      align-items: flex-start;
+      background-color: inherit;
+      box-shadow: none;
+      flex-direction: row;
+      padding: 0;
+      padding-inline-end: 36px;
+      text-align: inherit; }
+  .SimpleBelowSearchSnippet.active .innerWrapper {
+    background-color: var(--newtab-element-hover-color); }
+  .SimpleBelowSearchSnippet .blockButton {
+    display: block;
+    inset-inline-end: 15px;
+    opacity: 1;
+    top: 24px; }
+  .SimpleBelowSearchSnippet .icon {
+    height: 32px;
+    margin-inline-start: 12px;
+    width: 32px; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .icon {
+        height: 24px;
+        margin-top: 10px;
+        width: 24px; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .icon {
+      height: 24px;
+      margin-top: 10px;
+      width: 24px; }
+  .SimpleBelowSearchSnippet .body {
+    margin: 8px 0 0; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .body {
+        margin: 12px 0; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
+      margin: 12px 0; }
+    .SimpleBelowSearchSnippet .body a {
+      font-weight: 600; }
+
 .SimpleSnippet.tall {
   padding: 27px 0; }
 
 .SimpleSnippet p em {
   color: #0C0C0D;
   font-style: normal;
   background: #FFE900; }
 
--- a/browser/components/newtab/css/activity-stream-windows.css
+++ b/browser/components/newtab/css/activity-stream-windows.css
@@ -143,18 +143,16 @@ body {
     background-image: url("../data/content/assets/glyph-modal-delete-32.svg");
     background-size: 32px;
     height: 32px;
     width: 32px; }
   .icon.icon-dismiss {
     background-image: url("../data/content/assets/glyph-dismiss-16.svg"); }
   .icon.icon-info {
     background-image: url("../data/content/assets/glyph-info-16.svg"); }
-  .icon.icon-import {
-    background-image: url("../data/content/assets/glyph-import-16.svg"); }
   .icon.icon-new-window {
     background-image: url("../data/content/assets/glyph-newWindow-16.svg"); }
     .icon.icon-new-window:dir(rtl) {
       transform: scaleX(-1); }
   .icon.icon-new-window-private {
     background-image: url("chrome://browser/skin/privateBrowsing.svg"); }
   .icon.icon-settings {
     background-image: url("chrome://browser/skin/settings.svg"); }
@@ -314,19 +312,16 @@ a {
     background-color: var(--newtab-button-primary-color);
     border: solid 1px var(--newtab-button-primary-color);
     color: #FFF;
     margin-inline-start: auto; }
 
 input[type='text'], input[type='search'] {
   border-radius: 3px; }
 
-#snippets-container {
-  z-index: 1; }
-
 .outer-wrapper {
   color: var(--newtab-text-primary-color);
   display: flex;
   flex-grow: 1;
   min-height: 100vh;
   padding: 30px 32px 32px; }
   .outer-wrapper.fixed-to-top {
     display: block; }
@@ -974,19 +969,16 @@ main {
   .topics ul li::after {
     content: '•';
     padding: 8px; }
   .topics ul li:last-child::after {
     content: none; }
 
 .search-wrapper {
   padding: 34px 0 64px; }
-  @media (max-height: 700px) {
-    .search-wrapper {
-      padding: 0 0 30px; } }
   .only-search .search-wrapper {
     padding: 0 0 64px; }
   .search-wrapper .logo-and-wordmark {
     align-items: center;
     display: flex;
     justify-content: center;
     margin-bottom: 49px; }
     .search-wrapper .logo-and-wordmark .logo {
@@ -1060,16 +1052,39 @@ main {
     .search-wrapper .search-button:focus, .search-wrapper .search-button:hover {
       background-color: rgba(12, 12, 13, 0.1);
       cursor: pointer; }
     .search-wrapper .search-button:active {
       background-color: rgba(12, 12, 13, 0.2); }
     .search-wrapper .search-button:dir(rtl) {
       transform: scaleX(-1); }
 
+.below-search-snippet {
+  margin: 0 auto 16px;
+  width: 224px; }
+  @media (min-width: 610px) {
+    .below-search-snippet {
+      width: 480px; } }
+  @media (min-width: 866px) {
+    .below-search-snippet {
+      width: 736px; } }
+  .ds-outer-wrapper-breakpoint-override .below-search-snippet {
+    width: 736px; }
+
+.non-collapsible-section + .below-search-snippet {
+  margin-top: -48px; }
+
+@media (max-height: 700px) {
+  .search-wrapper {
+    padding: 0 0 30px; }
+  .non-collapsible-section + .below-search-snippet {
+    margin-top: -14px; }
+  .below-search-snippet {
+    min-height: 0; } }
+
 .search-handoff-button {
   background: var(--newtab-textbox-background-color) var(--newtab-search-icon) 12px center no-repeat;
   background-size: 24px;
   border: solid 1px var(--newtab-search-border-color);
   border-radius: 3px;
   box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.15);
   cursor: text;
   font-size: 15px;
@@ -1507,59 +1522,16 @@ main {
         fill: #D70022; }
     .compact-cards .card-outer .card-context .card-context-label {
       display: none; }
 
 @media not all and (min-width: 1122px) {
   .compact-cards .hide-for-narrow {
     display: none; } }
 
-.manual-migration-container {
-  color: var(--newtab-text-conditional-color);
-  font-size: 13px;
-  line-height: 15px;
-  margin-bottom: 20px;
-  text-align: center; }
-  @media (min-width: 610px) {
-    .manual-migration-container {
-      display: flex;
-      justify-content: space-between;
-      text-align: left; } }
-  .manual-migration-container p {
-    margin: 0; }
-    @media (min-width: 610px) {
-      .manual-migration-container p {
-        align-self: center;
-        display: flex;
-        justify-content: space-between; } }
-  .manual-migration-container .icon {
-    display: none; }
-    @media (min-width: 610px) {
-      .manual-migration-container .icon {
-        align-self: center;
-        display: block;
-        fill: var(--newtab-icon-secondary-color);
-        margin-inline-end: 6px; } }
-
-.manual-migration-actions {
-  border: 0;
-  display: block;
-  flex-wrap: nowrap; }
-  @media (min-width: 610px) {
-    .manual-migration-actions {
-      display: flex;
-      justify-content: space-between;
-      padding: 0; } }
-  .manual-migration-actions button {
-    align-self: center;
-    height: 26px;
-    margin: 0;
-    margin-inline-start: 20px;
-    padding: 0 12px; }
-
 .collapsible-section {
   padding: 10px 25px;
   transition-delay: 100ms;
   transition-duration: 100ms;
   transition-property: background-color; }
   .collapsible-section .section-title {
     font-size: 13px;
     font-weight: bold;
@@ -2947,16 +2919,78 @@ main {
     background-position: center center;
     background-repeat: no-repeat;
     background-image: url("resource://activity-stream/data/content/assets/gift-extension.svg"); }
   .ReturnToAMOOverlay .icon-add,
   .amo + body.hide-main .icon-add {
     fill: #FFF;
     vertical-align: sub; }
 
+.SimpleBelowSearchSnippet {
+  background-color: inherit;
+  border: 0;
+  box-shadow: none;
+  position: relative;
+  z-index: auto; }
+  .SimpleBelowSearchSnippet .innerWrapper {
+    align-items: center;
+    background-color: var(--newtab-card-background-color);
+    border-radius: 4px;
+    box-shadow: var(--newtab-card-shadow);
+    flex-direction: column;
+    padding: 16px;
+    text-align: center;
+    width: 100%; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .innerWrapper {
+        align-items: flex-start;
+        background-color: inherit;
+        box-shadow: none;
+        flex-direction: row;
+        padding: 0;
+        padding-inline-end: 36px;
+        text-align: inherit; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .innerWrapper {
+      align-items: flex-start;
+      background-color: inherit;
+      box-shadow: none;
+      flex-direction: row;
+      padding: 0;
+      padding-inline-end: 36px;
+      text-align: inherit; }
+  .SimpleBelowSearchSnippet.active .innerWrapper {
+    background-color: var(--newtab-element-hover-color); }
+  .SimpleBelowSearchSnippet .blockButton {
+    display: block;
+    inset-inline-end: 15px;
+    opacity: 1;
+    top: 24px; }
+  .SimpleBelowSearchSnippet .icon {
+    height: 32px;
+    margin-inline-start: 12px;
+    width: 32px; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .icon {
+        height: 24px;
+        margin-top: 10px;
+        width: 24px; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .icon {
+      height: 24px;
+      margin-top: 10px;
+      width: 24px; }
+  .SimpleBelowSearchSnippet .body {
+    margin: 8px 0 0; }
+    @media (min-width: 610px) {
+      .SimpleBelowSearchSnippet .body {
+        margin: 12px 0; } }
+    .ds-outer-wrapper-breakpoint-override .SimpleBelowSearchSnippet .body {
+      margin: 12px 0; }
+    .SimpleBelowSearchSnippet .body a {
+      font-weight: 600; }
+
 .SimpleSnippet.tall {
   padding: 27px 0; }
 
 .SimpleSnippet p em {
   color: #0C0C0D;
   font-style: normal;
   background: #FFE900; }
 
--- a/browser/components/newtab/data/content/activity-stream.bundle.js
+++ b/browser/components/newtab/data/content/activity-stream.bundle.js
@@ -87,57 +87,51 @@
 /******/ ([
 /* 0 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var content_src_lib_snippets__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
-/* harmony import */ var content_src_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
-/* harmony import */ var content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25);
-/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(53);
-/* harmony import */ var content_src_lib_asroutercontent__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(54);
-/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(24);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(14);
-/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_9__);
-/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(59);
-
-
-
-
-
-
-
-
-
-
-
-
-const store = Object(content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_6__["initStore"])(common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_10__["reducers"], global.gActivityStreamPrerenderedState);
-const asrouterContent = new content_src_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_2__["ASRouterContent"]();
-
-new content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_4__["DetectUserSessionStart"](store).sendEventOrAddListener();
+/* harmony import */ var content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
+/* harmony import */ var content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(52);
+/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_6__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(16);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(57);
+
+
+
+
+
+
+
+
+
+
+const store = Object(content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_4__["initStore"])(common_Reducers_jsm__WEBPACK_IMPORTED_MODULE_8__["reducers"], global.gActivityStreamPrerenderedState);
+
+new content_src_lib_detect_user_session_start__WEBPACK_IMPORTED_MODULE_3__["DetectUserSessionStart"](store).sendEventOrAddListener();
 
 // If we are starting in a prerendered state, we must wait until the first render
 // to request state rehydration (see Base.jsx). If we are NOT in a prerendered state,
 // we can request it immedately.
 if (!global.gActivityStreamPrerenderedState) {
   store.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({ type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].NEW_TAB_STATE_REQUEST }));
 }
-Object(content_src_lib_asroutercontent__WEBPACK_IMPORTED_MODULE_5__["enableASRouterContent"])(store, asrouterContent);
-
-react_dom__WEBPACK_IMPORTED_MODULE_9___default.a.hydrate(react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(
-  react_redux__WEBPACK_IMPORTED_MODULE_7__["Provider"],
+
+react_dom__WEBPACK_IMPORTED_MODULE_7___default.a.hydrate(react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(
+  react_redux__WEBPACK_IMPORTED_MODULE_5__["Provider"],
   { store: store },
-  react__WEBPACK_IMPORTED_MODULE_8___default.a.createElement(content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_3__["Base"], {
+  react__WEBPACK_IMPORTED_MODULE_6___default.a.createElement(content_src_components_Base_Base__WEBPACK_IMPORTED_MODULE_2__["Base"], {
     isFirstrun: global.document.location.href === "about:welcome",
     isPrerendered: !!global.gActivityStreamPrerenderedState,
     locale: global.document.documentElement.lang,
     strings: global.gActivityStreamStrings })
 ), document.getElementById("root"));
 
 Object(content_src_lib_snippets__WEBPACK_IMPORTED_MODULE_1__["addSnippetsSubscriber"])(store);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
@@ -206,17 +200,17 @@ const globalImportContext = typeof Windo
 
 // Create an object that avoids accidental differing key/value pairs:
 // {
 //   INIT: "INIT",
 //   UNINIT: "UNINIT"
 // }
 const actionTypes = {};
 
-for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "MIGRATION_CANCEL", "MIGRATION_COMPLETED", "MIGRATION_START", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
+for (const type of ["ADDONS_INFO_REQUEST", "ADDONS_INFO_RESPONSE", "ARCHIVE_FROM_POCKET", "AS_ROUTER_INITIALIZED", "AS_ROUTER_PREF_CHANGED", "AS_ROUTER_TELEMETRY_USER_EVENT", "BLOCK_URL", "BOOKMARK_URL", "COPY_DOWNLOAD_LINK", "DELETE_BOOKMARK_BY_ID", "DELETE_FROM_POCKET", "DELETE_HISTORY_URL", "DIALOG_CANCEL", "DIALOG_OPEN", "DISCOVERY_STREAM_CONFIG_CHANGE", "DISCOVERY_STREAM_CONFIG_SETUP", "DISCOVERY_STREAM_CONFIG_SET_VALUE", "DISCOVERY_STREAM_FEEDS_UPDATE", "DISCOVERY_STREAM_IMPRESSION_STATS", "DISCOVERY_STREAM_LAYOUT_RESET", "DISCOVERY_STREAM_LAYOUT_UPDATE", "DISCOVERY_STREAM_OPT_OUT", "DISCOVERY_STREAM_SPOCS_ENDPOINT", "DISCOVERY_STREAM_SPOCS_UPDATE", "DISCOVERY_STREAM_SPOC_IMPRESSION", "DOWNLOAD_CHANGED", "FAKE_FOCUS_SEARCH", "FILL_SEARCH_TERM", "HANDOFF_SEARCH_TO_AWESOMEBAR", "HIDE_SEARCH", "INIT", "NEW_TAB_INIT", "NEW_TAB_INITIAL_STATE", "NEW_TAB_LOAD", "NEW_TAB_REHYDRATED", "NEW_TAB_STATE_REQUEST", "NEW_TAB_UNLOAD", "OPEN_DOWNLOAD_FILE", "OPEN_LINK", "OPEN_NEW_WINDOW", "OPEN_PRIVATE_WINDOW", "OPEN_WEBEXT_SETTINGS", "PAGE_PRERENDERED", "PLACES_BOOKMARK_ADDED", "PLACES_BOOKMARK_REMOVED", "PLACES_HISTORY_CLEARED", "PLACES_LINKS_CHANGED", "PLACES_LINK_BLOCKED", "PLACES_LINK_DELETED", "PLACES_SAVED_TO_POCKET", "POCKET_CTA", "POCKET_LOGGED_IN", "POCKET_WAITING_FOR_SPOC", "PREFS_INITIAL_VALUES", "PREF_CHANGED", "PREVIEW_REQUEST", "PREVIEW_REQUEST_CANCEL", "PREVIEW_RESPONSE", "REMOVE_DOWNLOAD_FILE", "RICH_ICON_MISSING", "SAVE_SESSION_PERF_DATA", "SAVE_TO_POCKET", "SCREENSHOT_UPDATED", "SECTION_DEREGISTER", "SECTION_DISABLE", "SECTION_ENABLE", "SECTION_MOVE", "SECTION_OPTIONS_CHANGED", "SECTION_REGISTER", "SECTION_UPDATE", "SECTION_UPDATE_CARD", "SETTINGS_CLOSE", "SETTINGS_OPEN", "SET_PREF", "SHOW_DOWNLOAD_FILE", "SHOW_FIREFOX_ACCOUNTS", "SHOW_SEARCH", "SKIPPED_SIGNIN", "SNIPPETS_BLOCKLIST_CLEARED", "SNIPPETS_BLOCKLIST_UPDATED", "SNIPPETS_DATA", "SNIPPETS_PREVIEW_MODE", "SNIPPETS_RESET", "SNIPPET_BLOCKED", "SUBMIT_EMAIL", "SYSTEM_TICK", "TELEMETRY_IMPRESSION_STATS", "TELEMETRY_PERFORMANCE_EVENT", "TELEMETRY_UNDESIRED_EVENT", "TELEMETRY_USER_EVENT", "TOP_SITES_CANCEL_EDIT", "TOP_SITES_CLOSE_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_EDIT", "TOP_SITES_INSERT", "TOP_SITES_OPEN_SEARCH_SHORTCUTS_MODAL", "TOP_SITES_PIN", "TOP_SITES_PREFS_UPDATED", "TOP_SITES_UNPIN", "TOP_SITES_UPDATED", "TOTAL_BOOKMARKS_REQUEST", "TOTAL_BOOKMARKS_RESPONSE", "UNINIT", "UPDATE_PINNED_SEARCH_SHORTCUTS", "UPDATE_SEARCH_SHORTCUTS", "UPDATE_SECTION_PREFS", "WEBEXT_CLICK", "WEBEXT_DISMISS"]) {
   actionTypes[type] = type;
 }
 
 // These are acceptable actions for AS Router messages to have. They can show up
 // as call-to-action buttons in snippets, onboarding tour, etc.
 const ASRouterActions = {};
 
 for (const type of ["INSTALL_ADDON_FROM_URL", "OPEN_APPLICATIONS_MENU", "OPEN_PRIVATE_BROWSER_WINDOW", "OPEN_URL", "OPEN_ABOUT_PAGE", "OPEN_PREFERENCES_PAGE", "SHOW_FIREFOX_ACCOUNTS", "PIN_CURRENT_TAB"]) {
@@ -938,1318 +932,35 @@ function addSnippetsSubscriber(store) {
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
 /* 4 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUtils", function() { return ASRouterUtils; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUISurface", function() { return ASRouterUISurface; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterContent", function() { return ASRouterContent; });
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
-/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8);
-/* harmony import */ var _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(58);
-/* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(12);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);
-/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(14);
-/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_8__);
-/* harmony import */ var _templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(15);
-/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(56);
-/* harmony import */ var _templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(23);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
-const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
-const ASR_CONTAINER_ID = "asr-newtab-container";
-
-const ASRouterUtils = {
-  addListener(listener) {
-    global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, listener);
-  },
-  removeListener(listener) {
-    global.RPMRemoveMessageListener(INCOMING_MESSAGE_NAME, listener);
-  },
-  sendMessage(action) {
-    global.RPMSendAsyncMessage(OUTGOING_MESSAGE_NAME, action);
-  },
-  blockById(id, options) {
-    ASRouterUtils.sendMessage({ type: "BLOCK_MESSAGE_BY_ID", data: Object.assign({ id }, options) });
-  },
-  dismissById(id) {
-    ASRouterUtils.sendMessage({ type: "DISMISS_MESSAGE_BY_ID", data: { id } });
-  },
-  dismissBundle(bundle) {
-    ASRouterUtils.sendMessage({ type: "DISMISS_BUNDLE", data: { bundle } });
-  },
-  executeAction(button_action) {
-    ASRouterUtils.sendMessage({
-      type: "USER_ACTION",
-      data: button_action
-    });
-  },
-  unblockById(id) {
-    ASRouterUtils.sendMessage({ type: "UNBLOCK_MESSAGE_BY_ID", data: { id } });
-  },
-  unblockBundle(bundle) {
-    ASRouterUtils.sendMessage({ type: "UNBLOCK_BUNDLE", data: { bundle } });
-  },
-  overrideMessage(id) {
-    ASRouterUtils.sendMessage({ type: "OVERRIDE_MESSAGE", data: { id } });
-  },
-  sendTelemetry(ping) {
-    const payload = common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__["actionCreators"].ASRouterUserEvent(ping);
-    global.RPMSendAsyncMessage(content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__["OUTGOING_MESSAGE_NAME"], payload);
-  },
-  getPreviewEndpoint() {
-    if (window.location.href.includes("endpoint")) {
-      const params = new URLSearchParams(window.location.href.slice(window.location.href.indexOf("endpoint")));
-      try {
-        const endpoint = new URL(params.get("endpoint"));
-        return {
-          url: endpoint.href,
-          snippetId: params.get("snippetId")
-        };
-      } catch (e) {}
-    }
-
-    return null;
-  }
-};
-
-// Note: nextProps/prevProps refer to props passed to <ImpressionsWrapper />, not <ASRouterUISurface />
-function shouldSendImpressionOnUpdate(nextProps, prevProps) {
-  return nextProps.message.id && (!prevProps.message || prevProps.message.id !== nextProps.message.id);
-}
-
-class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_7___default.a.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onMessageFromParent = this.onMessageFromParent.bind(this);
-    this.sendClick = this.sendClick.bind(this);
-    this.sendImpression = this.sendImpression.bind(this);
-    this.sendUserActionTelemetry = this.sendUserActionTelemetry.bind(this);
-    this.state = { message: {}, bundle: {} };
-  }
-
-  sendUserActionTelemetry(extraProps = {}) {
-    const { message, bundle } = this.state;
-    if (!message && !extraProps.message_id) {
-      throw new Error(`You must provide a message_id for bundled messages`);
-    }
-    const eventType = `${message.provider || bundle.provider}_user_event`;
-    ASRouterUtils.sendTelemetry(Object.assign({
-      message_id: message.id || extraProps.message_id,
-      source: extraProps.id,
-      action: eventType
-    }, extraProps));
-  }
-
-  sendImpression(extraProps) {
-    if (this.state.message.provider === "preview") {
-      return;
-    }
-
-    ASRouterUtils.sendMessage({ type: "IMPRESSION", data: this.state.message });
-    this.sendUserActionTelemetry(Object.assign({ event: "IMPRESSION" }, extraProps));
-  }
-
-  // If link has a `metric` data attribute send it as part of the `value`
-  // telemetry field which can have arbitrary values.
-  // Used for router messages with links as part of the content.
-  sendClick(event) {
-    const metric = {
-      value: event.target.dataset.metric,
-      // Used for the `source` of the event. Needed to differentiate
-      // from other snippet or onboarding events that may occur.
-      id: "NEWTAB_FOOTER_BAR_CONTENT"
-    };
-    const action = {
-      type: event.target.dataset.action,
-      data: { args: event.target.dataset.args }
-    };
-    if (action.type) {
-      ASRouterUtils.executeAction(action);
-    }
-    if (!this.state.message.content.do_not_autoblock && !event.target.dataset.do_not_autoblock) {
-      ASRouterUtils.blockById(this.state.message.id);
-    }
-    if (this.state.message.provider !== "preview") {
-      this.sendUserActionTelemetry(Object.assign({ event: "CLICK_BUTTON" }, metric));
-    }
-  }
-
-  onBlockById(id) {
-    return options => ASRouterUtils.blockById(id, options);
-  }
-
-  onDismissById(id) {
-    return () => ASRouterUtils.dismissById(id);
-  }
-
-  dismissBundle(bundle) {
-    return () => ASRouterUtils.dismissBundle(bundle);
-  }
-
-  triggerOnboarding() {
-    ASRouterUtils.sendMessage({ type: "TRIGGER", data: { trigger: { id: "showOnboarding" } } });
-  }
-
-  onMessageFromParent({ data: action }) {
-    switch (action.type) {
-      case "SET_MESSAGE":
-        this.setState({ message: action.data });
-        break;
-      case "SET_BUNDLED_MESSAGES":
-        this.setState({ bundle: action.data });
-        break;
-      case "CLEAR_MESSAGE":
-        if (action.data.id === this.state.message.id) {
-          this.setState({ message: {} });
-          // Remove any styles related to the RTAMO message
-          document.body.classList.remove("welcome", "hide-main", "amo");
-        }
-        break;
-      case "CLEAR_PROVIDER":
-        if (action.data.id === this.state.message.provider) {
-          this.setState({ message: {} });
-        }
-        break;
-      case "CLEAR_BUNDLE":
-        if (this.state.bundle.bundle) {
-          this.setState({ bundle: {} });
-        }
-        break;
-      case "CLEAR_ALL":
-        this.setState({ message: {}, bundle: {} });
-    }
-  }
-
-  componentWillMount() {
-    // Add locale data for StartupOverlay because it uses react-intl
-    Object(react_intl__WEBPACK_IMPORTED_MODULE_0__["addLocaleData"])(global.document.documentElement.lang);
-
-    const endpoint = ASRouterUtils.getPreviewEndpoint();
-    ASRouterUtils.addListener(this.onMessageFromParent);
-
-    // If we are loading about:welcome we want to trigger the onboarding messages
-    if (this.props.document.location.href === "about:welcome") {
-      ASRouterUtils.sendMessage({ type: "TRIGGER", data: { trigger: { id: "firstRun" } } });
-    } else {
-      ASRouterUtils.sendMessage({ type: "SNIPPETS_REQUEST", data: { endpoint } });
-    }
-  }
-
-  componentWillUnmount() {
-    ASRouterUtils.removeListener(this.onMessageFromParent);
-  }
-
-  renderSnippets() {
-    if (this.state.bundle.template === "onboarding" || this.state.message.template === "fxa_overlay" || this.state.message.template === "return_to_amo_overlay") {
-      return null;
-    }
-    const SnippetComponent = _templates_template_manifest__WEBPACK_IMPORTED_MODULE_10__["SnippetsTemplates"][this.state.message.template];
-    const { content } = this.state.message;
-
-    return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-      _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_4__["ImpressionsWrapper"],
-      {
-        id: "NEWTAB_FOOTER_BAR",
-        message: this.state.message,
-        sendImpression: this.sendImpression,
-        shouldSendImpressionOnUpdate: shouldSendImpressionOnUpdate
-        // This helps with testing
-        , document: this.props.document },
-      react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-        fluent_react__WEBPACK_IMPORTED_MODULE_5__["LocalizationProvider"],
-        { messages: Object(_rich_text_strings__WEBPACK_IMPORTED_MODULE_3__["generateMessages"])(content) },
-        react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(SnippetComponent, _extends({}, this.state.message, {
-          UISurface: "NEWTAB_FOOTER_BAR",
-          onBlock: this.onBlockById(this.state.message.id),
-          onDismiss: this.onDismissById(this.state.message.id),
-          onAction: ASRouterUtils.executeAction,
-          sendClick: this.sendClick,
-          sendUserActionTelemetry: this.sendUserActionTelemetry }))
-      )
-    );
-  }
-
-  renderOnboarding() {
-    if (this.state.bundle.template === "onboarding") {
-      return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_6__["OnboardingMessage"], _extends({}, this.state.bundle, {
-        UISurface: "NEWTAB_OVERLAY",
-        onAction: ASRouterUtils.executeAction,
-        onDoneButton: this.dismissBundle(this.state.bundle.bundle),
-        sendUserActionTelemetry: this.sendUserActionTelemetry }));
-    }
-    return null;
-  }
-
-  renderFirstRunOverlay() {
-    const { message } = this.state;
-    if (message.template === "fxa_overlay") {
-      global.document.body.classList.add("fxa");
-      return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-        react_intl__WEBPACK_IMPORTED_MODULE_0__["IntlProvider"],
-        { locale: global.document.documentElement.lang, messages: global.gActivityStreamStrings },
-        react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_11__["StartupOverlay"], {
-          onReady: this.triggerOnboarding,
-          onBlock: this.onDismissById(message.id),
-          dispatch: this.props.activityStreamStore.dispatch,
-          store: this.props.activityStreamStore })
-      );
-    } else if (message.template === "return_to_amo_overlay") {
-      global.document.body.classList.add("amo");
-      return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-        fluent_react__WEBPACK_IMPORTED_MODULE_5__["LocalizationProvider"],
-        { messages: Object(_rich_text_strings__WEBPACK_IMPORTED_MODULE_3__["generateMessages"])({ "amo_html": message.content.text }) },
-        react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(_templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_9__["ReturnToAMO"], _extends({}, message, {
-          onReady: this.triggerOnboarding,
-          onBlock: this.onDismissById(message.id),
-          onAction: ASRouterUtils.executeAction }))
-      );
-    }
-    return null;
-  }
-
-  renderPreviewBanner() {
-    if (this.state.message.provider !== "preview") {
-      return null;
-    }
-
-    return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-      "div",
-      { className: "snippets-preview-banner" },
-      react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement("span", { className: "icon icon-small-spacer icon-info" }),
-      react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-        "span",
-        null,
-        "Preview Purposes Only"
-      )
-    );
-  }
-
-  render() {
-    const { message, bundle } = this.state;
-    if (!message.id && !bundle.template) {
-      return null;
-    }
-    return react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(
-      react__WEBPACK_IMPORTED_MODULE_7___default.a.Fragment,
-      null,
-      this.renderPreviewBanner(),
-      this.renderFirstRunOverlay(),
-      this.renderOnboarding(),
-      this.renderSnippets()
-    );
-  }
-}
-
-ASRouterUISurface.defaultProps = { document: global.document };
-
-class ASRouterContent {
-  constructor() {
-    this.initialized = false;
-    this.containerElement = null;
-  }
-
-  _mount() {
-    this.containerElement = global.document.getElementById(ASR_CONTAINER_ID);
-    if (!this.containerElement) {
-      this.containerElement = global.document.createElement("div");
-      this.containerElement.id = ASR_CONTAINER_ID;
-      this.containerElement.style.zIndex = 1;
-      global.document.body.appendChild(this.containerElement);
-    }
-
-    react_dom__WEBPACK_IMPORTED_MODULE_8___default.a.render(react__WEBPACK_IMPORTED_MODULE_7___default.a.createElement(ASRouterUISurface, { activityStreamStore: this._activityStreamStore }), this.containerElement);
-  }
-
-  _unmount() {
-    react_dom__WEBPACK_IMPORTED_MODULE_8___default.a.unmountComponentAtNode(this.containerElement);
-  }
-
-  init(store) {
-    this._activityStreamStore = store;
-    this._mount();
-    this.initialized = true;
-  }
-
-  uninit() {
-    if (this.initialized) {
-      this._unmount();
-      this.initialized = false;
-    }
-  }
-}
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
-
-/***/ }),
-/* 5 */
-/***/ (function(module, exports) {
-
-module.exports = ReactIntl;
-
-/***/ }),
-/* 6 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MERGE_STORE_ACTION", function() { return MERGE_STORE_ACTION; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OUTGOING_MESSAGE_NAME", function() { return OUTGOING_MESSAGE_NAME; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "INCOMING_MESSAGE_NAME", function() { return INCOMING_MESSAGE_NAME; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EARLY_QUEUED_ACTIONS", function() { return EARLY_QUEUED_ACTIONS; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rehydrationMiddleware", function() { return rehydrationMiddleware; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queueEarlyMessageMiddleware", function() { return queueEarlyMessageMiddleware; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "initStore", function() { return initStore; });
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);
-/* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_1__);
-/* eslint-env mozilla/frame-script */
-
-
-
-
-const MERGE_STORE_ACTION = "NEW_TAB_INITIAL_STATE";
-const OUTGOING_MESSAGE_NAME = "ActivityStream:ContentToMain";
-const INCOMING_MESSAGE_NAME = "ActivityStream:MainToContent";
-const EARLY_QUEUED_ACTIONS = [common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].SAVE_SESSION_PERF_DATA, common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].PAGE_PRERENDERED];
-
-/**
- * A higher-order function which returns a reducer that, on MERGE_STORE action,
- * will return the action.data object merged into the previous state.
- *
- * For all other actions, it merely calls mainReducer.
- *
- * Because we want this to merge the entire state object, it's written as a
- * higher order function which takes the main reducer (itself often a call to
- * combineReducers) as a parameter.
- *
- * @param  {function} mainReducer reducer to call if action != MERGE_STORE_ACTION
- * @return {function}             a reducer that, on MERGE_STORE_ACTION action,
- *                                will return the action.data object merged
- *                                into the previous state, and the result
- *                                of calling mainReducer otherwise.
- */
-function mergeStateReducer(mainReducer) {
-  return (prevState, action) => {
-    if (action.type === MERGE_STORE_ACTION) {
-      return Object.assign({}, prevState, action.data);
-    }
-
-    return mainReducer(prevState, action);
-  };
-}
-
-/**
- * messageMiddleware - Middleware that looks for SentToMain type actions, and sends them if necessary
- */
-const messageMiddleware = store => next => action => {
-  const skipLocal = action.meta && action.meta.skipLocal;
-  if (common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionUtils"].isSendToMain(action)) {
-    RPMSendAsyncMessage(OUTGOING_MESSAGE_NAME, action);
-  }
-  if (!skipLocal) {
-    next(action);
-  }
-};
-
-const rehydrationMiddleware = store => next => action => {
-  if (store._didRehydrate) {
-    return next(action);
-  }
-
-  const isMergeStoreAction = action.type === MERGE_STORE_ACTION;
-  const isRehydrationRequest = action.type === common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].NEW_TAB_STATE_REQUEST;
-
-  if (isRehydrationRequest) {
-    store._didRequestInitialState = true;
-    return next(action);
-  }
-
-  if (isMergeStoreAction) {
-    store._didRehydrate = true;
-    return next(action);
-  }
-
-  // If init happened after our request was made, we need to re-request
-  if (store._didRequestInitialState && action.type === common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].INIT) {
-    return next(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].AlsoToMain({ type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].NEW_TAB_STATE_REQUEST }));
-  }
-
-  if (common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionUtils"].isBroadcastToContent(action) || common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionUtils"].isSendToOneContent(action) || common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionUtils"].isSendToPreloaded(action)) {
-    // Note that actions received before didRehydrate will not be dispatched
-    // because this could negatively affect preloading and the the state
-    // will be replaced by rehydration anyway.
-    return null;
-  }
-
-  return next(action);
-};
-
-/**
- * This middleware queues up all the EARLY_QUEUED_ACTIONS until it receives
- * the first action from main. This is useful for those actions for main which
- * require higher reliability, i.e. the action will not be lost in the case
- * that it gets sent before the main is ready to receive it. Conversely, any
- * actions allowed early are accepted to be ignorable or re-sendable.
- */
-const queueEarlyMessageMiddleware = store => next => action => {
-  if (store._receivedFromMain) {
-    next(action);
-  } else if (common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionUtils"].isFromMain(action)) {
-    next(action);
-    store._receivedFromMain = true;
-    // Sending out all the early actions as main is ready now
-    if (store._earlyActionQueue) {
-      store._earlyActionQueue.forEach(next);
-      store._earlyActionQueue = [];
-    }
-  } else if (EARLY_QUEUED_ACTIONS.includes(action.type)) {
-    store._earlyActionQueue = store._earlyActionQueue || [];
-    store._earlyActionQueue.push(action);
-  } else {
-    // Let any other type of action go through
-    next(action);
-  }
-};
-
-/**
- * initStore - Create a store and listen for incoming actions
- *
- * @param  {object} reducers An object containing Redux reducers
- * @param  {object} intialState (optional) The initial state of the store, if desired
- * @return {object}          A redux store
- */
-function initStore(reducers, initialState) {
-  const store = Object(redux__WEBPACK_IMPORTED_MODULE_1__["createStore"])(mergeStateReducer(Object(redux__WEBPACK_IMPORTED_MODULE_1__["combineReducers"])(reducers)), initialState, global.RPMAddMessageListener && Object(redux__WEBPACK_IMPORTED_MODULE_1__["applyMiddleware"])(rehydrationMiddleware, queueEarlyMessageMiddleware, messageMiddleware));
-
-  store._didRehydrate = false;
-  store._didRequestInitialState = false;
-
-  if (global.RPMAddMessageListener) {
-    global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, msg => {
-      try {
-        store.dispatch(msg.data);
-      } catch (ex) {
-        console.error("Content msg:", msg, "Dispatch error: ", ex); // eslint-disable-line no-console
-        dump(`Content msg: ${JSON.stringify(msg)}\nDispatch error: ${ex}\n${ex.stack}`);
-      }
-    });
-  }
-
-  return store;
-}
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports) {
-
-module.exports = Redux;
-
-/***/ }),
-/* 8 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RICH_TEXT_KEYS", function() { return RICH_TEXT_KEYS; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generateMessages", function() { return generateMessages; });
-/* harmony import */ var fluent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57);
-
-
-/**
- * Properties that allow rich text MUST be added to this list.
- *   key: the localization_id that should be used
- *   value: a property or array of properties on the message.content object
- */
-const RICH_TEXT_CONFIG = {
-  "text": ["text", "scene1_text"],
-  "success_text": "success_text",
-  "error_text": "error_text",
-  "scene2_text": "scene2_text",
-  "amo_html": "amo_html",
-  "privacy_html": "scene2_privacy_html",
-  "disclaimer_html": "scene2_disclaimer_html"
-};
-
-const RICH_TEXT_KEYS = Object.keys(RICH_TEXT_CONFIG);
-
-/**
- * Generates an array of messages suitable for fluent's localization provider
- * including all needed strings for rich text.
- * @param {object} content A .content object from an ASR message (i.e. message.content)
- * @returns {MessageContext[]} A array containing the fluent message context
- */
-function generateMessages(content) {
-  const cx = new fluent__WEBPACK_IMPORTED_MODULE_0__["MessageContext"]("en-US");
-
-  RICH_TEXT_KEYS.forEach(key => {
-    const attrs = RICH_TEXT_CONFIG[key];
-    const attrsToTry = Array.isArray(attrs) ? [...attrs] : [attrs];
-    let string = "";
-    while (!string && attrsToTry.length) {
-      const attr = attrsToTry.pop();
-      string = content[attr];
-    }
-    cx.addMessages(`${key} = ${string}`);
-  });
-  return [cx];
-}
-
-/***/ }),
-/* 9 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VISIBLE", function() { return VISIBLE; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VISIBILITY_CHANGE_EVENT", function() { return VISIBILITY_CHANGE_EVENT; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ImpressionsWrapper", function() { return ImpressionsWrapper; });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-
-
-const VISIBLE = "visible";
-const VISIBILITY_CHANGE_EVENT = "visibilitychange";
-
-/**
- * Component wrapper used to send telemetry pings on every impression.
- */
-class ImpressionsWrapper extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
-  // This sends an event when a user sees a set of new content. If content
-  // changes while the page is hidden (i.e. preloaded or on a hidden tab),
-  // only send the event if the page becomes visible again.
-  sendImpressionOrAddListener() {
-    if (this.props.document.visibilityState === VISIBLE) {
-      this.props.sendImpression({ id: this.props.id });
-    } else {
-      // We should only ever send the latest impression stats ping, so remove any
-      // older listeners.
-      if (this._onVisibilityChange) {
-        this.props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-      }
-
-      // When the page becomes visible, send the impression stats ping if the section isn't collapsed.
-      this._onVisibilityChange = () => {
-        if (this.props.document.visibilityState === VISIBLE) {
-          this.props.sendImpression({ id: this.props.id });
-          this.props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-        }
-      };
-      this.props.document.addEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-    }
-  }
-
-  componentWillUnmount() {
-    if (this._onVisibilityChange) {
-      this.props.document.removeEventListener(VISIBILITY_CHANGE_EVENT, this._onVisibilityChange);
-    }
-  }
-
-  componentDidMount() {
-    if (this.props.sendOnMount) {
-      this.sendImpressionOrAddListener();
-    }
-  }
-
-  componentDidUpdate(prevProps) {
-    if (this.props.shouldSendImpressionOnUpdate(this.props, prevProps)) {
-      this.sendImpressionOrAddListener();
-    }
-  }
-
-  render() {
-    return this.props.children;
-  }
-}
-
-ImpressionsWrapper.defaultProps = {
-  document: global.document,
-  sendOnMount: true
-};
-/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
-
-/***/ }),
-/* 10 */
-/***/ (function(module, exports) {
-
-module.exports = React;
-
-/***/ }),
-/* 11 */
-/***/ (function(module, exports) {
-
-module.exports = PropTypes;
-
-/***/ }),
-/* 12 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OnboardingMessage", function() { return OnboardingMessage; });
-/* harmony import */ var _components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(13);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-
-
-
-class OnboardingCard extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onClick = this.onClick.bind(this);
-  }
-
-  onClick() {
-    const { props } = this;
-    const ping = {
-      event: "CLICK_BUTTON",
-      message_id: props.id,
-      id: props.UISurface
-    };
-    props.sendUserActionTelemetry(ping);
-    props.onAction(props.content.primary_button.action);
-  }
-
-  render() {
-    const { content } = this.props;
-    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-      "div",
-      { className: "onboardingMessage" },
-      react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("div", { className: `onboardingMessageImage ${content.icon}` }),
-      react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-        "div",
-        { className: "onboardingContent" },
-        react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-          "span",
-          null,
-          react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-            "h3",
-            null,
-            " ",
-            content.title,
-            " "
-          ),
-          react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-            "p",
-            null,
-            " ",
-            content.text,
-            " "
-          )
-        ),
-        react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-          "span",
-          null,
-          react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-            "button",
-            { tabIndex: "1", className: "button onboardingButton", onClick: this.onClick },
-            " ",
-            content.primary_button.label,
-            " "
-          )
-        )
-      )
-    );
-  }
-}
-
-class OnboardingMessage extends react__WEBPACK_IMPORTED_MODULE_1___default.a.PureComponent {
-  render() {
-    const { props } = this;
-    const { button_label, header } = props.extraTemplateStrings;
-    return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-      _components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_0__["ModalOverlay"],
-      _extends({}, props, { button_label: button_label, title: header }),
-      react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-        "div",
-        { className: "onboardingMessageContainer" },
-        props.bundle.map(message => react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(OnboardingCard, _extends({ key: message.id,
-          sendUserActionTelemetry: props.sendUserActionTelemetry,
-          onAction: props.onAction,
-          UISurface: props.UISurface
-        }, message)))
-      )
-    );
-  }
-}
-
-/***/ }),
-/* 13 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ModalOverlay", function() { return ModalOverlay; });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-
-
-class ModalOverlay extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
-  componentWillMount() {
-    this.setState({ active: true });
-    document.body.classList.add("modal-open");
-  }
-
-  componentWillUnmount() {
-    document.body.classList.remove("modal-open");
-    this.setState({ active: false });
-  }
-
-  render() {
-    const { active } = this.state;
-    const { title, button_label } = this.props;
-    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-      "div",
-      null,
-      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: `modalOverlayOuter ${active ? "active" : ""}` }),
-      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-        "div",
-        { className: `modalOverlayInner ${active ? "active" : ""}` },
-        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-          "h2",
-          null,
-          " ",
-          title,
-          " "
-        ),
-        this.props.children,
-        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-          "div",
-          { className: "footer" },
-          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-            "button",
-            { tabIndex: "2", onClick: this.props.onDoneButton, className: "button primary modalButton" },
-            " ",
-            button_label,
-            " "
-          )
-        )
-      )
-    );
-  }
-}
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports) {
-
-module.exports = ReactDOM;
-
-/***/ }),
-/* 15 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReturnToAMO", function() { return ReturnToAMO; });
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
-/* harmony import */ var _components_RichText_RichText__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(16);
-
-
-
-class ReturnToAMO extends react__WEBPACK_IMPORTED_MODULE_0___default.a.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onClickAddExtension = this.onClickAddExtension.bind(this);
-    this.onBlockButton = this.onBlockButton.bind(this);
-  }
-
-  componentDidMount() {
-    this.props.onReady();
-  }
-
-  onClickAddExtension() {
-    this.props.onAction(this.props.content.primary_button.action);
-  }
-
-  onBlockButton() {
-    this.props.onBlock();
-    document.body.classList.remove("welcome", "hide-main", "amo");
-  }
-
-  renderText() {
-    const customElement = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("img", { src: this.props.content.addon_icon, width: "20px", height: "20px" });
-    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(_components_RichText_RichText__WEBPACK_IMPORTED_MODULE_1__["RichText"], {
-      customElements: { icon: customElement },
-      amo_html: this.props.content.text,
-      localization_id: "amo_html" });
-  }
-
-  render() {
-    const { content } = this.props;
-    return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-      "div",
-      { className: "ReturnToAMOOverlay" },
-      react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-        "div",
-        null,
-        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-          "h2",
-          null,
-          " ",
-          content.header,
-          " "
-        ),
-        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-          "div",
-          { className: "ReturnToAMOContainer" },
-          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-            "div",
-            { className: "ReturnToAMOAddonContents" },
-            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-              "p",
-              null,
-              " ",
-              content.title,
-              " "
-            ),
-            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-              "div",
-              { className: "ReturnToAMOText" },
-              react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-                "span",
-                null,
-                " ",
-                this.renderText(),
-                " "
-              )
-            ),
-            react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-              "button",
-              { onClick: this.onClickAddExtension, className: "puffy blue ReturnToAMOAddExtension" },
-              " ",
-              react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("span", { className: "icon icon-add" }),
-              " ",
-              content.primary_button.label,
-              " "
-            )
-          ),
-          react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", { className: "ReturnToAMOIcon" })
-        ),
-        react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(
-          "button",
-          { onClick: this.onBlockButton, className: "default grey ReturnToAMOGetStarted" },
-          " ",
-          content.secondary_button.label,
-          " "
-        )
-      )
-    );
-  }
-}
-
-/***/ }),
-/* 16 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "convertLinks", function() { return convertLinks; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RichText", function() { return RichText; });
-/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(58);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8);
-/* harmony import */ var _template_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17);
-var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
-
-
-
-
-
-// Elements allowed in snippet content
-const ALLOWED_TAGS = {
-  b: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("b", null),
-  i: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("i", null),
-  u: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("u", null),
-  strong: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("strong", null),
-  em: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("em", null),
-  br: react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("br", null)
-};
-
-/**
- * Transform an object (tag name: {url}) into (tag name: anchor) where the url
- * is used as href, in order to render links inside a Fluent.Localized component.
- */
-function convertLinks(links, sendClick, doNotAutoBlock, openNewWindow = false) {
-  if (links) {
-    return Object.keys(links).reduce((acc, linkTag) => {
-      const { action } = links[linkTag];
-      // Setting the value to false will not include the attribute in the anchor
-      const url = action ? false : Object(_template_utils__WEBPACK_IMPORTED_MODULE_3__["safeURI"])(links[linkTag].url);
-
-      acc[linkTag] = react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("a", { href: url,
-        target: openNewWindow ? "_blank" : "",
-        "data-metric": links[linkTag].metric,
-        "data-action": action,
-        "data-args": links[linkTag].args,
-        "data-do_not_autoblock": doNotAutoBlock,
-        onClick: sendClick });
-      return acc;
-    }, {});
-  }
-
-  return null;
-}
-
-/**
- * Message wrapper used to sanitize markup and render HTML.
- */
-function RichText(props) {
-  if (!_rich_text_strings__WEBPACK_IMPORTED_MODULE_2__["RICH_TEXT_KEYS"].includes(props.localization_id)) {
-    throw new Error(`ASRouter: ${props.localization_id} is not a valid rich text property. If you want it to be processed, you need to add it to asrouter/rich-text-strings.js`);
-  }
-  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-    fluent_react__WEBPACK_IMPORTED_MODULE_0__["Localized"],
-    _extends({ id: props.localization_id }, ALLOWED_TAGS, props.customElements, convertLinks(props.links, props.sendClick, props.doNotAutoBlock, props.openNewWindow)),
-    react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(
-      "span",
-      null,
-      props.text
-    )
-  );
-}
-
-/***/ }),
-/* 17 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "safeURI", function() { return safeURI; });
-function safeURI(url) {
-  if (!url) {
-    return "";
-  }
-  const { protocol } = new URL(url);
-  const isAllowed = ["http:", "https:", "data:", "resource:", "chrome:"].includes(protocol);
-  if (!isAllowed) {
-    console.warn(`The protocol ${protocol} is not allowed for template URLs.`); // eslint-disable-line no-console
-  }
-  return isAllowed ? url : "";
-}
-
-/***/ }),
-/* 18 */
-/***/ (function(module) {
-
-module.exports = {"title":"EOYSnippet","description":"Fundraising Snippet","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"donation_form_url":{"type":"string","description":"Url to the donation form."},"currency_code":{"type":"string","description":"The code for the currency. Examle gbp, cad, usd.","default":"usd"},"locale":{"type":"string","description":"String for the locale code.","default":"en-US"},"text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"text_color":{"type":"string","description":"Modify the text message color"},"background_color":{"type":"string","description":"Snippet background color."},"highlight_color":{"type":"string","description":"Paragraph em highlight color."},"donation_amount_first":{"type":"number","description":"First button amount."},"donation_amount_second":{"type":"number","description":"Second button amount."},"donation_amount_third":{"type":"number","description":"Third button amount."},"donation_amount_fourth":{"type":"number","description":"Fourth button amount."},"selected_button":{"type":"string","description":"Default donation_amount_second. Donation amount button that's selected by default.","default":"donation_amount_second"},"icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Snippet title displayed before snippet text"}]},"title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}]},"button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"block_button_text":{"type":"string","description":"Tooltip text used for dismiss button."},"monthly_checkbox_label_text":{"type":"string","description":"Label text for monthly checkbox.","default":"Make my donation monthly"},"test":{"type":"string","description":"Different styles for the snippet. Options are bold and takeover."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."},"args":{"type":"string","description":"Additional parameters for link action, example which specific menu the button should open"}}}},"additionalProperties":false,"required":["text","donation_form_url","donation_amount_first","donation_amount_second","donation_amount_third","donation_amount_fourth","button_label","currency_code"],"dependencies":{"button_color":["button_label"],"button_background_color":["button_label"]}};
-
-/***/ }),
-/* 19 */
-/***/ (function(module) {
-
-module.exports = {"title":"SimpleSnippet","description":"A simple template with an icon, text, and optional button.","version":"1.1.1","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Snippet title displayed before snippet text"}]},"text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"button_action":{"type":"string","description":"The type of action the button should trigger."},"button_url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"A url, button_label links to this"}]},"button_action_args":{"type":"string","description":"Additional parameters for button action, example which specific menu the button should open"},"button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}]},"button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"block_button_text":{"type":"string","description":"Tooltip text used for dismiss button.","default":"Remove this"},"tall":{"type":"boolean","description":"To be used by fundraising only, increases height to roughly 120px. Defaults to false."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."},"args":{"type":"string","description":"Additional parameters for link action, example which specific menu the button should open"}}},"section_title_icon":{"type":"string","description":"Section title icon. 16x16px. SVG or PNG preferred. section_title_text must also be specified to display."},"section_title_text":{"type":"string","description":"Section title text. section_title_icon must also be specified to display."},"section_title_url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"A url, section_title_text links to this"}]}},"additionalProperties":false,"required":["text"],"dependencies":{"button_action":["button_label"],"button_url":["button_label"],"button_color":["button_label"],"button_background_color":["button_label"],"section_title_url":["section_title_text"]}};
-
-/***/ }),
-/* 20 */
-/***/ (function(module) {
-
-module.exports = {"title":"FXASignupSnippet","description":"A snippet template for FxA sign up/sign in","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_email_placeholder_text":{"type":"string","description":"Value to show while input is empty.","default":"Your email here"},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Sign me up"},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"action":{"type":"string","enum":["email"]},"context":{"type":"string","enum":["fx_desktop_v3"]},"entrypoint":{"type":"string","enum":["snippets"]},"service":{"type":"string","enum":["sync"]},"utm_content":{"type":"number","description":"Firefox version number"},"utm_source":{"type":"string","enum":["snippet"]},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"additionalProperties":false}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
-
-/***/ }),
-/* 21 */
-/***/ (function(module) {
-
-module.exports = {"title":"NewsletterSnippet","description":"A snippet template for send to device mobile download","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"locale":{"type":"string","description":"Two to five character string for the locale code","default":"en-US"},"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_email_placeholder_text":{"type":"string","description":"Value to show while input is empty.","default":"Your email here"},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Sign me up"},"scene2_privacy_html":{"type":"string","description":"(send to device) Html for disclaimer and link underneath input box."},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"fmt":{"type":"string","description":"","default":"H"}}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"success_text":{"type":"string","description":"Message shown on successful registration."},"error_text":{"type":"string","description":"Message shown if registration failed."},"scene2_newsletter":{"type":"string","description":"Newsletter/basket id user is subscribing to.","default":"mozilla-foundation"},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
-
-/***/ }),
-/* 22 */
-/***/ (function(module) {
-
-module.exports = {"title":"SendToDeviceSnippet","description":"A snippet template for send to device mobile download","version":"1.0.0","type":"object","definitions":{"plainText":{"description":"Plain text (no HTML allowed)","type":"string"},"richText":{"description":"Text with HTML subset allowed: i, b, u, strong, em, br","type":"string"},"link_url":{"description":"Target for links or buttons","type":"string","format":"uri"}},"properties":{"locale":{"type":"string","description":"Two to five character string for the locale code","default":"en-US"},"country":{"type":"string","description":"Two character string for the country code (used for SMS)","default":"us"},"scene1_title":{"allof":[{"$ref":"#/definitions/plainText"},{"description":"snippet title displayed before snippet text"}]},"scene1_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene2_title":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Title displayed before text in scene 2. Should be plain text."}]},"scene2_text":{"allOf":[{"$ref":"#/definitions/richText"},{"description":"Main body text of snippet. HTML subset allowed: i, b, u, strong, em, br"}]},"scene1_icon":{"type":"string","description":"Snippet icon. 64x64px. SVG or PNG preferred."},"scene2_icon":{"type":"string","description":"(send to device) Image to display above the form. 98x98px. SVG or PNG preferred."},"scene1_title_icon":{"type":"string","description":"Small icon that shows up before the title / text. 16x16px. SVG or PNG preferred. Grayscale."},"scene2_button_label":{"type":"string","description":"Label for form submit button","default":"Send"},"scene2_input_placeholder":{"type":"string","description":"(send to device) Value to show while input is empty.","default":"Your email here"},"scene2_disclaimer_html":{"type":"string","description":"(send to device) Html for disclaimer and link underneath input box."},"scene2_dismiss_button_text":{"type":"string","description":"Label for the dismiss button when the sign-up form is expanded.","default":"Dismiss"},"hidden_inputs":{"type":"object","description":"Each entry represents a hidden input, key is used as value for the name property.","properties":{"action":{"type":"string","enum":["email"]},"context":{"type":"string","enum":["fx_desktop_v3"]},"entrypoint":{"type":"string","enum":["snippets"]},"service":{"type":"string","enum":["sync"]},"utm_content":{"type":"string","description":"Firefox version number"},"utm_source":{"type":"string","enum":["snippet"]},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"additionalProperties":false}},"scene1_button_label":{"allOf":[{"$ref":"#/definitions/plainText"},{"description":"Text for a button next to main snippet text that links to button_url. Requires button_url."}],"default":"Learn more"},"scene1_button_color":{"type":"string","description":"The text color of the button. Valid CSS color."},"scene1_button_background_color":{"type":"string","description":"The background color of the button. Valid CSS color."},"do_not_autoblock":{"type":"boolean","description":"Used to prevent blocking the snippet after the CTA (link or button) has been clicked","default":false},"success_title":{"type":"string","description":"(send to device) Title shown before text on successful registration."},"success_text":{"type":"string","description":"Message shown on successful registration."},"error_text":{"type":"string","description":"Message shown if registration failed."},"include_sms":{"type":"boolean","description":"(send to device) Allow users to send an SMS message with the form?","default":false},"message_id_sms":{"type":"string","description":"(send to device) Newsletter/basket id representing the SMS message to be sent."},"message_id_email":{"type":"string","description":"(send to device) Newsletter/basket id representing the email message to be sent. Must be a value from the 'Slug' column here: https://basket.mozilla.org/news/."},"utm_campaign":{"type":"string","description":"(fxa) Value to pass through to GA as utm_campaign."},"utm_term":{"type":"string","description":"(fxa) Value to pass through to GA as utm_term."},"links":{"additionalProperties":{"url":{"allOf":[{"$ref":"#/definitions/link_url"},{"description":"The url where the link points to."}]},"metric":{"type":"string","description":"Custom event name sent with telemetry event."}}}},"additionalProperties":false,"required":["scene1_text","scene2_text","scene1_button_label"],"dependencies":{"scene1_button_color":["scene1_button_label"],"scene1_button_background_color":["scene1_button_label"]}};
-
-/***/ }),
-/* 23 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_StartupOverlay", function() { return _StartupOverlay; });
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "StartupOverlay", function() { return StartupOverlay; });
-/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
-/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__);
-function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
-
-
-
-
-
-
-class _StartupOverlay extends react__WEBPACK_IMPORTED_MODULE_3___default.a.PureComponent {
-  constructor(props) {
-    super(props);
-    this.onInputChange = this.onInputChange.bind(this);
-    this.onSubmit = this.onSubmit.bind(this);
-    this.clickSkip = this.clickSkip.bind(this);
-    this.initScene = this.initScene.bind(this);
-    this.removeOverlay = this.removeOverlay.bind(this);
-    this.onInputInvalid = this.onInputInvalid.bind(this);
-
-    this.state = {
-      emailInput: "",
-      overlayRemoved: false,
-      flowId: "",
-      flowBeginTime: 0
-    };
-    this.didFetch = false;
-  }
-
-  componentWillUpdate() {
-    var _this = this;
-
-    return _asyncToGenerator(function* () {
-      if (_this.props.fxa_endpoint && !_this.didFetch) {
-        try {
-          _this.didFetch = true;
-          const fxaParams = "entrypoint=activity-stream-firstrun&utm_source=activity-stream&utm_campaign=firstrun&form_type=email";
-          const response = yield fetch(`${_this.props.fxa_endpoint}/metrics-flow?${fxaParams}`, { credentials: "omit" });
-          if (response.status === 200) {
-            const { flowId, flowBeginTime } = yield response.json();
-            _this.setState({ flowId, flowBeginTime });
-          } else {
-            _this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({ type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TELEMETRY_UNDESIRED_EVENT, data: { event: "FXA_METRICS_FETCH_ERROR", value: response.status } }));
-          }
-        } catch (error) {
-          _this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].OnlyToMain({ type: common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionTypes"].TELEMETRY_UNDESIRED_EVENT, data: { event: "FXA_METRICS_ERROR" } }));
-        }
-      }
-    })();
-  }
-
-  componentDidMount() {
-    this.initScene();
-  }
-
-  initScene() {
-    // Timeout to allow the scene to render once before attaching the attribute
-    // to trigger the animation.
-    setTimeout(() => {
-      this.setState({ show: true });
-      this.props.onReady();
-    }, 10);
-  }
-
-  removeOverlay() {
-    window.removeEventListener("visibilitychange", this.removeOverlay);
-    document.body.classList.remove("hide-main", "fxa");
-    this.setState({ show: false });
-    this.props.onBlock();
-    setTimeout(() => {
-      // Allow scrolling and fully remove overlay after animation finishes.
-      document.body.classList.remove("welcome");
-      this.setState({ overlayRemoved: true });
-    }, 400);
-  }
-
-  onInputChange(e) {
-    let error = e.target.previousSibling;
-    this.setState({ emailInput: e.target.value });
-    error.classList.remove("active");
-    e.target.classList.remove("invalid");
-  }
-
-  onSubmit() {
-    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(Object.assign({ event: "SUBMIT_EMAIL" }, this._getFormInfo())));
-
-    window.addEventListener("visibilitychange", this.removeOverlay);
-  }
-
-  clickSkip() {
-    this.props.dispatch(common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__["actionCreators"].UserEvent(Object.assign({ event: "SKIPPED_SIGNIN" }, this._getFormInfo())));
-    this.removeOverlay();
-  }
-
-  /**
-   * Report to telemetry additional information about the form submission.
-   */
-  _getFormInfo() {
-    const value = { has_flow_params: this.state.flowId.length > 0 };
-    return { value };
-  }
-
-  onInputInvalid(e) {
-    let error = e.target.previousSibling;
-    error.classList.add("active");
-    e.target.classList.add("invalid");
-    e.preventDefault(); // Override built-in form validation popup
-    e.target.focus();
-  }
-
-  render() {
-    // When skipping the onboarding tour we show AS but we are still on
-    // about:welcome, prop.isFirstrun is true and StartupOverlay is rendered
-    if (this.state.overlayRemoved) {
-      return null;
-    }
-
-    let termsLink = react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-      "a",
-      { href: `${this.props.fxa_endpoint}/legal/terms`, target: "_blank", rel: "noopener noreferrer" },
-      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_terms_of_service" })
-    );
-    let privacyLink = react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-      "a",
-      { href: `${this.props.fxa_endpoint}/legal/privacy`, target: "_blank", rel: "noopener noreferrer" },
-      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_privacy_notice" })
-    );
-
-    return react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-      "div",
-      { className: `overlay-wrapper ${this.state.show ? "show" : ""}` },
-      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("div", { className: "background" }),
-      react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-        "div",
-        { className: "firstrun-scene" },
-        react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-          "div",
-          { className: "fxaccounts-container" },
-          react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-            "div",
-            { className: "firstrun-left-divider" },
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "h1",
-              { className: "firstrun-title" },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_title" })
-            ),
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "p",
-              { className: "firstrun-content" },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_content" })
-            ),
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "a",
-              { className: "firstrun-link", href: "https://www.mozilla.org/firefox/features/sync/", target: "_blank", rel: "noopener noreferrer" },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_learn_more_link" })
-            )
-          ),
-          react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-            "div",
-            { className: "firstrun-sign-in" },
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "p",
-              { className: "form-header" },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_form_header" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-                "span",
-                { className: "sub-header" },
-                react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_form_sub_header" })
-              )
-            ),
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "form",
-              { method: "get", action: this.props.fxa_endpoint, target: "_blank", rel: "noopener noreferrer", onSubmit: this.onSubmit },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "service", type: "hidden", value: "sync" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "action", type: "hidden", value: "email" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "context", type: "hidden", value: "fx_desktop_v3" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "entrypoint", type: "hidden", value: "activity-stream-firstrun" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "utm_source", type: "hidden", value: "activity-stream" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "utm_campaign", type: "hidden", value: "firstrun" }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "flow_id", type: "hidden", value: this.state.flowId }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { name: "flow_begin_time", type: "hidden", value: this.state.flowBeginTime }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-                "span",
-                { className: "error" },
-                this.props.intl.formatMessage({ id: "firstrun_invalid_input" })
-              ),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement("input", { className: "email-input", name: "email", type: "email", required: "true", onInvalid: this.onInputInvalid, placeholder: this.props.intl.formatMessage({ id: "firstrun_email_input_placeholder" }), onChange: this.onInputChange }),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-                "div",
-                { className: "extra-links" },
-                react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], {
-                  id: "firstrun_extra_legal_links",
-                  values: {
-                    terms: termsLink,
-                    privacy: privacyLink
-                  } })
-              ),
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-                "button",
-                { className: "continue-button", type: "submit" },
-                react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_continue_to_login" })
-              )
-            ),
-            react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(
-              "button",
-              { className: "skip-button", disabled: !!this.state.emailInput, onClick: this.clickSkip },
-              react__WEBPACK_IMPORTED_MODULE_3___default.a.createElement(react_intl__WEBPACK_IMPORTED_MODULE_1__["FormattedMessage"], { id: "firstrun_skip_login" })
-            )
-          )
-        )
-      )
-    );
-  }
-}
-
-const getState = state => ({ fxa_endpoint: state.Prefs.values.fxa_endpoint });
-const StartupOverlay = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(getState)(Object(react_intl__WEBPACK_IMPORTED_MODULE_1__["injectIntl"])(_StartupOverlay));
-
-/***/ }),
-/* 24 */
-/***/ (function(module, exports) {
-
-module.exports = ReactRedux;
-
-/***/ }),
-/* 25 */
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
 /* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_Base", function() { return _Base; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BaseContent", function() { return BaseContent; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Base", function() { return Base; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
 /* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_1__);
-/* harmony import */ var content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
-/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(24);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_4__);
-/* harmony import */ var content_src_components_DarkModeMessage_DarkModeMessage__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(29);
-/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(55);
-/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(37);
-/* harmony import */ var content_src_components_ManualMigration_ManualMigration__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(45);
-/* harmony import */ var common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(46);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(10);
+/* harmony import */ var content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
+/* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
+/* harmony import */ var content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_5__);
+/* harmony import */ var content_src_components_DarkModeMessage_DarkModeMessage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(29);
+/* harmony import */ var content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(53);
+/* harmony import */ var content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(37);
+/* harmony import */ var common_PrerenderData_jsm__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(45);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(12);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_10__);
-/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(47);
-/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(49);
+/* harmony import */ var content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(46);
+/* harmony import */ var content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(48);
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 
 
 
 
 
 
@@ -2332,32 +1043,37 @@ class _Base extends react__WEBPACK_IMPOR
   render() {
     const { props } = this;
     const { App, locale, strings } = props;
     const { initialized } = App;
 
     const prefs = props.Prefs.values;
     if (prefs["asrouter.devtoolsEnabled"]) {
       if (window.location.hash.startsWith("#asrouter") || window.location.hash.startsWith("#devtools")) {
-        return react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__["ASRouterAdmin"], null);
+        return react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
+          "div",
+          null,
+          react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ASRouterAdmin_ASRouterAdmin__WEBPACK_IMPORTED_MODULE_2__["ASRouterAdmin"], null),
+          react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__["ASRouterUISurface"], { dispatch: this.props.dispatch })
+        );
       } else if (!didLogDevtoolsHelpText) {
         console.log("Activity Stream devtools enabled. To access visit %cabout:newtab#devtools", "font-weight: bold"); // eslint-disable-line no-console
         didLogDevtoolsHelpText = true;
       }
     }
 
     if (!props.isPrerendered && !initialized) {
       return null;
     }
 
     return react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
       react_intl__WEBPACK_IMPORTED_MODULE_1__["IntlProvider"],
       { locale: locale, messages: strings },
       react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
-        content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"],
+        content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_8__["ErrorBoundary"],
         { className: "base-content-fallback" },
         react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(BaseContent, this.props)
       )
     );
   }
 }
 
 class BaseContent extends react__WEBPACK_IMPORTED_MODULE_10___default.a.PureComponent {
@@ -2411,68 +1127,70 @@ class BaseContent extends react__WEBPACK
         { className: outerClassName },
         react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
           "main",
           null,
           prefs.showSearch && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
             "div",
             { className: "non-collapsible-section" },
             react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
-              content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"],
+              content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_8__["ErrorBoundary"],
               null,
               react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_Search_Search__WEBPACK_IMPORTED_MODULE_11__["Search"], _extends({ showLogo: noSectionsEnabled, handoffEnabled: searchHandoffEnabled }, props.Search))
             )
           ),
+          react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(_asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_3__["ASRouterUISurface"], { dispatch: this.props.dispatch }),
           react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
             "div",
             { className: `body-wrapper${initialized ? " on" : ""}` },
-            !isDiscoveryStream && !prefs.migrationExpired && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
-              "div",
-              { className: "non-collapsible-section" },
-              react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ManualMigration_ManualMigration__WEBPACK_IMPORTED_MODULE_8__["ManualMigration"], null)
-            ),
             isDiscoveryStream ? react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(
-              content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_7__["ErrorBoundary"],
+              content_src_components_ErrorBoundary_ErrorBoundary__WEBPACK_IMPORTED_MODULE_8__["ErrorBoundary"],
               { className: "borderless-error" },
-              prefs.darkModeMessage && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_DarkModeMessage_DarkModeMessage__WEBPACK_IMPORTED_MODULE_5__["DarkModeMessage"], null),
-              react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_6__["DiscoveryStreamBase"], null)
+              prefs.darkModeMessage && react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_DarkModeMessage_DarkModeMessage__WEBPACK_IMPORTED_MODULE_6__["DarkModeMessage"], null),
+              react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_DiscoveryStreamBase_DiscoveryStreamBase__WEBPACK_IMPORTED_MODULE_7__["DiscoveryStreamBase"], null)
             ) : react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_Sections_Sections__WEBPACK_IMPORTED_MODULE_12__["Sections"], null),
             react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(PrefsButton, { onClick: this.openPreferences })
           ),
-          react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_3__["ConfirmDialog"], null)
+          react__WEBPACK_IMPORTED_MODULE_10___default.a.createElement(content_src_components_ConfirmDialog_ConfirmDialog__WEBPACK_IMPORTED_MODULE_4__["ConfirmDialog"], null)
         )
       )
     );
   }
 }
 
-const Base = Object(react_redux__WEBPACK_IMPORTED_MODULE_4__["connect"])(state => ({
+const Base = Object(react_redux__WEBPACK_IMPORTED_MODULE_5__["connect"])(state => ({
   App: state.App,
   Prefs: state.Prefs,
   Sections: state.Sections,
   DiscoveryStream: state.DiscoveryStream,
   Search: state.Search
 }))(_Base);
 /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
 
 /***/ }),
-/* 26 */
+/* 5 */
+/***/ (function(module, exports) {
+
+module.exports = ReactIntl;
+
+/***/ }),
+/* 6 */
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
 
 "use strict";
 __webpack_require__.r(__webpack_exports__);
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdminInner", function() { return ASRouterAdminInner; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_ASRouterAdmin", function() { return _ASRouterAdmin; });
 /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterAdmin", function() { return ASRouterAdmin; });
 /* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
-/* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
-/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(24);
+/* harmony import */ var _asrouter_asrouter_content__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);
+/* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
 /* harmony import */ var react_redux__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_redux__WEBPACK_IMPORTED_MODULE_2__);
-/* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(13);
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
+/* harmony import */ var _asrouter_components_ModalOverlay_ModalOverlay__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(15);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_4__);
 /* harmony import */ var _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(27);
 var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
 
 
 
 
 
@@ -3623,23 +2341,1286 @@ class ASRouterAdminInner extends react__
 const _ASRouterAdmin = props => react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(
   _SimpleHashRouter__WEBPACK_IMPORTED_MODULE_5__["SimpleHashRouter"],
   null,
   react__WEBPACK_IMPORTED_MODULE_4___default.a.createElement(ASRouterAdminInner, props)
 );
 const ASRouterAdmin = Object(react_redux__WEBPACK_IMPORTED_MODULE_2__["connect"])(state => ({ Sections: state.Sections, DiscoveryStream: state.DiscoveryStream, Prefs: state.Prefs }))(_ASRouterAdmin);
 
 /***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* WEBPACK VAR INJECTION */(function(global) {/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUtils", function() { return ASRouterUtils; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ASRouterUISurface", function() { return ASRouterUISurface; });
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
+/* harmony import */ var react_intl__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_intl__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8);
+/* harmony import */ var _rich_text_strings__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);
+/* harmony import */ var _components_ImpressionsWrapper_ImpressionsWrapper__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(11);
+/* harmony import */ var fluent_react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(56);
+/* harmony import */ var _templates_OnboardingMessage_OnboardingMessage__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(14);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(12);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_7__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(16);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_8__);
+/* harmony import */ var _templates_ReturnToAMO_ReturnToAMO__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(17);
+/* harmony import */ var _templates_template_manifest__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(54);
+/* harmony import */ var _templates_StartupOverlay_StartupOverlay__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(25);
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const INCOMING_MESSAGE_NAME = "ASRouter:parent-to-child";
+const OUTGOING_MESSAGE_NAME = "ASRouter:child-to-parent";
+const TEMPLATES_BELOW_SEARCH = ["simple_below_search_snippet"];
+
+const ASRouterUtils = {
+  addListener(listener) {
+    if (global.RPMAddMessageListener) {
+      global.RPMAddMessageListener(INCOMING_MESSAGE_NAME, listener);
+    }
+  },
+  removeListener(listener) {
+    if (global.RPMRemoveMessageListener) {
+      global.RPMRemoveMessageListener(INCOMING_MESSAGE_NAME, listener);
+    }
+  },
+  sendMessage(action) {
+    if (global.RPMSendAsyncMessage) {
+      global.RPMSendAsyncMessage(OUTGOING_MESSAGE_NAME, action);
+    }
+  },
+  blockById(id, options) {
+    ASRouterUtils.sendMessage({ type: "BLOCK_MESSAGE_BY_ID", data: Object.assign({ id }, options) });
+  },
+  dismissById(id) {
+    ASRouterUtils.sendMessage({ type: "DISMISS_MESSAGE_BY_ID", data: { id } });
+  },
+  dismissBundle(bundle) {
+    ASRouterUtils.sendMessage({ type: "DISMISS_BUNDLE", data: { bundle } });
+  },
+  executeAction(button_action) {
+    ASRouterUtils.sendMessage({
+      type: "USER_ACTION",
+      data: button_action
+    });
+  },
+  unblockById(id) {
+    ASRouterUtils.sendMessage({ type: "UNBLOCK_MESSAGE_BY_ID", data: { id } });
+  },
+  unblockBundle(bundle) {
+    ASRouterUtils.sendMessage({ type: "UNBLOCK_BUNDLE", data: { bundle } });
+  },
+  overrideMessage(id) {
+    ASRouterUtils.sendMessage({ type: "OVERRIDE_MESSAGE", data: { id } });
+  },
+  sendTelemetry(ping) {
+    if (global.RPMSendAsyncMessage) {
+      const payload = common_Actions_jsm__WEBPACK_IMPORTED_MODULE_1__["actionCreators"].ASRouterUserEvent(ping);
+      global.RPMSendAsyncMessage(content_src_lib_init_store__WEBPACK_IMPORTED_MODULE_2__["OUTGOING_MESSAGE_NAME"], payload);
+    }
+  },
+  getPreviewEndpoint() {
+    if (global.location && global.location.href.includes("endpoint")) {
+      const params = new URLSearchParams(global.location.href.slice(global.location.href.indexOf("endpoint")));
+      try {
+        const endpoint = new URL(params.get("endpoint"));
+        return {
+          url: endpoint.href,
+          snippetId: params.get("snippetId")
+        };
+      } catch (e) {}
+    }
+
+    return null;
+  }
+};
+
+// Note: nextProps/prevProps refer to props passed to <ImpressionsWrapper />, not <ASRouterUISurface />
+function shouldSendImpressionOnUpdate(nextProps, prevProps) {
+  return nextProps.message.id && (!prevProps.message || prevProps.message.id !== nextProps.message.id);
+}
+
+class ASRouterUISurface extends react__WEBPACK_IMPORTED_MODULE_7___default.a.PureComponent {
+  constructor(props) {
+    super(props);
+    this.onMessageFromParent = this.onMessageFromParent.bind(this);
+    this.sendClick = this.sendClick.bind(this);
+    this.sendImpression = this.sendImpression.bind(this);
+    this.sendUserActionTelemetry = this.sendUserActionTelemetry.bind(this);
+    this.state = { message: {}, bundle: {} };
+    if (props.document) {
+      this.portalContainer = props.document.getElementById("footer-snippets-container");
+    }
+  }
+
+  sendUserActionTelemetry(extraProps = {}) {
+    const { message, bundle } = this.state;
+    if (!message && !extraProps.message_id) {
+