merge mozilla-central to mozilla-inbound. r=merge a=merge
authorSebastian Hengst <archaeopteryx@coole-files.de>
Sat, 04 Nov 2017 11:01:09 +0100
changeset 443459 39d71149faea86d74a770711992b745892e49801
parent 443458 17decbfb072038b166a5f658e60483ebb56742e0 (current diff)
parent 443442 14fd26761bc4d10c5334abe50d7b6f3a5908f08d (diff)
child 443460 1ce74c61c5c3355689b65ca7453020e90897ee00
push id1618
push userCallek@gmail.com
push dateThu, 11 Jan 2018 17:45:48 +0000
treeherdermozilla-release@882ca853e05a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge, merge
milestone58.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
merge mozilla-central to mozilla-inbound. r=merge a=merge
browser/extensions/activity-stream/data/content/activity-stream.css
browser/extensions/activity-stream/data/locales.json
browser/extensions/activity-stream/lib/LocalizationFeed.jsm
browser/extensions/activity-stream/prerendered/ach/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ach/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ach/activity-stream.html
browser/extensions/activity-stream/prerendered/ar/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ar/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ar/activity-stream.html
browser/extensions/activity-stream/prerendered/ast/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ast/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ast/activity-stream.html
browser/extensions/activity-stream/prerendered/az/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/az/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/az/activity-stream.html
browser/extensions/activity-stream/prerendered/be/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/be/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/be/activity-stream.html
browser/extensions/activity-stream/prerendered/bg/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bg/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bg/activity-stream.html
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bn-BD/activity-stream.html
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bn-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/br/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/br/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/br/activity-stream.html
browser/extensions/activity-stream/prerendered/bs/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/bs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/bs/activity-stream.html
browser/extensions/activity-stream/prerendered/ca/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ca/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ca/activity-stream.html
browser/extensions/activity-stream/prerendered/cak/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cak/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cak/activity-stream.html
browser/extensions/activity-stream/prerendered/cs/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cs/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cs/activity-stream.html
browser/extensions/activity-stream/prerendered/cy/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/cy/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/cy/activity-stream.html
browser/extensions/activity-stream/prerendered/da/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/da/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/da/activity-stream.html
browser/extensions/activity-stream/prerendered/de/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/de/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/de/activity-stream.html
browser/extensions/activity-stream/prerendered/dsb/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/dsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/dsb/activity-stream.html
browser/extensions/activity-stream/prerendered/el/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/el/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/el/activity-stream.html
browser/extensions/activity-stream/prerendered/en-GB/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/en-GB/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/en-GB/activity-stream.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-debug.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/en-US/activity-stream-prerendered-debug.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/en-US/activity-stream.html
browser/extensions/activity-stream/prerendered/eo/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/eo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/eo/activity-stream.html
browser/extensions/activity-stream/prerendered/es-AR/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-AR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-AR/activity-stream.html
browser/extensions/activity-stream/prerendered/es-CL/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-CL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-CL/activity-stream.html
browser/extensions/activity-stream/prerendered/es-ES/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-ES/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-ES/activity-stream.html
browser/extensions/activity-stream/prerendered/es-MX/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/es-MX/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/es-MX/activity-stream.html
browser/extensions/activity-stream/prerendered/et/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/et/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/et/activity-stream.html
browser/extensions/activity-stream/prerendered/eu/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/eu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/eu/activity-stream.html
browser/extensions/activity-stream/prerendered/fa/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fa/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fa/activity-stream.html
browser/extensions/activity-stream/prerendered/fi/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fi/activity-stream.html
browser/extensions/activity-stream/prerendered/fr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fr/activity-stream.html
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/fy-NL/activity-stream.html
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ga-IE/activity-stream.html
browser/extensions/activity-stream/prerendered/gd/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/gd/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/gd/activity-stream.html
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/gu-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/he/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/he/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/he/activity-stream.html
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hi-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/hr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hr/activity-stream.html
browser/extensions/activity-stream/prerendered/hsb/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hsb/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hsb/activity-stream.html
browser/extensions/activity-stream/prerendered/hu/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hu/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hu/activity-stream.html
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/hy-AM/activity-stream.html
browser/extensions/activity-stream/prerendered/ia/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ia/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ia/activity-stream.html
browser/extensions/activity-stream/prerendered/it/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/it/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/it/activity-stream.html
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ja-JP-mac/activity-stream.html
browser/extensions/activity-stream/prerendered/ja/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ja/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ja/activity-stream.html
browser/extensions/activity-stream/prerendered/ka/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ka/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ka/activity-stream.html
browser/extensions/activity-stream/prerendered/kab/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kab/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kab/activity-stream.html
browser/extensions/activity-stream/prerendered/kk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kk/activity-stream.html
browser/extensions/activity-stream/prerendered/km/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/km/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/km/activity-stream.html
browser/extensions/activity-stream/prerendered/kn/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/kn/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/kn/activity-stream.html
browser/extensions/activity-stream/prerendered/ko/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ko/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ko/activity-stream.html
browser/extensions/activity-stream/prerendered/lij/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lij/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lij/activity-stream.html
browser/extensions/activity-stream/prerendered/lo/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lo/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lo/activity-stream.html
browser/extensions/activity-stream/prerendered/lt/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lt/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lt/activity-stream.html
browser/extensions/activity-stream/prerendered/lv/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/lv/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/lv/activity-stream.html
browser/extensions/activity-stream/prerendered/mk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/mk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/mk/activity-stream.html
browser/extensions/activity-stream/prerendered/ml/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ml/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ml/activity-stream.html
browser/extensions/activity-stream/prerendered/mr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/mr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/mr/activity-stream.html
browser/extensions/activity-stream/prerendered/ms/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ms/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ms/activity-stream.html
browser/extensions/activity-stream/prerendered/my/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/my/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/my/activity-stream.html
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nb-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ne-NP/activity-stream.html
browser/extensions/activity-stream/prerendered/nl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nl/activity-stream.html
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/nn-NO/activity-stream.html
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pa-IN/activity-stream.html
browser/extensions/activity-stream/prerendered/pl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pl/activity-stream.html
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pt-BR/activity-stream.html
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/pt-PT/activity-stream.html
browser/extensions/activity-stream/prerendered/rm/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/rm/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/rm/activity-stream.html
browser/extensions/activity-stream/prerendered/ro/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ro/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ro/activity-stream.html
browser/extensions/activity-stream/prerendered/ru/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ru/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ru/activity-stream.html
browser/extensions/activity-stream/prerendered/sk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sk/activity-stream.html
browser/extensions/activity-stream/prerendered/sl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sl/activity-stream.html
browser/extensions/activity-stream/prerendered/sq/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sq/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sq/activity-stream.html
browser/extensions/activity-stream/prerendered/sr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sr/activity-stream.html
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/sv-SE/activity-stream.html
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ta-LK/activity-stream.html
browser/extensions/activity-stream/prerendered/ta/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ta/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ta/activity-stream.html
browser/extensions/activity-stream/prerendered/te/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/te/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/te/activity-stream.html
browser/extensions/activity-stream/prerendered/th/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/th/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/th/activity-stream.html
browser/extensions/activity-stream/prerendered/tl/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/tl/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/tl/activity-stream.html
browser/extensions/activity-stream/prerendered/tr/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/tr/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/tr/activity-stream.html
browser/extensions/activity-stream/prerendered/uk/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/uk/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/uk/activity-stream.html
browser/extensions/activity-stream/prerendered/ur/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/ur/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/ur/activity-stream.html
browser/extensions/activity-stream/prerendered/uz/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/uz/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/uz/activity-stream.html
browser/extensions/activity-stream/prerendered/vi/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/vi/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/vi/activity-stream.html
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/zh-CN/activity-stream.html
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream-initial-state.js
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream-prerendered.html
browser/extensions/activity-stream/prerendered/zh-TW/activity-stream.html
browser/extensions/activity-stream/test/unit/lib/LocalizationFeed.test.js
devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_autocomplete_and_selfxss.js
devtools/server/actors/utils/shapes-geometry-utils.js
layout/reftests/dom/xbl-children-1.xhtml
media/ffvpx/config_darwin32.h
media/ffvpx/libavcodec/flac_parser.c
media/libaom/config/win/mingw32/aom_config.asm
media/libaom/config/win/mingw32/aom_config.h
mobile/android/locales/en-US/chrome/checkbox.dtd
security/certverifier/StartComAndWoSignData.inc
services/sync/modules/rest.js
services/sync/tests/unit/test_resource_async.js
services/sync/tests/unit/test_service_getStorageInfo.js
services/sync/tests/unit/test_syncstoragerequest.js
servo/ports/servo/.cargo/config
third_party/aom/aom_dsp/arm/idct16x16_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct16x16_add_neon.asm
third_party/aom/aom_dsp/arm/idct32x32_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct32x32_add_neon.asm
third_party/aom/aom_dsp/arm/idct4x4_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct4x4_add_neon.asm
third_party/aom/aom_dsp/arm/idct8x8_1_add_neon.asm
third_party/aom/aom_dsp/arm/idct8x8_add_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_16_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_4_neon.asm
third_party/aom/aom_dsp/arm/loopfilter_8_neon.asm
third_party/aom/aom_dsp/x86/highbd_intrapred_sse2.asm
third_party/aom/aom_dsp/x86/intrapred_sse2.asm
third_party/aom/aom_dsp/x86/intrapred_ssse3.asm
third_party/aom/av1/common/cdef_simd.h
third_party/aom/av1/common/mips/dspr2/av1_itrans16_dspr2.c
third_party/aom/av1/common/mips/dspr2/av1_itrans4_dspr2.c
third_party/aom/av1/common/mips/dspr2/av1_itrans8_dspr2.c
third_party/aom/av1/common/od_dering.c
third_party/aom/av1/common/od_dering.h
third_party/aom/av1/common/od_dering_neon.c
third_party/aom/av1/common/od_dering_simd.h
third_party/aom/av1/common/od_dering_sse2.c
third_party/aom/av1/common/od_dering_sse4.c
third_party/aom/av1/common/od_dering_ssse3.c
third_party/aom/av1/encoder/arm/neon/dct_neon.c
third_party/aom/av1/encoder/x86/dct_ssse3.c
third_party/aom/build/cmake/aom_version.pl
third_party/rust/aho-corasick-0.6.2/.cargo-checksum.json
third_party/rust/aho-corasick-0.6.2/.travis.yml
third_party/rust/aho-corasick-0.6.2/COPYING
third_party/rust/aho-corasick-0.6.2/Cargo.toml
third_party/rust/aho-corasick-0.6.2/LICENSE-MIT
third_party/rust/aho-corasick-0.6.2/Makefile
third_party/rust/aho-corasick-0.6.2/README.md
third_party/rust/aho-corasick-0.6.2/UNLICENSE
third_party/rust/aho-corasick-0.6.2/benches/bench.rs
third_party/rust/aho-corasick-0.6.2/benches/random.txt
third_party/rust/aho-corasick-0.6.2/ctags.rust
third_party/rust/aho-corasick-0.6.2/examples/dict-search.rs
third_party/rust/aho-corasick-0.6.2/session.vim
third_party/rust/aho-corasick-0.6.2/src/autiter.rs
third_party/rust/aho-corasick-0.6.2/src/full.rs
third_party/rust/aho-corasick-0.6.2/src/lib.rs
third_party/rust/aho-corasick-0.6.2/src/main.rs
third_party/rust/aster/.cargo-checksum.json
third_party/rust/aster/Cargo.toml
third_party/rust/aster/src/arm.rs
third_party/rust/aster/src/attr.rs
third_party/rust/aster/src/block.rs
third_party/rust/aster/src/constant.rs
third_party/rust/aster/src/ctx.rs
third_party/rust/aster/src/expr.rs
third_party/rust/aster/src/fn_decl.rs
third_party/rust/aster/src/generics.rs
third_party/rust/aster/src/ident.rs
third_party/rust/aster/src/invoke.rs
third_party/rust/aster/src/item.rs
third_party/rust/aster/src/lib.rs
third_party/rust/aster/src/lifetime.rs
third_party/rust/aster/src/lit.rs
third_party/rust/aster/src/mac.rs
third_party/rust/aster/src/method.rs
third_party/rust/aster/src/pat.rs
third_party/rust/aster/src/path.rs
third_party/rust/aster/src/qpath.rs
third_party/rust/aster/src/self_.rs
third_party/rust/aster/src/stmt.rs
third_party/rust/aster/src/struct_field.rs
third_party/rust/aster/src/symbol.rs
third_party/rust/aster/src/ty.rs
third_party/rust/aster/src/ty_param.rs
third_party/rust/aster/src/variant.rs
third_party/rust/aster/src/variant_data.rs
third_party/rust/aster/src/where_predicate.rs
third_party/rust/base64-0.5.2/.cargo-checksum.json
third_party/rust/base64-0.5.2/Cargo.toml
third_party/rust/base64-0.5.2/LICENSE-APACHE
third_party/rust/base64-0.5.2/LICENSE-MIT
third_party/rust/base64-0.5.2/README.md
third_party/rust/base64-0.5.2/benches/benchmarks.rs
third_party/rust/base64-0.5.2/examples/make_tables.rs
third_party/rust/base64-0.5.2/src/lib.rs
third_party/rust/base64-0.5.2/src/tables.rs
third_party/rust/base64-0.5.2/tests/tests.rs
third_party/rust/bindgen-0.30.0/.cargo-checksum.json
third_party/rust/bindgen-0.30.0/Cargo.toml
third_party/rust/bindgen-0.30.0/build.rs
third_party/rust/bindgen-0.30.0/src/callbacks.rs
third_party/rust/bindgen-0.30.0/src/clang.rs
third_party/rust/bindgen-0.30.0/src/codegen/derive_debug.rs
third_party/rust/bindgen-0.30.0/src/codegen/error.rs
third_party/rust/bindgen-0.30.0/src/codegen/helpers.rs
third_party/rust/bindgen-0.30.0/src/codegen/mod.rs
third_party/rust/bindgen-0.30.0/src/codegen/struct_layout.rs
third_party/rust/bindgen-0.30.0/src/extra_assertions.rs
third_party/rust/bindgen-0.30.0/src/features.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_copy.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_debug.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_default.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_hash.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/derive_partial_eq.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_destructor.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_float.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_type_param_in_array.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/has_vtable.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/mod.rs
third_party/rust/bindgen-0.30.0/src/ir/analysis/template_params.rs
third_party/rust/bindgen-0.30.0/src/ir/annotations.rs
third_party/rust/bindgen-0.30.0/src/ir/comment.rs
third_party/rust/bindgen-0.30.0/src/ir/comp.rs
third_party/rust/bindgen-0.30.0/src/ir/context.rs
third_party/rust/bindgen-0.30.0/src/ir/derive.rs
third_party/rust/bindgen-0.30.0/src/ir/dot.rs
third_party/rust/bindgen-0.30.0/src/ir/enum_ty.rs
third_party/rust/bindgen-0.30.0/src/ir/function.rs
third_party/rust/bindgen-0.30.0/src/ir/int.rs
third_party/rust/bindgen-0.30.0/src/ir/item.rs
third_party/rust/bindgen-0.30.0/src/ir/item_kind.rs
third_party/rust/bindgen-0.30.0/src/ir/layout.rs
third_party/rust/bindgen-0.30.0/src/ir/mod.rs
third_party/rust/bindgen-0.30.0/src/ir/module.rs
third_party/rust/bindgen-0.30.0/src/ir/objc.rs
third_party/rust/bindgen-0.30.0/src/ir/template.rs
third_party/rust/bindgen-0.30.0/src/ir/traversal.rs
third_party/rust/bindgen-0.30.0/src/ir/ty.rs
third_party/rust/bindgen-0.30.0/src/ir/var.rs
third_party/rust/bindgen-0.30.0/src/lib.rs
third_party/rust/bindgen-0.30.0/src/log_stubs.rs
third_party/rust/bindgen-0.30.0/src/main.rs
third_party/rust/bindgen-0.30.0/src/options.rs
third_party/rust/bindgen-0.30.0/src/parse.rs
third_party/rust/bindgen-0.30.0/src/regex_set.rs
third_party/rust/bitflags-0.8.2/.cargo-checksum.json
third_party/rust/bitflags-0.8.2/.travis.yml
third_party/rust/bitflags-0.8.2/Cargo.toml
third_party/rust/bitflags-0.8.2/LICENSE-APACHE
third_party/rust/bitflags-0.8.2/LICENSE-MIT
third_party/rust/bitflags-0.8.2/README.md
third_party/rust/bitflags-0.8.2/src/lib.rs
third_party/rust/bitflags-0.8.2/tests/external.rs
third_party/rust/bitflags-0.8.2/tests/external_no_std.rs
third_party/rust/bitflags-0.8.2/tests/i128_bitflags.rs
third_party/rust/clang-sys-0.19.0/.cargo-checksum.json
third_party/rust/clang-sys-0.19.0/.travis.yml
third_party/rust/clang-sys-0.19.0/CHANGELOG.md
third_party/rust/clang-sys-0.19.0/CONTRIBUTING.md
third_party/rust/clang-sys-0.19.0/Cargo.toml
third_party/rust/clang-sys-0.19.0/LICENSE.txt
third_party/rust/clang-sys-0.19.0/README.md
third_party/rust/clang-sys-0.19.0/appveyor.yml
third_party/rust/clang-sys-0.19.0/build.rs
third_party/rust/clang-sys-0.19.0/ci/before_install.sh
third_party/rust/clang-sys-0.19.0/ci/install.bat
third_party/rust/clang-sys-0.19.0/ci/script.sh
third_party/rust/clang-sys-0.19.0/ci/test_script.bat
third_party/rust/clang-sys-0.19.0/clippy.toml
third_party/rust/clang-sys-0.19.0/src/lib.rs
third_party/rust/clang-sys-0.19.0/src/link.rs
third_party/rust/clang-sys-0.19.0/src/support.rs
third_party/rust/clang-sys-0.19.0/tests/header.h
third_party/rust/clang-sys-0.19.0/tests/lib.rs
third_party/rust/clap-2.24.2/.cargo-checksum.json
third_party/rust/clap-2.24.2/.clog.toml
third_party/rust/clap-2.24.2/.github/CONTRIBUTING.md
third_party/rust/clap-2.24.2/.github/ISSUE_TEMPLATE.md
third_party/rust/clap-2.24.2/.travis.yml
third_party/rust/clap-2.24.2/CHANGELOG.md
third_party/rust/clap-2.24.2/CONTRIBUTORS.md
third_party/rust/clap-2.24.2/Cargo.toml
third_party/rust/clap-2.24.2/LICENSE-MIT
third_party/rust/clap-2.24.2/README.md
third_party/rust/clap-2.24.2/appveyor.yml
third_party/rust/clap-2.24.2/clap-test.rs
third_party/rust/clap-2.24.2/index.html
third_party/rust/clap-2.24.2/justfile
third_party/rust/clap-2.24.2/rustfmt.toml
third_party/rust/clap-2.24.2/src/app/help.rs
third_party/rust/clap-2.24.2/src/app/macros.rs
third_party/rust/clap-2.24.2/src/app/meta.rs
third_party/rust/clap-2.24.2/src/app/mod.rs
third_party/rust/clap-2.24.2/src/app/parser.rs
third_party/rust/clap-2.24.2/src/app/settings.rs
third_party/rust/clap-2.24.2/src/app/usage.rs
third_party/rust/clap-2.24.2/src/app/validator.rs
third_party/rust/clap-2.24.2/src/args/any_arg.rs
third_party/rust/clap-2.24.2/src/args/arg.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/base.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/flag.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/mod.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/option.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/positional.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/switched.rs
third_party/rust/clap-2.24.2/src/args/arg_builder/valued.rs
third_party/rust/clap-2.24.2/src/args/arg_matcher.rs
third_party/rust/clap-2.24.2/src/args/arg_matches.rs
third_party/rust/clap-2.24.2/src/args/group.rs
third_party/rust/clap-2.24.2/src/args/macros.rs
third_party/rust/clap-2.24.2/src/args/matched_arg.rs
third_party/rust/clap-2.24.2/src/args/mod.rs
third_party/rust/clap-2.24.2/src/args/settings.rs
third_party/rust/clap-2.24.2/src/args/subcommand.rs
third_party/rust/clap-2.24.2/src/completions/bash.rs
third_party/rust/clap-2.24.2/src/completions/fish.rs
third_party/rust/clap-2.24.2/src/completions/macros.rs
third_party/rust/clap-2.24.2/src/completions/mod.rs
third_party/rust/clap-2.24.2/src/completions/powershell.rs
third_party/rust/clap-2.24.2/src/completions/shell.rs
third_party/rust/clap-2.24.2/src/completions/zsh.rs
third_party/rust/clap-2.24.2/src/errors.rs
third_party/rust/clap-2.24.2/src/fmt.rs
third_party/rust/clap-2.24.2/src/lib.rs
third_party/rust/clap-2.24.2/src/macros.rs
third_party/rust/clap-2.24.2/src/osstringext.rs
third_party/rust/clap-2.24.2/src/strext.rs
third_party/rust/clap-2.24.2/src/suggestions.rs
third_party/rust/clap-2.24.2/src/usage_parser.rs
third_party/rust/cookie-0.9.1/.cargo-checksum.json
third_party/rust/cookie-0.9.1/.travis.yml
third_party/rust/cookie-0.9.1/Cargo.toml
third_party/rust/cookie-0.9.1/LICENSE-APACHE
third_party/rust/cookie-0.9.1/LICENSE-MIT
third_party/rust/cookie-0.9.1/README.md
third_party/rust/cookie-0.9.1/src/builder.rs
third_party/rust/cookie-0.9.1/src/delta.rs
third_party/rust/cookie-0.9.1/src/draft.rs
third_party/rust/cookie-0.9.1/src/jar.rs
third_party/rust/cookie-0.9.1/src/lib.rs
third_party/rust/cookie-0.9.1/src/parse.rs
third_party/rust/cookie-0.9.1/src/secure/key.rs
third_party/rust/cookie-0.9.1/src/secure/macros.rs
third_party/rust/cookie-0.9.1/src/secure/mod.rs
third_party/rust/cookie-0.9.1/src/secure/private.rs
third_party/rust/cookie-0.9.1/src/secure/signed.rs
third_party/rust/flate2/src/deflate.rs
third_party/rust/flate2/src/gz.rs
third_party/rust/flate2/src/zlib.rs
third_party/rust/httparse-1.2.2/.cargo-checksum.json
third_party/rust/httparse-1.2.2/.travis.yml
third_party/rust/httparse-1.2.2/.travis_after.sh
third_party/rust/httparse-1.2.2/Cargo.toml
third_party/rust/httparse-1.2.2/LICENSE-APACHE
third_party/rust/httparse-1.2.2/LICENSE-MIT
third_party/rust/httparse-1.2.2/README.md
third_party/rust/httparse-1.2.2/benches/parse.rs
third_party/rust/httparse-1.2.2/src/iter.rs
third_party/rust/httparse-1.2.2/src/lib.rs
third_party/rust/hyper-0.10.10/.cargo-checksum.json
third_party/rust/hyper-0.10.10/Cargo.toml
third_party/rust/hyper-0.10.10/LICENSE
third_party/rust/hyper-0.10.10/build.rs
third_party/rust/hyper-0.10.10/src/buffer.rs
third_party/rust/hyper-0.10.10/src/client/mod.rs
third_party/rust/hyper-0.10.10/src/client/pool.rs
third_party/rust/hyper-0.10.10/src/client/proxy.rs
third_party/rust/hyper-0.10.10/src/client/request.rs
third_party/rust/hyper-0.10.10/src/client/response.rs
third_party/rust/hyper-0.10.10/src/error.rs
third_party/rust/hyper-0.10.10/src/header/common/accept.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_charset.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_language.rs
third_party/rust/hyper-0.10.10/src/header/common/accept_ranges.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_credentials.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_methods.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_allow_origin.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_expose_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_max_age.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_request_headers.rs
third_party/rust/hyper-0.10.10/src/header/common/access_control_request_method.rs
third_party/rust/hyper-0.10.10/src/header/common/allow.rs
third_party/rust/hyper-0.10.10/src/header/common/authorization.rs
third_party/rust/hyper-0.10.10/src/header/common/cache_control.rs
third_party/rust/hyper-0.10.10/src/header/common/connection.rs
third_party/rust/hyper-0.10.10/src/header/common/content_disposition.rs
third_party/rust/hyper-0.10.10/src/header/common/content_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/content_language.rs
third_party/rust/hyper-0.10.10/src/header/common/content_length.rs
third_party/rust/hyper-0.10.10/src/header/common/content_range.rs
third_party/rust/hyper-0.10.10/src/header/common/content_type.rs
third_party/rust/hyper-0.10.10/src/header/common/cookie.rs
third_party/rust/hyper-0.10.10/src/header/common/date.rs
third_party/rust/hyper-0.10.10/src/header/common/etag.rs
third_party/rust/hyper-0.10.10/src/header/common/expect.rs
third_party/rust/hyper-0.10.10/src/header/common/expires.rs
third_party/rust/hyper-0.10.10/src/header/common/from.rs
third_party/rust/hyper-0.10.10/src/header/common/host.rs
third_party/rust/hyper-0.10.10/src/header/common/if_match.rs
third_party/rust/hyper-0.10.10/src/header/common/if_modified_since.rs
third_party/rust/hyper-0.10.10/src/header/common/if_none_match.rs
third_party/rust/hyper-0.10.10/src/header/common/if_range.rs
third_party/rust/hyper-0.10.10/src/header/common/if_unmodified_since.rs
third_party/rust/hyper-0.10.10/src/header/common/last-event-id.rs
third_party/rust/hyper-0.10.10/src/header/common/last_modified.rs
third_party/rust/hyper-0.10.10/src/header/common/location.rs
third_party/rust/hyper-0.10.10/src/header/common/mod.rs
third_party/rust/hyper-0.10.10/src/header/common/origin.rs
third_party/rust/hyper-0.10.10/src/header/common/pragma.rs
third_party/rust/hyper-0.10.10/src/header/common/prefer.rs
third_party/rust/hyper-0.10.10/src/header/common/preference_applied.rs
third_party/rust/hyper-0.10.10/src/header/common/range.rs
third_party/rust/hyper-0.10.10/src/header/common/referer.rs
third_party/rust/hyper-0.10.10/src/header/common/referrer_policy.rs
third_party/rust/hyper-0.10.10/src/header/common/server.rs
third_party/rust/hyper-0.10.10/src/header/common/set_cookie.rs
third_party/rust/hyper-0.10.10/src/header/common/strict_transport_security.rs
third_party/rust/hyper-0.10.10/src/header/common/transfer_encoding.rs
third_party/rust/hyper-0.10.10/src/header/common/upgrade.rs
third_party/rust/hyper-0.10.10/src/header/common/user_agent.rs
third_party/rust/hyper-0.10.10/src/header/common/vary.rs
third_party/rust/hyper-0.10.10/src/header/internals/cell.rs
third_party/rust/hyper-0.10.10/src/header/internals/item.rs
third_party/rust/hyper-0.10.10/src/header/internals/mod.rs
third_party/rust/hyper-0.10.10/src/header/internals/vec_map.rs
third_party/rust/hyper-0.10.10/src/header/mod.rs
third_party/rust/hyper-0.10.10/src/header/parsing.rs
third_party/rust/hyper-0.10.10/src/header/shared/charset.rs
third_party/rust/hyper-0.10.10/src/header/shared/encoding.rs
third_party/rust/hyper-0.10.10/src/header/shared/entity.rs
third_party/rust/hyper-0.10.10/src/header/shared/httpdate.rs
third_party/rust/hyper-0.10.10/src/header/shared/mod.rs
third_party/rust/hyper-0.10.10/src/header/shared/quality_item.rs
third_party/rust/hyper-0.10.10/src/http/h1.rs
third_party/rust/hyper-0.10.10/src/http/message.rs
third_party/rust/hyper-0.10.10/src/http/mod.rs
third_party/rust/hyper-0.10.10/src/lib.rs
third_party/rust/hyper-0.10.10/src/method.rs
third_party/rust/hyper-0.10.10/src/mock.rs
third_party/rust/hyper-0.10.10/src/net.rs
third_party/rust/hyper-0.10.10/src/server/listener.rs
third_party/rust/hyper-0.10.10/src/server/mod.rs
third_party/rust/hyper-0.10.10/src/server/request.rs
third_party/rust/hyper-0.10.10/src/server/response.rs
third_party/rust/hyper-0.10.10/src/status.rs
third_party/rust/hyper-0.10.10/src/uri.rs
third_party/rust/hyper-0.10.10/src/version.rs
third_party/rust/lazy_static-0.2.2/.cargo-checksum.json
third_party/rust/lazy_static-0.2.2/.travis.yml
third_party/rust/lazy_static-0.2.2/Cargo.toml
third_party/rust/lazy_static-0.2.2/LICENSE
third_party/rust/lazy_static-0.2.2/README.md
third_party/rust/lazy_static-0.2.2/src/core_lazy.rs
third_party/rust/lazy_static-0.2.2/src/lazy.rs
third_party/rust/lazy_static-0.2.2/src/lib.rs
third_party/rust/lazy_static-0.2.2/src/nightly_lazy.rs
third_party/rust/lazy_static-0.2.2/tests/no_std.rs
third_party/rust/lazy_static-0.2.2/tests/test.rs
third_party/rust/log-0.3.6/.cargo-checksum.json
third_party/rust/log-0.3.6/.travis.yml
third_party/rust/log-0.3.6/Cargo.toml
third_party/rust/log-0.3.6/LICENSE-APACHE
third_party/rust/log-0.3.6/LICENSE-MIT
third_party/rust/log-0.3.6/README.md
third_party/rust/log-0.3.6/appveyor.yml
third_party/rust/log-0.3.6/src/lib.rs
third_party/rust/log-0.3.6/src/macros.rs
third_party/rust/log-0.3.6/tests/filters.rs
third_party/rust/mime-0.2.4/.cargo-checksum.json
third_party/rust/mime-0.2.4/.travis.yml
third_party/rust/mime-0.2.4/Cargo.toml
third_party/rust/mime-0.2.4/LICENSE
third_party/rust/mime-0.2.4/README.md
third_party/rust/mime-0.2.4/src/lib.rs
third_party/rust/num-traits-0.1.37/.cargo-checksum.json
third_party/rust/num-traits-0.1.37/Cargo.toml
third_party/rust/num-traits-0.1.37/LICENSE-APACHE
third_party/rust/num-traits-0.1.37/LICENSE-MIT
third_party/rust/num-traits-0.1.37/src/bounds.rs
third_party/rust/num-traits-0.1.37/src/cast.rs
third_party/rust/num-traits-0.1.37/src/float.rs
third_party/rust/num-traits-0.1.37/src/identities.rs
third_party/rust/num-traits-0.1.37/src/int.rs
third_party/rust/num-traits-0.1.37/src/lib.rs
third_party/rust/num-traits-0.1.37/src/ops/checked.rs
third_party/rust/num-traits-0.1.37/src/ops/mod.rs
third_party/rust/num-traits-0.1.37/src/ops/saturating.rs
third_party/rust/num-traits-0.1.37/src/ops/wrapping.rs
third_party/rust/num-traits-0.1.37/src/pow.rs
third_party/rust/num-traits-0.1.37/src/sign.rs
third_party/rust/num_cpus-1.2.1/.cargo-checksum.json
third_party/rust/num_cpus-1.2.1/.travis.yml
third_party/rust/num_cpus-1.2.1/Cargo.toml
third_party/rust/num_cpus-1.2.1/LICENSE-APACHE
third_party/rust/num_cpus-1.2.1/LICENSE-MIT
third_party/rust/num_cpus-1.2.1/README.md
third_party/rust/num_cpus-1.2.1/src/lib.rs
third_party/rust/quasi/.cargo-checksum.json
third_party/rust/quasi/Cargo.toml
third_party/rust/quasi/src/lib.rs
third_party/rust/quasi_codegen/.cargo-checksum.json
third_party/rust/quasi_codegen/Cargo.toml
third_party/rust/quasi_codegen/src/lib.rs
third_party/rust/regex-0.2.1/.cargo-checksum.json
third_party/rust/regex-0.2.1/.travis.yml
third_party/rust/regex-0.2.1/CHANGELOG.md
third_party/rust/regex-0.2.1/Cargo.toml
third_party/rust/regex-0.2.1/HACKING.md
third_party/rust/regex-0.2.1/LICENSE-APACHE
third_party/rust/regex-0.2.1/LICENSE-MIT
third_party/rust/regex-0.2.1/PERFORMANCE.md
third_party/rust/regex-0.2.1/README.md
third_party/rust/regex-0.2.1/appveyor.yml
third_party/rust/regex-0.2.1/ci/after_success.sh
third_party/rust/regex-0.2.1/ci/run-kcov
third_party/rust/regex-0.2.1/ci/run-shootout-test
third_party/rust/regex-0.2.1/ci/script.sh
third_party/rust/regex-0.2.1/examples/regexdna-input.txt
third_party/rust/regex-0.2.1/examples/regexdna-output.txt
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-bytes.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-cheat.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-replace.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-single-cheat.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna-single.rs
third_party/rust/regex-0.2.1/examples/shootout-regex-dna.rs
third_party/rust/regex-0.2.1/scripts/frequencies.py
third_party/rust/regex-0.2.1/scripts/regex-match-tests.py
third_party/rust/regex-0.2.1/scripts/unicode.py
third_party/rust/regex-0.2.1/src/backtrack.rs
third_party/rust/regex-0.2.1/src/compile.rs
third_party/rust/regex-0.2.1/src/dfa.rs
third_party/rust/regex-0.2.1/src/error.rs
third_party/rust/regex-0.2.1/src/exec.rs
third_party/rust/regex-0.2.1/src/expand.rs
third_party/rust/regex-0.2.1/src/freqs.rs
third_party/rust/regex-0.2.1/src/input.rs
third_party/rust/regex-0.2.1/src/lib.rs
third_party/rust/regex-0.2.1/src/literals.rs
third_party/rust/regex-0.2.1/src/pattern.rs
third_party/rust/regex-0.2.1/src/pikevm.rs
third_party/rust/regex-0.2.1/src/prog.rs
third_party/rust/regex-0.2.1/src/re_builder.rs
third_party/rust/regex-0.2.1/src/re_bytes.rs
third_party/rust/regex-0.2.1/src/re_plugin.rs
third_party/rust/regex-0.2.1/src/re_set.rs
third_party/rust/regex-0.2.1/src/re_trait.rs
third_party/rust/regex-0.2.1/src/re_unicode.rs
third_party/rust/regex-0.2.1/src/simd_accel/mod.rs
third_party/rust/regex-0.2.1/src/simd_accel/teddy128.rs
third_party/rust/regex-0.2.1/src/simd_fallback/mod.rs
third_party/rust/regex-0.2.1/src/simd_fallback/teddy128.rs
third_party/rust/regex-0.2.1/src/sparse.rs
third_party/rust/regex-0.2.1/src/testdata/LICENSE
third_party/rust/regex-0.2.1/src/testdata/README
third_party/rust/regex-0.2.1/src/testdata/basic.dat
third_party/rust/regex-0.2.1/src/testdata/nullsubexpr.dat
third_party/rust/regex-0.2.1/src/testdata/repetition.dat
third_party/rust/regex-0.2.1/src/utf8.rs
third_party/rust/regex-0.2.1/tests/api.rs
third_party/rust/regex-0.2.1/tests/api_str.rs
third_party/rust/regex-0.2.1/tests/bytes.rs
third_party/rust/regex-0.2.1/tests/crazy.rs
third_party/rust/regex-0.2.1/tests/flags.rs
third_party/rust/regex-0.2.1/tests/fowler.rs
third_party/rust/regex-0.2.1/tests/macros.rs
third_party/rust/regex-0.2.1/tests/macros_bytes.rs
third_party/rust/regex-0.2.1/tests/macros_str.rs
third_party/rust/regex-0.2.1/tests/misc.rs
third_party/rust/regex-0.2.1/tests/multiline.rs
third_party/rust/regex-0.2.1/tests/noparse.rs
third_party/rust/regex-0.2.1/tests/plugin.rs
third_party/rust/regex-0.2.1/tests/regression.rs
third_party/rust/regex-0.2.1/tests/replace.rs
third_party/rust/regex-0.2.1/tests/searcher.rs
third_party/rust/regex-0.2.1/tests/set.rs
third_party/rust/regex-0.2.1/tests/shortest_match.rs
third_party/rust/regex-0.2.1/tests/suffix_reverse.rs
third_party/rust/regex-0.2.1/tests/test_backtrack.rs
third_party/rust/regex-0.2.1/tests/test_backtrack_bytes.rs
third_party/rust/regex-0.2.1/tests/test_backtrack_utf8bytes.rs
third_party/rust/regex-0.2.1/tests/test_default.rs
third_party/rust/regex-0.2.1/tests/test_default_bytes.rs
third_party/rust/regex-0.2.1/tests/test_nfa.rs
third_party/rust/regex-0.2.1/tests/test_nfa_bytes.rs
third_party/rust/regex-0.2.1/tests/test_nfa_utf8bytes.rs
third_party/rust/regex-0.2.1/tests/test_plugin.rs
third_party/rust/regex-0.2.1/tests/unicode.rs
third_party/rust/regex-0.2.1/tests/word_boundary.rs
third_party/rust/regex-0.2.1/tests/word_boundary_ascii.rs
third_party/rust/regex-0.2.1/tests/word_boundary_unicode.rs
third_party/rust/regex-syntax-0.4.0/.cargo-checksum.json
third_party/rust/regex-syntax-0.4.0/Cargo.toml
third_party/rust/regex-syntax-0.4.0/src/lib.rs
third_party/rust/regex-syntax-0.4.0/src/literals.rs
third_party/rust/regex-syntax-0.4.0/src/parser.rs
third_party/rust/regex-syntax-0.4.0/src/properties.rs
third_party/rust/regex-syntax-0.4.0/src/unicode.rs
third_party/rust/rustc-serialize-0.3.22/.cargo-checksum.json
third_party/rust/rustc-serialize-0.3.22/.travis.yml
third_party/rust/rustc-serialize-0.3.22/Cargo.toml
third_party/rust/rustc-serialize-0.3.22/LICENSE-APACHE
third_party/rust/rustc-serialize-0.3.22/LICENSE-MIT
third_party/rust/rustc-serialize-0.3.22/README.md
third_party/rust/rustc-serialize-0.3.22/appveyor.yml
third_party/rust/rustc-serialize-0.3.22/benches/base64.rs
third_party/rust/rustc-serialize-0.3.22/benches/hex.rs
third_party/rust/rustc-serialize-0.3.22/benches/json.rs
third_party/rust/rustc-serialize-0.3.22/src/base64.rs
third_party/rust/rustc-serialize-0.3.22/src/collection_impls.rs
third_party/rust/rustc-serialize-0.3.22/src/hex.rs
third_party/rust/rustc-serialize-0.3.22/src/json.rs
third_party/rust/rustc-serialize-0.3.22/src/lib.rs
third_party/rust/rustc-serialize-0.3.22/src/serialize.rs
third_party/rust/rustc_version/.cargo-checksum.json
third_party/rust/rustc_version/.travis.yml
third_party/rust/rustc_version/Cargo.toml
third_party/rust/rustc_version/LICENSE-APACHE
third_party/rust/rustc_version/LICENSE-MIT
third_party/rust/rustc_version/README.md
third_party/rust/rustc_version/src/lib.rs
third_party/rust/semver-0.1.20/.cargo-checksum.json
third_party/rust/semver-0.1.20/.travis.yml
third_party/rust/semver-0.1.20/Cargo.toml
third_party/rust/semver-0.1.20/LICENSE-APACHE
third_party/rust/semver-0.1.20/LICENSE-MIT
third_party/rust/semver-0.1.20/README.md
third_party/rust/semver-0.1.20/src/lib.rs
third_party/rust/semver-0.1.20/src/version.rs
third_party/rust/semver-0.1.20/src/version_req.rs
third_party/rust/syntex/.cargo-checksum.json
third_party/rust/syntex/Cargo.toml
third_party/rust/syntex/LICENSE-APACHE
third_party/rust/syntex/LICENSE-MIT
third_party/rust/syntex/README.md
third_party/rust/syntex/src/error.rs
third_party/rust/syntex/src/lib.rs
third_party/rust/syntex/src/registry.rs
third_party/rust/syntex/src/resolver.rs
third_party/rust/syntex/src/stack.rs
third_party/rust/syntex_errors/.cargo-checksum.json
third_party/rust/syntex_errors/Cargo.toml
third_party/rust/syntex_errors/LICENSE-APACHE
third_party/rust/syntex_errors/LICENSE-MIT
third_party/rust/syntex_errors/README.md
third_party/rust/syntex_errors/src/diagnostic.rs
third_party/rust/syntex_errors/src/diagnostic_builder.rs
third_party/rust/syntex_errors/src/emitter.rs
third_party/rust/syntex_errors/src/lib.rs
third_party/rust/syntex_errors/src/lock.rs
third_party/rust/syntex_errors/src/registry.rs
third_party/rust/syntex_errors/src/snippet.rs
third_party/rust/syntex_errors/src/styled_buffer.rs
third_party/rust/syntex_pos/.cargo-checksum.json
third_party/rust/syntex_pos/Cargo.toml
third_party/rust/syntex_pos/LICENSE-APACHE
third_party/rust/syntex_pos/LICENSE-MIT
third_party/rust/syntex_pos/README.md
third_party/rust/syntex_pos/src/lib.rs
third_party/rust/syntex_syntax/.cargo-checksum.json
third_party/rust/syntex_syntax/Cargo.toml
third_party/rust/syntex_syntax/LICENSE-APACHE
third_party/rust/syntex_syntax/LICENSE-MIT
third_party/rust/syntex_syntax/README.md
third_party/rust/syntex_syntax/src/abi.rs
third_party/rust/syntex_syntax/src/ast.rs
third_party/rust/syntex_syntax/src/attr.rs
third_party/rust/syntex_syntax/src/codemap.rs
third_party/rust/syntex_syntax/src/config.rs
third_party/rust/syntex_syntax/src/diagnostic_list.rs
third_party/rust/syntex_syntax/src/diagnostics/macros.rs
third_party/rust/syntex_syntax/src/diagnostics/metadata.rs
third_party/rust/syntex_syntax/src/diagnostics/plugin.rs
third_party/rust/syntex_syntax/src/entry.rs
third_party/rust/syntex_syntax/src/ext/base.rs
third_party/rust/syntex_syntax/src/ext/build.rs
third_party/rust/syntex_syntax/src/ext/decorator.rs
third_party/rust/syntex_syntax/src/ext/env.rs
third_party/rust/syntex_syntax/src/ext/expand.rs
third_party/rust/syntex_syntax/src/ext/hygiene.rs
third_party/rust/syntex_syntax/src/ext/placeholders.rs
third_party/rust/syntex_syntax/src/ext/quote.rs
third_party/rust/syntex_syntax/src/ext/source_util.rs
third_party/rust/syntex_syntax/src/ext/tt/macro_parser.rs
third_party/rust/syntex_syntax/src/ext/tt/macro_rules.rs
third_party/rust/syntex_syntax/src/ext/tt/transcribe.rs
third_party/rust/syntex_syntax/src/feature_gate.rs
third_party/rust/syntex_syntax/src/fold.rs
third_party/rust/syntex_syntax/src/json.rs
third_party/rust/syntex_syntax/src/lib.rs
third_party/rust/syntex_syntax/src/parse/attr.rs
third_party/rust/syntex_syntax/src/parse/classify.rs
third_party/rust/syntex_syntax/src/parse/common.rs
third_party/rust/syntex_syntax/src/parse/lexer/comments.rs
third_party/rust/syntex_syntax/src/parse/lexer/mod.rs
third_party/rust/syntex_syntax/src/parse/lexer/tokentrees.rs
third_party/rust/syntex_syntax/src/parse/lexer/unicode_chars.rs
third_party/rust/syntex_syntax/src/parse/mod.rs
third_party/rust/syntex_syntax/src/parse/obsolete.rs
third_party/rust/syntex_syntax/src/parse/parser.rs
third_party/rust/syntex_syntax/src/parse/token.rs
third_party/rust/syntex_syntax/src/print/pp.rs
third_party/rust/syntex_syntax/src/print/pprust.rs
third_party/rust/syntex_syntax/src/ptr.rs
third_party/rust/syntex_syntax/src/show_span.rs
third_party/rust/syntex_syntax/src/std_inject.rs
third_party/rust/syntex_syntax/src/str.rs
third_party/rust/syntex_syntax/src/symbol.rs
third_party/rust/syntex_syntax/src/test.rs
third_party/rust/syntex_syntax/src/test_snippet.rs
third_party/rust/syntex_syntax/src/tokenstream.rs
third_party/rust/syntex_syntax/src/util/lev_distance.rs
third_party/rust/syntex_syntax/src/util/move_map.rs
third_party/rust/syntex_syntax/src/util/node_count.rs
third_party/rust/syntex_syntax/src/util/parser.rs
third_party/rust/syntex_syntax/src/util/parser_testing.rs
third_party/rust/syntex_syntax/src/util/rc_slice.rs
third_party/rust/syntex_syntax/src/util/small_vector.rs
third_party/rust/syntex_syntax/src/util/thin_vec.rs
third_party/rust/syntex_syntax/src/visit.rs
third_party/rust/term/.cargo-checksum.json
third_party/rust/term/.travis.yml
third_party/rust/term/Cargo.toml
third_party/rust/term/LICENSE-APACHE
third_party/rust/term/LICENSE-MIT
third_party/rust/term/README.md
third_party/rust/term/appveyor.yml
third_party/rust/term/rustfmt.toml
third_party/rust/term/scripts/id_rsa.enc
third_party/rust/term/scripts/travis-doc-upload.cfg
third_party/rust/term/src/lib.rs
third_party/rust/term/src/terminfo/mod.rs
third_party/rust/term/src/terminfo/parm.rs
third_party/rust/term/src/terminfo/parser/compiled.rs
third_party/rust/term/src/terminfo/parser/names.rs
third_party/rust/term/src/terminfo/searcher.rs
third_party/rust/term/src/win.rs
third_party/rust/term/tests/data/dumb
third_party/rust/term/tests/data/linux
third_party/rust/term/tests/data/linux-16color
third_party/rust/term/tests/data/linux-basic
third_party/rust/term/tests/data/linux-c
third_party/rust/term/tests/data/linux-c-nc
third_party/rust/term/tests/data/linux-koi8
third_party/rust/term/tests/data/linux-koi8r
third_party/rust/term/tests/data/linux-lat
third_party/rust/term/tests/data/linux-m
third_party/rust/term/tests/data/linux-nic
third_party/rust/term/tests/data/linux-vt
third_party/rust/term/tests/data/linux2.2
third_party/rust/term/tests/data/linux2.6
third_party/rust/term/tests/data/linux2.6.26
third_party/rust/term/tests/data/linux3.0
third_party/rust/term/tests/data/rxvt
third_party/rust/term/tests/data/rxvt-16color
third_party/rust/term/tests/data/rxvt-256color
third_party/rust/term/tests/data/rxvt-88color
third_party/rust/term/tests/data/rxvt-basic
third_party/rust/term/tests/data/rxvt-color
third_party/rust/term/tests/data/rxvt-cygwin
third_party/rust/term/tests/data/rxvt-cygwin-native
third_party/rust/term/tests/data/rxvt-xpm
third_party/rust/term/tests/data/screen
third_party/rust/term/tests/data/screen-256color
third_party/rust/term/tests/data/xterm
third_party/rust/term/tests/data/xterm-256color
third_party/rust/term/tests/terminfo.rs
third_party/rust/thread-id-3.0.0/.appveyor.yml
third_party/rust/thread-id-3.0.0/.cargo-checksum.json
third_party/rust/thread-id-3.0.0/.travis.yml
third_party/rust/thread-id-3.0.0/Cargo.toml
third_party/rust/thread-id-3.0.0/license
third_party/rust/thread-id-3.0.0/readme.md
third_party/rust/thread-id-3.0.0/src/lib.rs
third_party/rust/unicase-1.4.0/.cargo-checksum.json
third_party/rust/unicase-1.4.0/.travis.yml
third_party/rust/unicase-1.4.0/Cargo.toml
third_party/rust/unicase-1.4.0/LICENSE
third_party/rust/unicase-1.4.0/README.md
third_party/rust/unicase-1.4.0/build.rs
third_party/rust/unicase-1.4.0/src/lib.rs
toolkit/components/thumbnails/BrowserPageThumbs.manifest
toolkit/components/thumbnails/PageThumbsProtocol.js
toolkit/mozapps/extensions/test/addons/test_langpack/chrome.manifest
toolkit/mozapps/extensions/test/addons/test_langpack/install.rdf
toolkit/mozapps/extensions/test/xpcshell/test_langpack.js
toolkit/themes/windows/global/globalBindings.xml
toolkit/themes/windows/global/radio/radio-check-dis.gif
toolkit/themes/windows/global/radio/radio-check.gif
--- a/.gitignore
+++ b/.gitignore
@@ -2,16 +2,17 @@
 
 # Filenames that should be ignored wherever they appear
 *~
 *.pyc
 *.pyo
 TAGS
 tags
 ID
+!/browser/extensions/activity-stream/prerendered/id/
 !/browser/extensions/screenshots/webextension/_locales/id/
 .DS_Store*
 *.pdb
 *.egg-info
 
 # Vim swap files.
 .*.sw[a-z]
 
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,9 +17,9 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
-Bug 1163171, Android compiler change
+Bug 1413550 - Activity Stream removed a bunch of files that would break ./mach package
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1522,21 +1522,17 @@ pref("experiments.supported", true);
 pref("browser.ping-centre.telemetry", true);
 pref("browser.ping-centre.log", false);
 pref("browser.ping-centre.staging.endpoint", "https://onyx_tiles.stage.mozaws.net/v3/links/ping-centre");
 pref("browser.ping-centre.production.endpoint", "https://tiles.services.mozilla.com/v3/links/ping-centre");
 
 // Enable GMP support in the addon manager.
 pref("media.gmp-provider.enabled", true);
 
-#ifdef NIGHTLY_BUILD
 pref("privacy.trackingprotection.ui.enabled", true);
-#else
-pref("privacy.trackingprotection.ui.enabled", false);
-#endif
 pref("privacy.trackingprotection.introCount", 0);
 pref("privacy.trackingprotection.introURL", "https://www.mozilla.org/%LOCALE%/firefox/%VERSION%/tracking-protection/start/");
 
 // Enable Contextual Identity Containers
 #ifdef NIGHTLY_BUILD
 pref("privacy.userContext.enabled", true);
 pref("privacy.userContext.ui.enabled", true);
 pref("privacy.usercontext.about_newtab_segregation.enabled", true);
--- a/browser/base/content/browser-tabsintitlebar.js
+++ b/browser/base/content/browser-tabsintitlebar.js
@@ -9,16 +9,21 @@
 var TabsInTitlebar = {
   init() {
     if (this._initialized) {
       return;
     }
     this._readPref();
     Services.prefs.addObserver(this._prefName, this);
 
+    // Always disable on unsupported GTK versions.
+    if (AppConstants.MOZ_WIDGET_TOOLKIT == "gtk3") {
+      this.allowedBy("gtk", window.matchMedia("(-moz-gtk-csd-available)"));
+    }
+
     // We need to update the appearance of the titlebar when the menu changes
     // from the active to the inactive state. We can't, however, rely on
     // DOMMenuBarInactive, because the menu fires this event and then removes
     // the inactive attribute after an event-loop spin.
     //
     // Because updating the appearance involves sampling the heights and margins
     // of various elements, it's important that the layout be more or less
     // settled before updating the titlebar. So instead of listening to
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -7194,16 +7194,20 @@ var gIdentityHandler = {
   get _isMixedPassiveContentLoaded() {
     return this._state & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT;
   },
 
   get _isCertUserOverridden() {
     return this._state & Ci.nsIWebProgressListener.STATE_CERT_USER_OVERRIDDEN;
   },
 
+  get _isCertDistrustImminent() {
+    return this._state & Ci.nsIWebProgressListener.STATE_CERT_DISTRUST_IMMINENT;
+  },
+
   get _hasInsecureLoginForms() {
     // checks if the page has been flagged for an insecure login. Also checks
     // if the pref to degrade the UI is set to true
     return LoginManagerParent.hasInsecureLoginForms(gBrowser.selectedBrowser) &&
            Services.prefs.getBoolPref("security.insecure_password.ui.enabled");
   },
 
   // smart getters
@@ -7445,16 +7449,29 @@ var gIdentityHandler = {
     if (shouldHidePopup) {
       this._identityPopup.hidePopup();
     }
 
     // NOTE: We do NOT update the identity popup (the control center) when
     // we receive a new security state on the existing page (i.e. from a
     // subframe). If the user opened the popup and looks at the provided
     // information we don't want to suddenly change the panel contents.
+
+    // Finally, if there are warnings to issue, issue them
+    if (this._isCertDistrustImminent) {
+      let consoleMsg = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError);
+      let windowId = gBrowser.selectedBrowser.innerWindowID;
+      let message = gBrowserBundle.GetStringFromName("certImminentDistrust.message");
+      // Use uri.prePath instead of initWithSourceURI() so that these can be
+      // de-duplicated on the scheme+host+port combination.
+      consoleMsg.initWithWindowID(message, uri.prePath, null, 0, 0,
+                                  Ci.nsIScriptError.warningFlag, "SSL",
+                                  windowId);
+      Services.console.logMessage(consoleMsg);
+    }
   },
 
   /**
    * This is called asynchronously when requested by the Logins module, after
    * the insecure login forms state for the page has been updated.
    */
   refreshForInsecureLoginForms() {
     // Check this._uri because we don't want to refresh the user interface if
--- a/browser/base/content/newtab/grid.js
+++ b/browser/base/content/newtab/grid.js
@@ -178,18 +178,18 @@ var gGrid = {
     let site = document.createElementNS(HTML_NAMESPACE, "div");
     site.classList.add("newtab-site");
     site.setAttribute("draggable", "true");
 
     // Create the site's inner HTML code.
     site.innerHTML =
       '<a class="newtab-link">' +
       '  <span class="newtab-thumbnail placeholder"/>' +
-      '  <span class="newtab-thumbnail thumbnail"/>' +
-      '  <span class="newtab-thumbnail enhanced-content"/>' +
+      '  <img src="" alt="" class="newtab-thumbnail thumbnail"/>' +
+      '  <img src="" alt="" class="newtab-thumbnail enhanced-content"/>' +
       '  <span class="newtab-title"/>' +
       '</a>' +
       '<input type="button" title="' + newTabString("pin") + '"' +
       '       class="newtab-control newtab-control-pin"/>' +
       '<input type="button" title="' + newTabString("block") + '"' +
       '       class="newtab-control newtab-control-block"/>';
 
     this._siteFragment = document.createDocumentFragment();
--- a/browser/base/content/newtab/sites.js
+++ b/browser/base/content/newtab/sites.js
@@ -181,17 +181,17 @@ Site.prototype = {
     let link = gAllPages.enhanced && DirectoryLinksProvider.getEnhancedLink(this.link) ||
                this.link;
 
     let thumbnail = this._querySelector(".newtab-thumbnail.thumbnail");
     if (link.bgColor) {
       thumbnail.style.backgroundColor = link.bgColor;
     }
     let uri = link.imageURI || PageThumbs.getThumbnailURL(this.url);
-    thumbnail.style.backgroundImage = 'url("' + uri + '")';
+    thumbnail.src = uri;
 
     if (THUMBNAIL_PLACEHOLDER_ENABLED &&
         link.type == "history" &&
         link.baseDomain) {
       let placeholder = this._querySelector(".newtab-thumbnail.placeholder");
       let charCodeSum = 0;
       for (let c of link.baseDomain) {
         charCodeSum += c.charCodeAt(0);
@@ -199,17 +199,17 @@ Site.prototype = {
       const COLORS = 16;
       let hue = Math.round((charCodeSum % COLORS) / COLORS * 360);
       placeholder.style.backgroundColor = "hsl(" + hue + ",80%,40%)";
       placeholder.textContent = link.baseDomain.substr(0,1).toUpperCase();
     }
 
     if (link.enhancedImageURI) {
       let enhanced = this._querySelector(".enhanced-content");
-      enhanced.style.backgroundImage = 'url("' + link.enhancedImageURI + '")';
+      enhanced.src = link.enhancedImageURI;
     }
   },
 
   /**
    * Adds event handlers for the site and its buttons.
    */
   _addEventHandlers: function Site_addEventHandlers() {
     // Register drag-and-drop event handlers.
--- a/browser/base/content/test/newtab/browser_newtab_background_captures.js
+++ b/browser/base/content/test/newtab/browser_newtab_background_captures.js
@@ -3,26 +3,27 @@
 
 /**
  * Verifies that hidden, pre-loaded newtabs don't allow background captures, and
  * when unhidden, do allow background captures.
  */
 
 const CAPTURE_PREF = "browser.pagethumbnails.capturing_disabled";
 
+XPCOMUtils.defineLazyServiceGetter(this, "PageThumbsStorageService",
+  "@mozilla.org/thumbnails/pagethumbs-service;1",
+  "nsIPageThumbsStorageService");
+
 add_task(async function() {
-  let imports = {};
-  Cu.import("resource://gre/modules/PageThumbs.jsm", imports);
-
   // Disable captures.
   await pushPrefs([CAPTURE_PREF, false]);
 
   // Make sure the thumbnail doesn't exist yet.
   let url = "http://example.com/";
-  let path = imports.PageThumbsStorage.getFilePathForURL(url);
+  let path = PageThumbsStorageService.getFilePathForURL(url);
   let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
   file.initWithPath(path);
   try {
     file.remove(false);
   } catch (err) {}
 
   // Add a top site.
   await setLinks("-1");
--- a/browser/base/content/test/static/browser_all_files_referenced.js
+++ b/browser/base/content/test/static/browser_all_files_referenced.js
@@ -20,16 +20,18 @@ var gExceptionPaths = [
   "resource://gre/defaults/pref/",
   "resource://shield-recipe-client/node_modules/jexl/lib/",
 
   // https://github.com/mozilla/normandy/issues/577
   "resource://shield-recipe-client/test/",
 
   // https://github.com/mozilla/activity-stream/issues/3053
   "resource://activity-stream/data/content/tippytop/images/",
+  // https://github.com/mozilla/activity-stream/issues/3758
+  "resource://activity-stream/prerendered/",
 
   // browser/extensions/pdfjs/content/build/pdf.js#1999
   "resource://pdf.js/web/images/",
 ];
 
 // These are not part of the omni.ja file, so we find them only when running
 // the test on a non-packaged build.
 if (AppConstants.platform == "macosx")
--- a/browser/base/content/test/static/browser_parsable_css.js
+++ b/browser/base/content/test/static/browser_parsable_css.js
@@ -85,21 +85,21 @@ let allowedImageReferences = [
   {file: "chrome://devtools/skin/images/dock-bottom-minimize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
   {file: "chrome://devtools/skin/images/dock-bottom-maximize@2x.png",
    from: "chrome://devtools/skin/toolbox.css",
    isFromDevTools: true},
   // Bug 1405539
   {file: "chrome://global/skin/arrow/panelarrow-vertical@2x.png",
-   from: "resource://activity-stream/data/content/activity-stream.css",
+   from: "resource://activity-stream/css/activity-stream.css",
    isFromDevTools: false,
    platforms: ["linux", "win"]},
   {file: "chrome://global/skin/arrow/panelarrow-vertical-themed.svg",
-   from: "resource://activity-stream/data/content/activity-stream.css",
+   from: "resource://activity-stream/css/activity-stream.css",
    isFromDevTools: false,
    platforms: ["macosx"]},
 ];
 
 // Add suffix to stylesheets' URI so that we always load them here and
 // have them parsed. Add a random number so that even if we run this
 // test multiple times, it would be unlikely to affect each other.
 const kPathSuffix = "?always-parse-css-" + Math.random();
--- a/browser/components/newtab/aboutNewTabService.js
+++ b/browser/components/newtab/aboutNewTabService.js
@@ -11,39 +11,38 @@ const {utils: Cu, interfaces: Ci} = Comp
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "AboutNewTab",
                                   "resource:///modules/AboutNewTab.jsm");
 
 const LOCAL_NEWTAB_URL = "chrome://browser/content/newtab/newTab.xhtml";
+const TOPIC_APP_QUIT = "quit-application-granted";
+const TOPIC_LOCALES_CHANGE = "intl:requested-locales-changed";
 
-// Debug versions are only available in Nightly
-const ACTIVITY_STREAM_URLS = {
-  "": "resource://activity-stream/data/content/activity-stream.html",
-  "debug": "resource://activity-stream/data/content/activity-stream-debug.html",
-  "prerender": "resource://activity-stream/data/content/activity-stream-prerendered.html",
-  "prerenderdebug": "resource://activity-stream/data/content/activity-stream-prerendered-debug.html",
-};
+// Automated tests ensure packaged locales are in this list. Copied output of:
+// https://github.com/mozilla/activity-stream/blob/master/bin/render-activity-stream-html.js
+const ACTIVITY_STREAM_LOCALES = new Set("en-US ach ar ast az be bg bn-BD bn-IN br bs ca cak cs cy da de dsb el en-GB eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gu-IN he hi-IN hr hsb hu hy-AM ia id it ja ka kab kk km kn ko lij lo lt ltg lv mk ml mr ms my nb-NO ne-NP nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru sk sl sq sr sv-SE ta te th tl tr uk ur uz vi zh-CN zh-TW".split(" "));
 
 const ABOUT_URL = "about:newtab";
 
 const IS_MAIN_PROCESS = Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_DEFAULT;
 
 const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA;
 
 // Pref that tells if activity stream is enabled
 const PREF_ACTIVITY_STREAM_ENABLED = "browser.newtabpage.activity-stream.enabled";
 const PREF_ACTIVITY_STREAM_PRERENDER_ENABLED = "browser.newtabpage.activity-stream.prerender";
 const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
 
 
 function AboutNewTabService() {
-  Services.obs.addObserver(this, "quit-application-granted");
+  Services.obs.addObserver(this, TOPIC_APP_QUIT);
+  Services.obs.addObserver(this, TOPIC_LOCALES_CHANGE);
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
   Services.prefs.addObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
   if (!IS_RELEASE_OR_BETA) {
     Services.prefs.addObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
   }
 
   // More initialization happens here
   this.toggleActivityStream();
@@ -88,16 +87,17 @@ function AboutNewTabService() {
  * LOAD_NORMAL or LOAD_REPLACE flags yield unexpected behaviors, so a roundtrip
  * to the redirector from browser chrome is avoided.
  */
 AboutNewTabService.prototype = {
 
   _newTabURL: ABOUT_URL,
   _activityStreamEnabled: false,
   _activityStreamPrerender: false,
+  _activityStreamPath: "",
   _activityStreamDebug: false,
   _overridden: false,
 
   classID: Components.ID("{dfcd2adc-7867-4d3a-ba70-17501f208142}"),
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIAboutNewTabService,
     Ci.nsIObserver
   ]),
@@ -105,35 +105,44 @@ AboutNewTabService.prototype = {
     service: true
   }],
 
   observe(subject, topic, data) {
     switch (topic) {
       case "nsPref:changed":
         if (data === PREF_ACTIVITY_STREAM_ENABLED) {
           if (this.toggleActivityStream()) {
-            Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+            this.notifyChange();
           }
         } else if (data === PREF_ACTIVITY_STREAM_PRERENDER_ENABLED) {
           this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
-          Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+          this.notifyChange();
         } else if (!IS_RELEASE_OR_BETA && data === PREF_ACTIVITY_STREAM_DEBUG) {
           this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
-          Services.obs.notifyObservers(null, "newtab-url-changed", ABOUT_URL);
+          this.updatePrerenderedPath();
+          this.notifyChange();
         }
         break;
-      case "quit-application-granted":
+      case TOPIC_APP_QUIT:
         this.uninit();
         if (IS_MAIN_PROCESS) {
           AboutNewTab.uninit();
         }
         break;
+      case TOPIC_LOCALES_CHANGE:
+        this.updatePrerenderedPath();
+        this.notifyChange();
+        break;
     }
   },
 
+  notifyChange() {
+    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+  },
+
   /**
    * React to changes to the activity stream pref.
    *
    * If browser.newtabpage.activity-stream.enabled is true, this will change the default URL to the
    * activity stream page URL. If browser.newtabpage.activity-stream.enabled is false, the default URL
    * will be a local chrome URL.
    *
    * This will only act if there is a change of state and if not overridden.
@@ -154,33 +163,70 @@ AboutNewTabService.prototype = {
       this._activityStreamEnabled = true;
     } else {
       this._activityStreamEnabled = false;
     }
     this._activityStreamPrerender = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED);
     if (!IS_RELEASE_OR_BETA) {
       this._activityStreamDebug = Services.prefs.getBoolPref(PREF_ACTIVITY_STREAM_DEBUG, false);
     }
+    this.updatePrerenderedPath();
     this._newtabURL = ABOUT_URL;
     return true;
   },
 
+  /**
+   * Figure out what path under prerendered to use based on current state.
+   */
+  updatePrerenderedPath() {
+    // Debug files are specially packaged in a non-localized directory
+    let path;
+    if (this._activityStreamDebug) {
+      path = "static";
+    } else {
+      // Use the exact match locale if it's packaged
+      const locale = Services.locale.getRequestedLocale();
+      if (ACTIVITY_STREAM_LOCALES.has(locale)) {
+        path = locale;
+      } else {
+        // Fall back to a shared-language packaged locale
+        const language = locale.split("-")[0];
+        if (ACTIVITY_STREAM_LOCALES.has(language)) {
+          path = language;
+        } else {
+          // Just use the default locale as a final fallback
+          path = "en-US";
+        }
+      }
+    }
+    this._activityStreamPath = `${path}/`;
+  },
+
   /*
    * Returns the default URL.
    *
    * This URL only depends on the browser.newtabpage.activity-stream.enabled pref. Overriding
    * the newtab page has no effect on the result of this function.
    *
    * @returns {String} the default newtab URL, activity-stream or regular depending on browser.newtabpage.activity-stream.enabled
    */
   get defaultURL() {
     if (this.activityStreamEnabled) {
-      const prerender = this.activityStreamPrerender ? "prerender" : "";
-      const debug = this.activityStreamDebug ? "debug" : "";
-      return ACTIVITY_STREAM_URLS[prerender + debug];
+      // Generate the desired activity stream resource depending on state, e.g.,
+      // resource://activity-stream/prerendered/ar/activity-stream.html
+      // resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html
+      // resource://activity-stream/prerendered/static/activity-stream-debug.html
+      return [
+        "resource://activity-stream/prerendered/",
+        this._activityStreamPath,
+        "activity-stream",
+        this._activityStreamPrerender ? "-prerendered" : "",
+        this._activityStreamDebug ? "-debug" : "",
+        ".html"
+      ].join("");
     }
     return LOCAL_NEWTAB_URL;
   },
 
   get newTabURL() {
     return this._newTabURL;
   },
 
@@ -192,17 +238,17 @@ AboutNewTabService.prototype = {
       return;
     } else if (aNewTabURL === "") {
       aNewTabURL = "about:blank";
     }
 
     this.toggleActivityStream(false);
     this._newTabURL = aNewTabURL;
     this._overridden = true;
-    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+    this.notifyChange();
   },
 
   get overridden() {
     return this._overridden;
   },
 
   get activityStreamEnabled() {
     return this._activityStreamEnabled;
@@ -215,24 +261,25 @@ AboutNewTabService.prototype = {
   get activityStreamDebug() {
     return this._activityStreamDebug;
   },
 
   resetNewTabURL() {
     this._overridden = false;
     this._newTabURL = ABOUT_URL;
     this.toggleActivityStream(undefined, true);
-    Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
+    this.notifyChange();
   },
 
   uninit() {
     if (!this.initialized) {
       return;
     }
-    Services.obs.removeObserver(this, "quit-application-granted");
+    Services.obs.removeObserver(this, TOPIC_APP_QUIT);
+    Services.obs.removeObserver(this, TOPIC_LOCALES_CHANGE);
     Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_ENABLED, this);
     Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_PRERENDER_ENABLED, this);
     if (!IS_RELEASE_OR_BETA) {
       Services.prefs.removeObserver(PREF_ACTIVITY_STREAM_DEBUG, this);
     }
     this.initialized = false;
   }
 };
--- a/browser/components/newtab/tests/browser/browser.ini
+++ b/browser/components/newtab/tests/browser/browser.ini
@@ -1,3 +1,4 @@
 [DEFAULT]
 
+[browser_packaged_as_locales.js]
 [browser_newtab_overrides.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/newtab/tests/browser/browser_packaged_as_locales.js
@@ -0,0 +1,52 @@
+const LOCALE_PREF = "general.useragent.locale";
+
+XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
+                                   "@mozilla.org/browser/aboutnewtab-service;1",
+                                   "nsIAboutNewTabService");
+
+const DEFAULT_URL = "resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html";
+async function getUrlForLocale(locale) {
+  await SpecialPowers.pushPrefEnv({set: [[LOCALE_PREF, locale]]});
+  return aboutNewTabService.defaultURL;
+}
+
+/**
+ * Test that an unknown locale defaults to en-US
+ */
+add_task(async function test_unknown_locale() {
+  const url = await getUrlForLocale("foo-BAR");
+  Assert.equal(url, DEFAULT_URL);
+});
+
+/**
+ * Test that we at least have en-US
+ */
+add_task(async function test_default_locale() {
+  const url = await getUrlForLocale("en-US");
+  Assert.equal(url, DEFAULT_URL);
+});
+
+/**
+ * Test that we use a shared language before en-US
+ */
+add_task(async function test_default_locale() {
+  const url = await getUrlForLocale("de-UNKNOWN");
+  Assert.equal(url, DEFAULT_URL.replace("en-US", "de"));
+});
+
+/**
+ * Tests that all activity stream packaged locales can be referenced / accessed
+ */
+add_task(async function test_all_packaged_locales() {
+  const listing = await (await fetch("resource://activity-stream/prerendered/")).text();
+  for (const line of listing.split("\n").slice(2)) {
+    const [file, , , type] = line.split(" ").slice(1);
+    if (type === "DIRECTORY") {
+      const locale = file.replace("/", "");
+      if (locale !== "static") {
+        const url = await getUrlForLocale(locale);
+        Assert[locale === "en-US" ? "equal" : "notEqual"](url, DEFAULT_URL, `can reference "${locale}" files`);
+      }
+    }
+  }
+});
--- a/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
+++ b/browser/components/newtab/tests/xpcshell/test_AboutNewTabService.js
@@ -10,20 +10,20 @@ Cu.import("resource://gre/modules/XPCOMU
 Cu.import("resource://gre/modules/Preferences.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
                                    "@mozilla.org/browser/aboutnewtab-service;1",
                                    "nsIAboutNewTabService");
 
 const IS_RELEASE_OR_BETA = AppConstants.RELEASE_OR_BETA;
 
-const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/data/content/activity-stream-prerendered.html";
-const ACTIVITY_STREAM_PRERENDER_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-prerendered-debug.html";
-const ACTIVITY_STREAM_URL = "resource://activity-stream/data/content/activity-stream.html";
-const ACTIVITY_STREAM_DEBUG_URL = "resource://activity-stream/data/content/activity-stream-debug.html";
+const ACTIVITY_STREAM_PRERENDER_URL = "resource://activity-stream/prerendered/en-US/activity-stream-prerendered.html";
+const ACTIVITY_STREAM_PRERENDER_DEBUG_URL = "resource://activity-stream/prerendered/static/activity-stream-prerendered-debug.html";
+const ACTIVITY_STREAM_URL = "resource://activity-stream/prerendered/en-US/activity-stream.html";
+const ACTIVITY_STREAM_DEBUG_URL = "resource://activity-stream/prerendered/static/activity-stream-debug.html";
 
 const DEFAULT_CHROME_URL = "chrome://browser/content/newtab/newTab.xhtml";
 const DOWNLOADS_URL = "chrome://browser/content/downloads/contentAreaDownloadsView.xul";
 const ACTIVITY_STREAM_PREF = "browser.newtabpage.activity-stream.enabled";
 const ACTIVITY_STREAM_PRERENDER_PREF = "browser.newtabpage.activity-stream.prerender";
 const ACTIVITY_STREAM_DEBUG_PREF = "browser.newtabpage.activity-stream.debug";
 
 function cleanup() {
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -1313,46 +1313,30 @@ PlacesController.prototype = {
     }
 
     let itemsToSelect = [];
     if (PlacesUIUtils.useAsyncTransactions) {
       if (ip.isTag) {
         let urls = items.filter(item => "uri" in item).map(item => Services.io.newURI(item.uri));
         await PlacesTransactions.Tag({ urls, tag: ip.tagName }).transact();
       } else {
-        let transactionData = [];
+        let transactions = [];
 
         let insertionIndex = await ip.getIndex();
-        let parent = ip.guid;
-
-        for (let item of items) {
-          let doCopy = action == "copy";
-
-          // If this is not a copy, check for safety that we can move the
-          // source, otherwise report an error and fallback to a copy.
-          if (!doCopy &&
-              !PlacesControllerDragHelper.canMoveUnwrappedNode(item)) {
-            Components.utils.reportError("Tried to move an unmovable " +
-                           "Places node, reverting to a copy operation.");
-            doCopy = true;
-          }
-
-          transactionData.push([item, type, parent, insertionIndex, doCopy]);
-
-          // Adjust index to make sure items are pasted in the correct
-          // position.  If index is DEFAULT_INDEX, items are just appended.
-          if (insertionIndex != PlacesUtils.bookmarks.DEFAULT_INDEX)
-            insertionIndex++;
+        let doCopy = action == "copy";
+        let newTransactions = await getTransactionsForTransferItems(type,
+          items, insertionIndex, ip.guid, doCopy);
+        if (newTransactions.length) {
+          transactions = [...transactions, ...newTransactions];
         }
 
-        await PlacesUIUtils.batchUpdatesForNode(this._view.result, transactionData.length, async () => {
+        await PlacesUIUtils.batchUpdatesForNode(this._view.result, transactions.length, async () => {
           await PlacesTransactions.batch(async () => {
-            for (let item of transactionData) {
-              let guid = await PlacesUIUtils.getTransactionForData(
-                ...item).transact();
+            for (let transaction of transactions) {
+              let guid = await transaction.transact();
               itemsToSelect.push(await PlacesUtils.promiseItemId(guid));
             }
           });
         });
       }
     } else {
       let transactions = [];
       let insertionIndex = await ip.getIndex();
@@ -1629,17 +1613,16 @@ var PlacesControllerDragHelper = {
    *                                dropped to. This allows batching to take
    *                                place.
    */
   async onDrop(insertionPoint, dt, view) {
     let doCopy = ["copy", "link"].includes(dt.dropEffect);
 
     let transactions = [];
     let dropCount = dt.mozItemCount;
-    let movedCount = 0;
     let parentGuid = insertionPoint.guid;
     let tagName = insertionPoint.tagName;
 
     // Following flavors may contain duplicated data.
     let duplicable = new Map();
     duplicable.set(PlacesUtils.TYPE_UNICODE, new Set());
     duplicable.set(PlacesUtils.TYPE_X_MOZ_URL, new Set());
 
@@ -1671,79 +1654,67 @@ var PlacesControllerDragHelper = {
         let uri = data.linkedBrowser.currentURI;
         let spec = uri ? uri.spec : "about:blank";
         nodes = [{ uri: spec,
                    title: data.label,
                    type: PlacesUtils.TYPE_X_MOZ_URL}];
       } else
         throw new Error("bogus data was passed as a tab");
 
-      for (let unwrapped of nodes) {
-        let index = await insertionPoint.getIndex();
-
-        if (index != -1 && unwrapped.itemGuid) {
-          // Note: we use the parent from the existing bookmark as the sidebar
-          // gives us an unwrapped.parent that is actually a query and not the real
-          // parent.
-          let existingBookmark = await PlacesUtils.bookmarks.fetch(unwrapped.itemGuid);
+      if (PlacesUIUtils.useAsyncTransactions) {
+        // If dragging over a tag container we should tag the item.
+        if (insertionPoint.isTag) {
+          let urls = nodes.filter(item => "uri" in item).map(item => item.uri);
+          transactions.push(PlacesTransactions.Tag({ urls, tag: tagName }));
+        } else {
+          let insertionIndex = await insertionPoint.getIndex();
+          let newTransactions = await getTransactionsForTransferItems(flavor,
+            nodes, insertionIndex, parentGuid, doCopy);
+          if (newTransactions.length) {
+            transactions = [...transactions, ...newTransactions];
+          }
+        }
+      } else {
+        let movedCount = 0;
+        for (let unwrapped of nodes) {
+          let index = await insertionPoint.getIndex();
 
-          // If we're dropping on the same folder, then we may need to adjust
-          // the index to insert at the correct place.
-          if (existingBookmark && parentGuid == existingBookmark.parentGuid) {
-            if (PlacesUIUtils.useAsyncTransactions) {
-              if (index < existingBookmark.index) {
-                // When you drag multiple elts upward: need to increment index or
-                // each successive elt will be inserted at the same index, each
-                // above the previous.
-                index += movedCount++;
-              } else if (index > existingBookmark.index) {
-                // If we're dragging down, we need to go one lower to insert at
-                // the real point as moving the element changes the index of
-                // everything below by 1.
-                index--;
-              } else {
-                // This isn't moving so we skip it.
-                continue;
-              }
-            } else {
+          if (index != -1 && unwrapped.itemGuid) {
+            // Note: we use the parent from the existing bookmark as the sidebar
+            // gives us an unwrapped.parent that is actually a query and not the real
+            // parent.
+            let existingBookmark = await PlacesUtils.bookmarks.fetch(unwrapped.itemGuid);
+
+            // If we're dropping on the same folder, then we may need to adjust
+            // the index to insert at the correct place.
+            if (existingBookmark && parentGuid == existingBookmark.parentGuid) {
               // Sync Transactions. Adjust insertion index to prevent reversal
               // of dragged items. When you drag multiple elts upward: need to
               // increment index or each successive elt will be inserted at the
               // same index, each above the previous.
               if (index < existingBookmark.index) { // eslint-disable-line no-lonely-if
                 index += movedCount++;
               }
             }
           }
-        }
 
-        // If dragging over a tag container we should tag the item.
-        if (insertionPoint.isTag) {
-          let uri = NetUtil.newURI(unwrapped.uri);
-          let tagItemId = insertionPoint.itemId;
-          if (PlacesUIUtils.useAsyncTransactions)
-            transactions.push(PlacesTransactions.Tag({ uri, tag: tagName }));
-          else
+          // If dragging over a tag container we should tag the item.
+          // eslint-disable-next-line no-lonely-if
+          if (insertionPoint.isTag) {
+            let uri = NetUtil.newURI(unwrapped.uri);
+            let tagItemId = insertionPoint.itemId;
             transactions.push(new PlacesTagURITransaction(uri, [tagItemId]));
-        } else {
-          // If this is not a copy, check for safety that we can move the
-          // source, otherwise report an error and fallback to a copy.
-          if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(unwrapped)) {
-            Components.utils.reportError("Tried to move an unmovable Places " +
-                                         "node, reverting to a copy operation.");
-            doCopy = true;
-          }
-          if (PlacesUIUtils.useAsyncTransactions) {
-            transactions.push(
-              PlacesUIUtils.getTransactionForData(unwrapped,
-                                                  flavor,
-                                                  parentGuid,
-                                                  index,
-                                                  doCopy));
           } else {
+            // If this is not a copy, check for safety that we can move the
+            // source, otherwise report an error and fallback to a copy.
+            if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(unwrapped)) {
+              Components.utils.reportError("Tried to move an unmovable Places " +
+                                           "node, reverting to a copy operation.");
+              doCopy = true;
+            }
             transactions.push(PlacesUIUtils.makeTransaction(unwrapped,
                                 flavor, insertionPoint.itemId,
                                 index, doCopy));
           }
         }
       }
     }
     // Check if we actually have something to add, if we don't it probably wasn't
@@ -1833,8 +1804,69 @@ function doGetPlacesControllerForCommand
   return null;
 }
 
 function goDoPlacesCommand(aCommand) {
   let controller = doGetPlacesControllerForCommand(aCommand);
   if (controller && controller.isCommandEnabled(aCommand))
     controller.doCommand(aCommand);
 }
+
+/**
+ * Processes a set of transfer items and returns transactions to insert or
+ * move them.
+ *
+ * @param {String} dataFlavor The transfer flavor for the items.
+ * @param {Array} items A list of unwrapped nodes to get transactions for.
+ * @param {Integer} insertionIndex The requested index for insertion.
+ * @param {String} insertionParentGuid The guid of the parent folder to insert
+ *                                     or move the items to.
+ * @param {Boolean} doCopy Set to true to copy the items, false will move them
+ *                         if possible.
+ * @return {Array} Returns an array of created PlacesTransactions.
+ */
+async function getTransactionsForTransferItems(dataFlavor, items, insertionIndex,
+                                               insertionParentGuid, doCopy) {
+  let transactions = [];
+  let index = insertionIndex;
+
+  for (let item of items) {
+    if (index != -1 && item.itemGuid) {
+      // Note: we use the parent from the existing bookmark as the sidebar
+      // gives us an unwrapped.parent that is actually a query and not the real
+      // parent.
+      let existingBookmark = await PlacesUtils.bookmarks.fetch(item.itemGuid);
+
+      // If we're dropping on the same folder, then we may need to adjust
+      // the index to insert at the correct place.
+      if (existingBookmark && insertionParentGuid == existingBookmark.parentGuid) {
+        if (index > existingBookmark.index) {
+          // If we're dragging down, we need to go one lower to insert at
+          // the real point as moving the element changes the index of
+          // everything below by 1.
+          index--;
+        } else if (index == existingBookmark.index) {
+          // This isn't moving so we skip it.
+          continue;
+        }
+      }
+    }
+
+    // If this is not a copy, check for safety that we can move the
+    // source, otherwise report an error and fallback to a copy.
+    if (!doCopy && !PlacesControllerDragHelper.canMoveUnwrappedNode(item)) {
+      Components.utils.reportError("Tried to move an unmovable Places " +
+                                   "node, reverting to a copy operation.");
+      doCopy = true;
+    }
+    transactions.push(
+      PlacesUIUtils.getTransactionForData(item,
+                                          dataFlavor,
+                                          insertionParentGuid,
+                                          index,
+                                          doCopy));
+
+    if (index != -1 && item.itemGuid) {
+      index++;
+    }
+  }
+  return transactions;
+}
--- a/browser/components/places/tests/browser/browser.ini
+++ b/browser/components/places/tests/browser/browser.ini
@@ -22,16 +22,17 @@ support-files =
 [browser_bookmarkProperties_addLivemark.js]
 [browser_bookmarkProperties_bookmarkAllTabs.js]
 [browser_bookmarkProperties_cancel.js]
 [browser_bookmarkProperties_editTagContainer.js]
 [browser_bookmarkProperties_readOnlyRoot.js]
 [browser_bookmarksProperties.js]
 [browser_check_correct_controllers.js]
 [browser_click_bookmarks_on_toolbar.js]
+[browser_controller_onDrop_tagFolder.js]
 [browser_controller_onDrop.js]
 [browser_copy_folder_tree.js]
 [browser_copy_query_without_tree.js]
 subsuite = clipboard
 [browser_cutting_bookmarks.js]
 subsuite = clipboard
 [browser_drag_bookmarks_on_toolbar.js]
 [browser_forgetthissite_single.js]
--- a/browser/components/places/tests/browser/browser_controller_onDrop.js
+++ b/browser/components/places/tests/browser/browser_controller_onDrop.js
@@ -148,13 +148,21 @@ add_task(async function test_simple_move
 });
 
 add_task(async function test_simple_move_to_same_index() {
   // If we move to the same index, then we don't expect any transactions to be
   // created.
   await run_drag_test(1, 1, null, 1, false);
 });
 
-add_task(async function test_simple_move_different_folder() {
-  // When we move items to a different folder, the index should never change.
-  await run_drag_test(0, 2, bookmarks[3].guid, 2);
-  await run_drag_test(2, 0, bookmarks[3].guid, 0);
+add_task(async function test_simple_move_different_folder_append() {
+  // When we move items to a different folder, the insertion index will be -1
+  // and shouldn't change.
+  await run_drag_test(0, -1, bookmarks[3].guid, -1);
+  await run_drag_test(2, -1, bookmarks[3].guid, -1);
 });
+
+add_task(async function test_move_different_folder_insert_at() {
+  // When we move items to a different folder, the insertion index will be -1
+  // and shouldn't change.
+  await run_drag_test(0, 0, bookmarks[3].guid, 0);
+  await run_drag_test(2, 2, bookmarks[3].guid, 2);
+});
new file mode 100644
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_controller_onDrop_tagFolder.js
@@ -0,0 +1,112 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/* global sinon */
+Services.scriptloader.loadSubScript("resource://testing-common/sinon-2.3.2.js");
+
+const sandbox = sinon.sandbox.create();
+const TAG_NAME = "testTag";
+
+var bookmarks;
+var bookmarkId;
+
+add_task(async function setup() {
+  registerCleanupFunction(async function() {
+    sandbox.restore();
+    delete window.sinon;
+    await PlacesUtils.bookmarks.eraseEverything();
+    await PlacesTestUtils.clearHistory();
+  });
+
+  sandbox.stub(PlacesTransactions, "batch");
+  sandbox.stub(PlacesTransactions, "Tag");
+
+  bookmarks = await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.unfiledGuid,
+    children: [{
+      title: "bm1",
+      url: "http://example1.com"
+    }, {
+      title: "bm2",
+      url: "http://example2.com",
+      tags: [TAG_NAME]
+    }]
+  });
+  bookmarkId = await PlacesUtils.promiseItemId(bookmarks[0].guid);
+});
+
+async function run_drag_test(startBookmarkIndex, newParentGuid) {
+  if (!PlacesUIUtils.useAsyncTransactions) {
+    Assert.ok(true, "Skipping test as async transactions are turned off");
+    return;
+  }
+
+  if (!newParentGuid) {
+    newParentGuid = PlacesUtils.bookmarks.unfiledGuid;
+  }
+
+  // Reset the stubs so that previous test runs don't count against us.
+  PlacesTransactions.Tag.reset();
+  PlacesTransactions.batch.reset();
+
+  let dragBookmark = bookmarks[startBookmarkIndex];
+
+  await withSidebarTree("bookmarks", async (tree) => {
+    tree.selectItems([PlacesUtils.unfiledBookmarksFolderId]);
+    PlacesUtils.asContainer(tree.selectedNode).containerOpen = true;
+
+    // Simulating a drag-drop with a tree view turns out to be really difficult
+    // as you can't get a node for the source/target. Hence, we fake the
+    // insertion point and drag data and call the function direct.
+    let ip = new InsertionPoint({
+      isTag: true,
+      tagName: TAG_NAME,
+      orientation: Ci.nsITreeView.DROP_ON
+    });
+
+    let bookmarkWithId = JSON.stringify(Object.assign({
+      id: bookmarkId,
+      itemGuid: dragBookmark.guid,
+      parent: PlacesUtils.unfiledBookmarksFolderId,
+      uri: dragBookmark.url
+    }, dragBookmark));
+
+    let dt = {
+      dropEffect: "move",
+      mozCursor: "auto",
+      mozItemCount: 1,
+      types: [ PlacesUtils.TYPE_X_MOZ_PLACE ],
+      mozTypesAt(i) {
+        return this.types;
+      },
+      mozGetDataAt(i) {
+        return bookmarkWithId;
+      }
+    };
+
+    await PlacesControllerDragHelper.onDrop(ip, dt);
+
+    Assert.ok(PlacesTransactions.Tag.calledOnce,
+      "Should have called getTransactionForData at least once.");
+
+    let arg = PlacesTransactions.Tag.args[0][0];
+
+    Assert.equal(arg.urls.length, 1,
+      "Should have called PlacesTransactions.Tag with an array of one url");
+    Assert.equal(arg.urls[0], dragBookmark.url,
+      "Should have called PlacesTransactions.Tag with the correct url");
+    Assert.equal(arg.tag, TAG_NAME,
+      "Should have called PlacesTransactions.Tag with the correct tag name");
+  });
+}
+
+add_task(async function test_simple_drop_and_tag() {
+  // When we move items down the list, we'll get a drag index that is one higher
+  // than where we actually want to insert to - as the item is being moved up,
+  // everything shifts down one. Hence the index to pass to the transaction should
+  // be one less than the supplied index.
+  await run_drag_test(0, PlacesUtils.bookmarks.tagGuid);
+});
--- a/browser/components/places/tests/browser/browser_paste_bookmarks.js
+++ b/browser/components/places/tests/browser/browser_paste_bookmarks.js
@@ -1,52 +1,50 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const TEST_URL = "http://example.com/";
-const TEST_URL1 = "https://example.com/otherbrowser";
+const TEST_URL1 = "https://example.com/otherbrowser/";
 
 var PlacesOrganizer;
 var ContentTree;
-var bookmark;
-var bookmarkId;
 
 add_task(async function setup() {
   await PlacesUtils.bookmarks.eraseEverything();
   let organizer = await promiseLibrary();
 
   registerCleanupFunction(async function() {
     await promiseLibraryClosed(organizer);
     await PlacesUtils.bookmarks.eraseEverything();
   });
 
   PlacesOrganizer = organizer.PlacesOrganizer;
   ContentTree = organizer.ContentTree;
+});
 
+add_task(async function paste() {
   info("Selecting BookmarksToolbar in the left pane");
   PlacesOrganizer.selectLeftPaneQuery("BookmarksToolbar");
 
-  bookmark = await PlacesUtils.bookmarks.insert({
+  let bookmark = await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.toolbarGuid,
     url: TEST_URL,
     title: "0"
   });
-  bookmarkId = await PlacesUtils.promiseItemId(bookmark.guid);
+  let bookmarkId = await PlacesUtils.promiseItemId(bookmark.guid);
 
   ContentTree.view.selectItems([bookmarkId]);
 
   await promiseClipboard(() => {
-    info("Copying selection");
+    info("Cutting selection");
     ContentTree.view.controller.cut();
   }, PlacesUtils.TYPE_X_MOZ_PLACE);
-});
 
-add_task(async function paste() {
   info("Selecting UnfiledBookmarks in the left pane");
   PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
 
   info("Pasting clipboard");
   await ContentTree.view.controller.paste();
 
   let tree = await PlacesUtils.promiseBookmarksTree(PlacesUtils.bookmarks.unfiledGuid);
 
@@ -55,16 +53,174 @@ add_task(async function paste() {
   Assert.equal(tree.children[0].title, "0",
                "Should have the correct title");
   Assert.equal(tree.children[0].uri, TEST_URL,
                "Should have the correct URL");
 
   await PlacesUtils.bookmarks.remove(tree.children[0].guid);
 });
 
+
+add_task(async function paste_check_indexes() {
+  info("Selecting BookmarksToolbar in the left pane");
+  PlacesOrganizer.selectLeftPaneQuery("BookmarksToolbar");
+
+  let copyChildren = [];
+  let targetChildren = [];
+  for (let i = 0; i < 10; i++) {
+    copyChildren.push({
+      url: `${TEST_URL}${i}`,
+      title: `Copy ${i}`
+    });
+    targetChildren.push({
+      url: `${TEST_URL1}${i}`,
+      title: `Target ${i}`
+    });
+  }
+
+  let copyBookmarks = await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.toolbarGuid,
+    children: copyChildren
+  });
+
+  let targetBookmarks = await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.unfiledGuid,
+    children: targetChildren
+  });
+
+  let bookmarkIds = await PlacesUtils.promiseManyItemIds([
+    copyBookmarks[0].guid,
+    copyBookmarks[3].guid,
+    copyBookmarks[6].guid,
+    copyBookmarks[9].guid
+  ]);
+
+  ContentTree.view.selectItems([
+    bookmarkIds.get(copyBookmarks[0].guid),
+    bookmarkIds.get(copyBookmarks[3].guid),
+    bookmarkIds.get(copyBookmarks[6].guid),
+    bookmarkIds.get(copyBookmarks[9].guid),
+  ]);
+
+  await promiseClipboard(() => {
+    info("Cutting multiple selection");
+    ContentTree.view.controller.cut();
+  }, PlacesUtils.TYPE_X_MOZ_PLACE);
+
+  info("Selecting UnfiledBookmarks in the left pane");
+  PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
+
+  let insertionBookmarkId = await PlacesUtils.promiseItemId(targetBookmarks[4].guid);
+
+  ContentTree.view.selectItems([insertionBookmarkId]);
+
+  info("Pasting clipboard");
+  await ContentTree.view.controller.paste();
+
+  let tree = await PlacesUtils.promiseBookmarksTree(PlacesUtils.bookmarks.unfiledGuid);
+
+  const expectedBookmarkOrder = [
+    targetBookmarks[0].guid,
+    targetBookmarks[1].guid,
+    targetBookmarks[2].guid,
+    targetBookmarks[3].guid,
+    copyBookmarks[0].guid,
+    copyBookmarks[3].guid,
+    copyBookmarks[6].guid,
+    copyBookmarks[9].guid,
+    targetBookmarks[4].guid,
+    targetBookmarks[5].guid,
+    targetBookmarks[6].guid,
+    targetBookmarks[7].guid,
+    targetBookmarks[8].guid,
+    targetBookmarks[9].guid,
+  ];
+
+  Assert.equal(tree.children.length, expectedBookmarkOrder.length,
+               "Should be the expected amount of bookmarks in the unfiled folder.");
+
+  for (let i = 0; i < expectedBookmarkOrder.length; ++i) {
+    Assert.equal(tree.children[i].guid, expectedBookmarkOrder[i],
+                 `Should be the expected item at index ${i}`);
+  }
+
+  await PlacesUtils.bookmarks.eraseEverything();
+});
+
+add_task(async function paste_check_indexes_same_folder() {
+  info("Selecting BookmarksToolbar in the left pane");
+  PlacesOrganizer.selectLeftPaneQuery("BookmarksToolbar");
+
+  let copyChildren = [];
+  for (let i = 0; i < 10; i++) {
+    copyChildren.push({
+      url: `${TEST_URL}${i}`,
+      title: `Copy ${i}`
+    });
+  }
+
+  let copyBookmarks = await PlacesUtils.bookmarks.insertTree({
+    guid: PlacesUtils.bookmarks.toolbarGuid,
+    children: copyChildren
+  });
+
+  let bookmarkIds = await PlacesUtils.promiseManyItemIds([
+    copyBookmarks[0].guid,
+    copyBookmarks[3].guid,
+    copyBookmarks[6].guid,
+    copyBookmarks[9].guid
+  ]);
+
+  ContentTree.view.selectItems([
+    bookmarkIds.get(copyBookmarks[0].guid),
+    bookmarkIds.get(copyBookmarks[3].guid),
+    bookmarkIds.get(copyBookmarks[6].guid),
+    bookmarkIds.get(copyBookmarks[9].guid),
+  ]);
+
+  await promiseClipboard(() => {
+    info("Cutting multiple selection");
+    ContentTree.view.controller.cut();
+  }, PlacesUtils.TYPE_X_MOZ_PLACE);
+
+  let insertionBookmarkId = await PlacesUtils.promiseItemId(copyBookmarks[4].guid);
+
+  ContentTree.view.selectItems([insertionBookmarkId]);
+
+  info("Pasting clipboard");
+  await ContentTree.view.controller.paste();
+
+  let tree = await PlacesUtils.promiseBookmarksTree(PlacesUtils.bookmarks.toolbarGuid);
+
+  // Although we've inserted at index 4, we've taken out two items below it, so
+  // we effectively insert after the third item.
+  const expectedBookmarkOrder = [
+    copyBookmarks[1].guid,
+    copyBookmarks[2].guid,
+    copyBookmarks[0].guid,
+    copyBookmarks[3].guid,
+    copyBookmarks[6].guid,
+    copyBookmarks[9].guid,
+    copyBookmarks[4].guid,
+    copyBookmarks[5].guid,
+    copyBookmarks[7].guid,
+    copyBookmarks[8].guid,
+  ];
+
+  Assert.equal(tree.children.length, expectedBookmarkOrder.length,
+               "Should be the expected amount of bookmarks in the unfiled folder.");
+
+  for (let i = 0; i < expectedBookmarkOrder.length; ++i) {
+    Assert.equal(tree.children[i].guid, expectedBookmarkOrder[i],
+                 `Should be the expected item at index ${i}`);
+  }
+
+  await PlacesUtils.bookmarks.eraseEverything();
+});
+
 add_task(async function paste_from_different_instance() {
   let xferable = Cc["@mozilla.org/widget/transferable;1"]
                    .createInstance(Ci.nsITransferable);
   xferable.init(null);
 
   // Fake data on the clipboard to pretend this is from a different instance
   // of Firefox.
   let data = {
@@ -81,18 +237,20 @@ add_task(async function paste_from_diffe
   data = JSON.stringify(data);
 
   xferable.addDataFlavor(PlacesUtils.TYPE_X_MOZ_PLACE);
   xferable.setTransferData(PlacesUtils.TYPE_X_MOZ_PLACE, PlacesUtils.toISupportsString(data),
                            data.length * 2);
 
   Services.clipboard.setData(xferable, null, Ci.nsIClipboard.kGlobalClipboard);
 
+  info("Selecting UnfiledBookmarks in the left pane");
+  PlacesOrganizer.selectLeftPaneQuery("UnfiledBookmarks");
+
   info("Pasting clipboard");
-
   await ContentTree.view.controller.paste();
 
   let tree = await PlacesUtils.promiseBookmarksTree(PlacesUtils.bookmarks.unfiledGuid);
 
   Assert.equal(tree.children.length, 1,
                "Should be one bookmark in the unfiled folder.");
   Assert.equal(tree.children[0].title, "test",
                "Should have the correct title");
--- a/browser/components/search/test/browser_google_codes.js
+++ b/browser/components/search/test/browser_google_codes.js
@@ -50,24 +50,22 @@ function asyncInit() {
     Services.search.init(function() {
       ok(Services.search.isInitialized, "search service should be initialized");
       resolve();
     });
   });
 }
 
 function asyncReInit() {
-  const kLocalePref = "general.useragent.locale";
-
   let promise = new Promise(resolve => {
     waitForSearchNotification("reinit-complete", resolve);
   });
 
   Services.search.QueryInterface(Ci.nsIObserver)
-          .observe(null, "nsPref:changed", kLocalePref);
+          .observe(null, "intl:requested-locales-changed", null);
 
   return promise;
 }
 
 let gEngineCount;
 
 add_task(async function preparation() {
   // ContentSearch is interferring with our async re-initializations of the
--- a/browser/components/search/test/browser_google_nocodes.js
+++ b/browser/components/search/test/browser_google_nocodes.js
@@ -50,24 +50,22 @@ function asyncInit() {
     Services.search.init(function() {
       ok(Services.search.isInitialized, "search service should be initialized");
       resolve();
     });
   });
 }
 
 function asyncReInit() {
-  const kLocalePref = "general.useragent.locale";
-
   let promise = new Promise(resolve => {
     waitForSearchNotification("reinit-complete", resolve);
   });
 
   Services.search.QueryInterface(Ci.nsIObserver)
-          .observe(null, "nsPref:changed", kLocalePref);
+          .observe(null, "intl:requested-locales-changed", null);
 
   return promise;
 }
 
 let gEngineCount;
 
 add_task(async function preparation() {
   // ContentSearch is interferring with our async re-initializations of the
--- a/browser/config/mozconfigs/win32/mingw32
+++ b/browser/config/mozconfigs/win32/mingw32
@@ -43,17 +43,16 @@ ac_add_options --disable-warnings-as-err
 ac_add_options --disable-accessibility # https://sourceforge.net/p/mingw-w64/bugs/648/
 
 # Long story
 ac_add_options --disable-sandbox # Bug 1230910
 ac_add_options --disable-stylo # Bug 1390583
 
 # These aren't supported on mingw at this time
 ac_add_options --disable-webrtc # Bug 1393901
-ac_add_options --disable-crashreporter # Bug 1391685
 ac_add_options --disable-maintenance-service
 
 # Find our toolchain
 CC="$TOOLTOOL_DIR/gcc/bin/i686-w64-mingw32-gcc"
 CXX="$TOOLTOOL_DIR/gcc/bin/i686-w64-mingw32-g++"
 
 HOST_CC="$TOOLTOOL_DIR/gcc/bin/gcc"
 HOST_CXX="$TOOLTOOL_DIR/gcc/bin/g++"
--- a/browser/extensions/activity-stream/common/Actions.jsm
+++ b/browser/extensions/activity-stream/common/Actions.jsm
@@ -28,17 +28,16 @@ for (const type of [
   "BOOKMARK_URL",
   "DELETE_BOOKMARK_BY_ID",
   "DELETE_HISTORY_URL",
   "DELETE_HISTORY_URL_CONFIRM",
   "DIALOG_CANCEL",
   "DIALOG_OPEN",
   "DISABLE_ONBOARDING",
   "INIT",
-  "LOCALE_UPDATED",
   "MIGRATION_CANCEL",
   "MIGRATION_COMPLETED",
   "MIGRATION_START",
   "NEW_TAB_INIT",
   "NEW_TAB_INITIAL_STATE",
   "NEW_TAB_LOAD",
   "NEW_TAB_REHYDRATED",
   "NEW_TAB_STATE_REQUEST",
@@ -251,16 +250,23 @@ this.actionUtils = {
     if (!action.meta) {
       return false;
     }
     if (action.meta.to === CONTENT_MESSAGE_TYPE && action.meta.toTarget) {
       return true;
     }
     return false;
   },
+  isFromMain(action) {
+    if (!action.meta) {
+      return false;
+    }
+    return action.meta.from === MAIN_MESSAGE_TYPE &&
+      action.meta.to === CONTENT_MESSAGE_TYPE;
+  },
   getPortIdOfSender(action) {
     return (action.meta && action.meta.fromTarget) || null;
   },
   _RouteMessage
 };
 
 this.EXPORTED_SYMBOLS = [
   "actionTypes",
--- a/browser/extensions/activity-stream/common/Reducers.jsm
+++ b/browser/extensions/activity-stream/common/Reducers.jsm
@@ -1,34 +1,25 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 "use strict";
 
 const {actionTypes: at} = Components.utils.import("resource://activity-stream/common/Actions.jsm", {});
 const {Dedupe} = Components.utils.import("resource://activity-stream/common/Dedupe.jsm", {});
 
-// Locales that should be displayed RTL
-const RTL_LIST = ["ar", "he", "fa", "ur"];
-
 const TOP_SITES_DEFAULT_LENGTH = 6;
 const TOP_SITES_SHOWMORE_LENGTH = 12;
 
 const dedupe = new Dedupe(site => site && site.url);
 
 const INITIAL_STATE = {
   App: {
     // Have we received real data from the app yet?
     initialized: false,
-    // The locale of the browser
-    locale: "",
-    // Localized strings with defaults
-    strings: null,
-    // The text direction for the locale
-    textDirection: "",
     // The version of the system-addon
     version: null
   },
   Snippets: {initialized: false},
   TopSites: {
     // Have we received real data from history yet?
     initialized: false,
     // The history (and possibly default) links
@@ -51,27 +42,16 @@ const INITIAL_STATE = {
   Sections: [],
   PreferencesPane: {visible: false}
 };
 
 function App(prevState = INITIAL_STATE.App, action) {
   switch (action.type) {
     case at.INIT:
       return Object.assign({}, prevState, action.data || {}, {initialized: true});
-    case at.LOCALE_UPDATED: {
-      if (!action.data) {
-        return prevState;
-      }
-      let {locale, strings} = action.data;
-      return Object.assign({}, prevState, {
-        locale,
-        strings,
-        textDirection: RTL_LIST.indexOf(locale.split("-")[0]) >= 0 ? "rtl" : "ltr"
-      });
-    }
     default:
       return prevState;
   }
 }
 
 /**
  * insertPinned - Inserts pinned links in their specified slots
  *
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/css/activity-stream-linux.css
@@ -0,0 +1,1278 @@
+@charset "UTF-8";
+/* This is the linux variant */
+html {
+  box-sizing: border-box; }
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit; }
+
+*::-moz-focus-inner {
+  border: 0; }
+
+body {
+  margin: 0; }
+
+button,
+input {
+  font-family: inherit;
+  font-size: inherit; }
+
+[hidden] {
+  display: none !important; }
+
+.icon {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  background-size: 16px;
+  background-position: center center;
+  background-repeat: no-repeat;
+  vertical-align: middle;
+  fill: rgba(12, 12, 13, 0.8);
+  -moz-context-properties: fill; }
+  .icon.icon-spacer {
+    margin-inline-end: 8px; }
+  .icon.icon-small-spacer {
+    margin-inline-end: 6px; }
+  .icon.icon-bookmark-added {
+    background-image: url("chrome://browser/skin/bookmark.svg"); }
+  .icon.icon-bookmark-hollow {
+    background-image: url("chrome://browser/skin/bookmark-hollow.svg"); }
+  .icon.icon-delete {
+    background-image: url("../data/content/assets/glyph-delete-16.svg"); }
+  .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-private {
+    background-image: url("chrome://browser/skin/privateBrowsing.svg"); }
+  .icon.icon-settings {
+    background-image: url("chrome://browser/skin/settings.svg"); }
+  .icon.icon-pin {
+    background-image: url("../data/content/assets/glyph-pin-16.svg"); }
+  .icon.icon-unpin {
+    background-image: url("../data/content/assets/glyph-unpin-16.svg"); }
+  .icon.icon-edit {
+    background-image: url("../data/content/assets/glyph-edit-16.svg"); }
+  .icon.icon-pocket {
+    background-image: url("../data/content/assets/glyph-pocket-16.svg"); }
+  .icon.icon-historyItem {
+    background-image: url("../data/content/assets/glyph-historyItem-16.svg"); }
+  .icon.icon-trending {
+    background-image: url("../data/content/assets/glyph-trending-16.svg");
+    transform: translateY(2px);
+    /* trending bolt is visually top heavy */ }
+  .icon.icon-now {
+    background-image: url("chrome://browser/skin/history.svg"); }
+  .icon.icon-topsites {
+    background-image: url("../data/content/assets/glyph-topsites-16.svg"); }
+  .icon.icon-pin-small {
+    background-image: url("../data/content/assets/glyph-pin-12.svg");
+    background-size: 12px;
+    height: 12px;
+    width: 12px; }
+  .icon.icon-check {
+    background-image: url("chrome://browser/skin/check.svg"); }
+  .icon.icon-webextension {
+    background-image: url("../data/content/assets/glyph-webextension-16.svg"); }
+  .icon.icon-highlights {
+    background-image: url("../data/content/assets/glyph-highlights-16.svg"); }
+  .icon.icon-arrowhead-down {
+    background-image: url("../data/content/assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    width: 12px; }
+  .icon.icon-arrowhead-forward {
+    background-image: url("../data/content/assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    transform: rotate(-90deg);
+    width: 12px; }
+    .icon.icon-arrowhead-forward:dir(rtl) {
+      transform: rotate(90deg); }
+
+html,
+body,
+#root {
+  height: 100%; }
+
+body {
+  background: #F9F9FA;
+  color: #0C0C0D;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
+  font-size: 16px;
+  overflow-y: scroll; }
+
+h1,
+h2 {
+  font-weight: normal; }
+
+a {
+  color: #0060DF;
+  text-decoration: none; }
+  a:hover {
+    color: #008EA4; }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0; }
+
+.inner-border {
+  border: 1px solid #D7D7DB;
+  border-radius: 3px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+  z-index: 100; }
+
+@keyframes fadeIn {
+  from {
+    opacity: 0; }
+  to {
+    opacity: 1; } }
+
+.show-on-init {
+  opacity: 0;
+  transition: opacity 0.2s ease-in; }
+  .show-on-init.on {
+    opacity: 1;
+    animation: fadeIn 0.2s; }
+
+.actions {
+  border-top: 1px solid #D7D7DB;
+  display: flex;
+  flex-direction: row;
+  margin: 0;
+  padding: 15px 25px 0 25px;
+  justify-content: flex-start;
+  flex-wrap: wrap; }
+  .actions button {
+    background: #F9F9FA;
+    border: 1px solid #B1B1B3;
+    border-radius: 4px;
+    color: inherit;
+    cursor: pointer;
+    padding: 10px 30px;
+    margin-bottom: 15px;
+    white-space: nowrap; }
+    .actions button:hover:not(.dismiss) {
+      box-shadow: 0 0 0 5px #D7D7DB;
+      transition: box-shadow 150ms; }
+    .actions button.dismiss {
+      border: 0;
+      padding: 0;
+      text-decoration: underline; }
+    .actions button.done {
+      background: #0060DF;
+      border: solid 1px #0060DF;
+      color: #FFF;
+      margin-inline-start: auto; }
+
+#snippets-container {
+  z-index: 1; }
+
+.outer-wrapper {
+  display: flex;
+  padding: 40px 32px 32px;
+  height: 100%;
+  flex-grow: 1; }
+  .outer-wrapper.fixed-to-top {
+    height: auto; }
+
+main {
+  margin: auto;
+  width: 224px;
+  padding-bottom: 48px; }
+  @media (min-width: 416px) {
+    main {
+      width: 352px; } }
+  @media (min-width: 544px) {
+    main {
+      width: 480px; } }
+  @media (min-width: 800px) {
+    main {
+      width: 736px; } }
+  main section {
+    margin-bottom: 40px;
+    position: relative; }
+
+.section-top-bar {
+  height: 16px;
+  margin-bottom: 16px; }
+
+.section-title {
+  font-size: 13px;
+  font-weight: bold;
+  text-transform: uppercase; }
+  .section-title span {
+    color: #737373;
+    fill: #737373;
+    vertical-align: middle; }
+
+
+.body-wrapper .section-title,
+.body-wrapper .sections-list .section:last-of-type,
+.body-wrapper .topic {
+  opacity: 0; }
+
+
+.body-wrapper.on .section-title,
+.body-wrapper.on .sections-list .section:last-of-type,
+.body-wrapper.on .topic {
+  opacity: 1; }
+
+.top-sites-list {
+  list-style: none;
+  margin: 0;
+  margin-bottom: -18px;
+  padding: 0;
+  margin-inline-end: -32px; }
+  @media (max-width: 416px) {
+    .top-sites-list :nth-child(2n+1) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: auto;
+      offset-inline-start: -32px;
+      offset-inline-end: auto; }
+    .top-sites-list :nth-child(2n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 416px) and (max-width: 544px) {
+    .top-sites-list :nth-child(3n+2) .context-menu, .top-sites-list :nth-child(3n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 544px) and (max-width: 800px) {
+    .top-sites-list :nth-child(4n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 544px) and (max-width: 768px) {
+    .top-sites-list :nth-child(4n+3) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 800px) and (max-width: 1248px) {
+    .top-sites-list :nth-child(6n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 800px) and (max-width: 1024px) {
+    .top-sites-list :nth-child(6n+5) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  .top-sites-list li {
+    display: inline-block;
+    margin: 0 0 8px;
+    margin-inline-end: 32px; }
+  .top-sites-list .top-site-outer {
+    position: relative; }
+    .top-sites-list .top-site-outer > a {
+      display: block;
+      color: inherit;
+      outline: none; }
+      .top-sites-list .top-site-outer > a.active .tile, .top-sites-list .top-site-outer > a:focus .tile {
+        box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB;
+        transition: box-shadow 150ms; }
+    .top-sites-list .top-site-outer .context-menu-button {
+      cursor: pointer;
+      position: absolute;
+      top: -13.5px;
+      offset-inline-end: -13.5px;
+      width: 27px;
+      height: 27px;
+      background-color: #FFF;
+      background-image: url("chrome://browser/skin/page-action.svg");
+      background-position: 55%;
+      background-clip: padding-box;
+      border: 1px solid #B1B1B3;
+      border-radius: 100%;
+      box-shadow: 0 2px rgba(12, 12, 13, 0.1);
+      fill: rgba(12, 12, 13, 0.8);
+      transform: scale(0.25);
+      opacity: 0;
+      transition-property: transform, opacity;
+      transition-duration: 200ms; }
+      .top-sites-list .top-site-outer .context-menu-button:focus, .top-sites-list .top-site-outer .context-menu-button:active {
+        transform: scale(1);
+        opacity: 1; }
+    .top-sites-list .top-site-outer:hover .tile, .top-sites-list .top-site-outer:focus .tile, .top-sites-list .top-site-outer.active .tile {
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 0 5px #D7D7DB;
+      transition: box-shadow 150ms; }
+    .top-sites-list .top-site-outer:hover .context-menu-button, .top-sites-list .top-site-outer:focus .context-menu-button, .top-sites-list .top-site-outer.active .context-menu-button {
+      transform: scale(1);
+      opacity: 1; }
+    .top-sites-list .top-site-outer .tile {
+      position: relative;
+      height: 96px;
+      width: 96px;
+      border-radius: 6px;
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 4px 0 rgba(12, 12, 13, 0.1);
+      color: #737373;
+      font-weight: 200;
+      font-size: 32px;
+      text-transform: uppercase;
+      display: flex;
+      align-items: center;
+      justify-content: center; }
+    .top-sites-list .top-site-outer.placeholder .tile {
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
+    .top-sites-list .top-site-outer.placeholder .screenshot {
+      display: none; }
+    .top-sites-list .top-site-outer .screenshot {
+      position: absolute;
+      top: 0;
+      left: 0;
+      height: 100%;
+      width: 100%;
+      background-color: #FFF;
+      border-radius: 6px;
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
+      background-size: cover;
+      background-position: top left;
+      transition: opacity 1s;
+      opacity: 0; }
+      .top-sites-list .top-site-outer .screenshot.active {
+        opacity: 1; }
+    .top-sites-list .top-site-outer .top-site-icon {
+      position: absolute;
+      border-radius: 6px;
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
+      background-position: center center;
+      background-repeat: no-repeat;
+      background-color: #F9F9FA; }
+    .top-sites-list .top-site-outer .rich-icon {
+      top: 0;
+      offset-inline-start: 0;
+      height: 100%;
+      width: 100%;
+      background-size: 96px; }
+    .top-sites-list .top-site-outer .default-icon {
+      bottom: -6px;
+      height: 42px;
+      offset-inline-end: -6px;
+      width: 42px;
+      background-size: 32px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      font-size: 20px; }
+    .top-sites-list .top-site-outer .title {
+      font: message-box;
+      height: 30px;
+      line-height: 30px;
+      text-align: center;
+      width: 96px;
+      position: relative; }
+      .top-sites-list .top-site-outer .title .icon {
+        fill: #D7D7DB;
+        offset-inline-start: 0;
+        position: absolute;
+        top: 10px; }
+      .top-sites-list .top-site-outer .title span {
+        height: 30px;
+        display: block;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap; }
+      .top-sites-list .top-site-outer .title.pinned span {
+        padding: 0 13px; }
+    .top-sites-list .top-site-outer .edit-menu {
+      background: #FFF;
+      border: 1px solid #B1B1B3;
+      border-radius: 12.5px;
+      box-shadow: 0 2px rgba(12, 12, 13, 0.1);
+      height: 25px;
+      position: absolute;
+      offset-inline-end: -12.5px;
+      opacity: 0;
+      overflow: hidden;
+      top: -12.5px;
+      transform: scale(0.25);
+      transition-property: transform, opacity;
+      transition-duration: 200ms;
+      z-index: 1000; }
+      .top-sites-list .top-site-outer .edit-menu:focus, .top-sites-list .top-site-outer .edit-menu:active {
+        transform: scale(1);
+        opacity: 1; }
+      .top-sites-list .top-site-outer .edit-menu button {
+        border: 0;
+        border-right: 1px solid #B1B1B3;
+        background-color: #FFF;
+        cursor: pointer;
+        height: 100%;
+        width: 25px; }
+        .top-sites-list .top-site-outer .edit-menu button:hover {
+          background-color: #EDEDF0; }
+        .top-sites-list .top-site-outer .edit-menu button:first-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:last-child:dir(rtl) {
+          width: 30px; }
+        .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr), .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) {
+          width: 28px; }
+        .top-sites-list .top-site-outer .edit-menu button:last-child:dir(ltr) {
+          border-right: 0; }
+        .top-sites-list .top-site-outer .edit-menu button:first-child:dir(rtl) {
+          border-right: 0; }
+    .top-sites-list .top-site-outer:hover .edit-menu, .top-sites-list .top-site-outer:focus .edit-menu, .top-sites-list .top-site-outer.active .edit-menu {
+      transform: scale(1);
+      opacity: 1; }
+
+.edit-topsites-wrapper .edit-topsites-button {
+  border-right: 1px solid #D7D7DB;
+  line-height: 13px;
+  offset-inline-end: 24px;
+  opacity: 0;
+  padding: 0 10px;
+  pointer-events: none;
+  position: absolute;
+  top: 2px;
+  transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+  .edit-topsites-wrapper .edit-topsites-button:dir(rtl) {
+    border-left: 1px solid #D7D7DB;
+    border-right: 0; }
+  .edit-topsites-wrapper .edit-topsites-button:focus, .edit-topsites-wrapper .edit-topsites-button:active {
+    opacity: 1; }
+  .edit-topsites-wrapper .edit-topsites-button button {
+    background: none;
+    border: 0;
+    color: #737373;
+    cursor: pointer;
+    font-size: 12px;
+    padding: 0; }
+    .edit-topsites-wrapper .edit-topsites-button button:focus {
+      background: #EDEDF0;
+      border-bottom: dotted 1px #737373; }
+
+.edit-topsites-wrapper .modal {
+  offset-inline-start: -31px;
+  position: absolute;
+  top: -29px;
+  width: calc(100% + 62px);
+  box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); }
+
+.edit-topsites-wrapper .edit-topsites-inner-wrapper {
+  margin: 0;
+  padding: 15px 30px; }
+
+.edit-topsites-wrapper .show-more,
+.edit-topsites-wrapper .show-less {
+  background-position: left 10px center;
+  background-repeat: no-repeat;
+  height: auto;
+  margin-inline-start: 10px;
+  padding-inline-end: 15px;
+  width: auto; }
+  .edit-topsites-wrapper .show-more:dir(rtl),
+  .edit-topsites-wrapper .show-less:dir(rtl) {
+    background-position: right 10px center; }
+  .edit-topsites-wrapper .show-more span,
+  .edit-topsites-wrapper .show-less span {
+    padding-inline-start: 3px; }
+
+section.top-sites:not(.collapsed):hover .edit-topsites-button {
+  opacity: 1;
+  pointer-events: auto; }
+
+.topsite-form .form-wrapper {
+  margin: auto;
+  max-width: 350px;
+  padding: 15px 0; }
+  .topsite-form .form-wrapper .field {
+    position: relative; }
+  .topsite-form .form-wrapper .url input:not(:placeholder-shown):dir(rtl) {
+    direction: ltr;
+    text-align: right; }
+  .topsite-form .form-wrapper .section-title {
+    margin-bottom: 5px; }
+  .topsite-form .form-wrapper input[type='text'] {
+    border: solid 1px rgba(12, 12, 13, 0.2);
+    border-radius: 2px;
+    margin: 5px 0;
+    padding: 7px;
+    width: 100%; }
+    .topsite-form .form-wrapper input[type='text']:focus {
+      border: solid 1px rgba(12, 12, 13, 0.4); }
+  .topsite-form .form-wrapper .invalid input[type='text'] {
+    border: solid 1px #D70022;
+    box-shadow: 0 0 0 2px rgba(215, 0, 34, 0.35); }
+  .topsite-form .form-wrapper .error-tooltip {
+    animation: fade-up-tt 450ms;
+    background: #D70022;
+    border-radius: 2px;
+    color: #FFF;
+    offset-inline-start: 3px;
+    padding: 5px 12px;
+    position: absolute;
+    top: 44px;
+    z-index: 1; }
+    .topsite-form .form-wrapper .error-tooltip::before {
+      background: #D70022;
+      bottom: -8px;
+      content: '.';
+      height: 16px;
+      offset-inline-start: 12px;
+      position: absolute;
+      text-indent: -999px;
+      top: -7px;
+      transform: rotate(45deg);
+      white-space: nowrap;
+      width: 16px;
+      z-index: -1; }
+
+.topsite-form .actions {
+  justify-content: flex-end; }
+  .topsite-form .actions button {
+    margin-inline-start: 10px;
+    margin-inline-end: 0; }
+
+@keyframes fade-up-tt {
+  0% {
+    opacity: 0;
+    transform: translateY(15px); }
+  100% {
+    opacity: 1;
+    transform: translateY(0); } }
+
+.sections-list .section-list {
+  margin: 0;
+  display: grid;
+  grid-template-columns: repeat(auto-fit, 224px);
+  grid-gap: 32px; }
+  @media (max-width: 544px) {
+    .sections-list .section-list .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 544px) and (max-width: 800px) {
+    .sections-list .section-list :nth-child(2n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+  @media (min-width: 800px) and (max-width: 1248px) {
+    .sections-list .section-list :nth-child(3n) .context-menu {
+      margin-inline-start: auto;
+      margin-inline-end: 5px;
+      offset-inline-start: auto;
+      offset-inline-end: 0; } }
+
+.sections-list .section-empty-state {
+  width: 100%;
+  height: 266px;
+  display: flex;
+  border: 1px solid #D7D7DB;
+  border-radius: 3px;
+  margin-bottom: 16px; }
+  .sections-list .section-empty-state .empty-state {
+    margin: auto;
+    max-width: 350px; }
+    .sections-list .section-empty-state .empty-state .empty-state-icon {
+      background-size: 50px 50px;
+      background-repeat: no-repeat;
+      background-position: center;
+      fill: rgba(12, 12, 13, 0.6);
+      -moz-context-properties: fill;
+      height: 50px;
+      width: 50px;
+      margin: 0 auto;
+      display: block; }
+    .sections-list .section-empty-state .empty-state .empty-state-message {
+      margin-bottom: 0;
+      font-size: 13px;
+      font-weight: 300;
+      color: #737373;
+      text-align: center; }
+
+.topic {
+  font-size: 12px;
+  color: #737373;
+  margin-top: 12px;
+  line-height: 1.6; }
+  @media (min-width: 800px) {
+    .topic {
+      line-height: 16px; } }
+  .topic ul {
+    margin: 0;
+    padding: 0; }
+    @media (min-width: 800px) {
+      .topic ul {
+        display: inline;
+        padding-inline-start: 12px; } }
+  .topic ul li {
+    display: inline-block; }
+    .topic ul li::after {
+      content: '•';
+      padding: 8px; }
+    .topic ul li:last-child::after {
+      content: none; }
+  .topic .topic-link {
+    color: #008EA4; }
+  .topic .topic-read-more {
+    color: #008EA4; }
+    @media (min-width: 800px) {
+      .topic .topic-read-more {
+        float: right; }
+        .topic .topic-read-more:dir(rtl) {
+          float: left; } }
+    .topic .topic-read-more::after {
+      background: url("../data/content/assets/topic-show-more-12.svg") no-repeat center center;
+      content: '';
+      -moz-context-properties: fill;
+      display: inline-block;
+      fill: #008EA4;
+      height: 16px;
+      margin-inline-start: 5px;
+      vertical-align: top;
+      width: 12px; }
+    .topic .topic-read-more:dir(rtl)::after {
+      transform: scaleX(-1); }
+  .topic::after {
+    content: "";
+    display: table;
+    clear: both; }
+
+.search-wrapper {
+  cursor: default;
+  display: flex;
+  position: relative;
+  margin: 1px 1px 40px;
+  width: 100%;
+  height: 35px; }
+  .search-wrapper input {
+    border: none;
+    border-radius: 3px;
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.15);
+    color: inherit;
+    padding: 0;
+    padding-inline-end: 36px;
+    padding-inline-start: 35px;
+    width: 100%;
+    font-size: 15px; }
+  .search-wrapper:hover input {
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.25); }
+  .search-wrapper:active input,
+  .search-wrapper input:focus {
+    box-shadow: 0 0 0 3px #0A84FF; }
+  .search-wrapper .search-label {
+    background: url("chrome://browser/skin/search-glass.svg") no-repeat 12px center/16px;
+    fill: rgba(12, 12, 13, 0.4);
+    -moz-context-properties: fill;
+    position: absolute;
+    offset-inline-start: 0;
+    height: 100%;
+    width: 35px; }
+  .search-wrapper .search-button {
+    background: url("chrome://browser/skin/forward.svg") no-repeat center center;
+    border-radius: 0 3px 3px 0;
+    border: 0;
+    width: 36px;
+    fill: rgba(12, 12, 13, 0.4);
+    -moz-context-properties: fill;
+    background-size: 16px 16px;
+    height: 100%;
+    offset-inline-end: 0;
+    position: absolute; }
+    .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); }
+  .search-wrapper .contentSearchSuggestionTable {
+    border: 0;
+    transform: translateY(2px); }
+
+.context-menu {
+  display: block;
+  position: absolute;
+  font-size: 14px;
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 0, 0, 0.2);
+  top: 6.75px;
+  offset-inline-start: 100%;
+  margin-inline-start: 5px;
+  z-index: 10000;
+  background: #F9F9FA;
+  border-radius: 5px; }
+  .context-menu > ul {
+    margin: 0;
+    padding: 5px 0;
+    list-style: none; }
+    .context-menu > ul > li {
+      margin: 0;
+      width: 100%; }
+      .context-menu > ul > li.separator {
+        margin: 5px 0;
+        border-bottom: 1px solid rgba(0, 0, 0, 0.2); }
+      .context-menu > ul > li > a {
+        outline: none;
+        cursor: pointer;
+        color: inherit;
+        white-space: nowrap;
+        padding: 3px 12px;
+        line-height: 16px;
+        display: flex;
+        align-items: center; }
+        .context-menu > ul > li > a:hover, .context-menu > ul > li > a:focus {
+          background: #0060DF;
+          color: #FFF; }
+          .context-menu > ul > li > a:hover a, .context-menu > ul > li > a:focus a {
+            color: #0C0C0D; }
+          .context-menu > ul > li > a:hover .icon, .context-menu > ul > li > a:focus .icon {
+            fill: #FFF; }
+          .context-menu > ul > li > a:hover:hover, .context-menu > ul > li > a:hover:focus, .context-menu > ul > li > a:focus:hover, .context-menu > ul > li > a:focus:focus {
+            color: #FFF; }
+
+.prefs-pane {
+  color: #4A4A4F;
+  font-size: 14px;
+  line-height: 21px; }
+  .prefs-pane .sidebar {
+    background: #FFF;
+    border-left: 1px solid #D7D7DB;
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
+    height: 100%;
+    offset-inline-end: 0;
+    overflow-y: auto;
+    padding: 40px;
+    position: fixed;
+    top: 0;
+    transition: 0.1s cubic-bezier(0, 0, 0, 1);
+    transition-property: transform;
+    width: 400px;
+    z-index: 12000; }
+    .prefs-pane .sidebar.hidden {
+      transform: translateX(100%); }
+      .prefs-pane .sidebar.hidden:dir(rtl) {
+        transform: translateX(-100%); }
+    .prefs-pane .sidebar h1 {
+      font-size: 21px;
+      margin: 0;
+      padding-top: 20px; }
+  .prefs-pane hr {
+    border: 0;
+    border-bottom: 1px solid #D7D7DB;
+    margin: 20px 0; }
+  .prefs-pane .prefs-modal-inner-wrapper {
+    padding-bottom: 100px; }
+    .prefs-pane .prefs-modal-inner-wrapper section {
+      margin: 20px 0; }
+      .prefs-pane .prefs-modal-inner-wrapper section p {
+        margin: 5px 0 20px 30px; }
+      .prefs-pane .prefs-modal-inner-wrapper section label {
+        display: inline-block;
+        position: relative;
+        width: 100%; }
+        .prefs-pane .prefs-modal-inner-wrapper section label input {
+          offset-inline-start: -30px;
+          position: absolute;
+          top: 0; }
+      .prefs-pane .prefs-modal-inner-wrapper section > label {
+        font-size: 16px;
+        font-weight: bold;
+        line-height: 19px; }
+    .prefs-pane .prefs-modal-inner-wrapper .options {
+      background: #F9F9FA;
+      border: 1px solid #D7D7DB;
+      border-radius: 2px;
+      margin: -10px 0 20px;
+      margin-inline-start: 30px;
+      padding: 10px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options.disabled {
+        opacity: 0.5; }
+      .prefs-pane .prefs-modal-inner-wrapper .options label {
+        background-position-x: 35px;
+        background-position-y: 2.5px;
+        background-repeat: no-repeat;
+        display: inline-block;
+        font-size: 14px;
+        font-weight: normal;
+        height: auto;
+        line-height: 21px;
+        width: 100%; }
+        .prefs-pane .prefs-modal-inner-wrapper .options label:dir(rtl) {
+          background-position-x: right 35px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:not(:checked) + label,
+      .prefs-pane .prefs-modal-inner-wrapper .options [type='checkbox']:checked + label {
+        padding-inline-start: 63px; }
+      .prefs-pane .prefs-modal-inner-wrapper .options section {
+        margin: 0; }
+  .prefs-pane .actions {
+    background-color: #F9F9FA;
+    border-left: 1px solid #D7D7DB;
+    bottom: 0;
+    offset-inline-end: 0;
+    position: fixed;
+    width: 400px; }
+    .prefs-pane .actions button {
+      margin-inline-end: 20px; }
+  .prefs-pane [type='checkbox']:not(:checked),
+  .prefs-pane [type='checkbox']:checked {
+    offset-inline-start: -9999px;
+    position: absolute; }
+  .prefs-pane [type='checkbox']:not(:disabled):not(:checked) + label,
+  .prefs-pane [type='checkbox']:not(:disabled):checked + label {
+    cursor: pointer;
+    padding: 0 30px;
+    position: relative; }
+  .prefs-pane [type='checkbox']:not(:checked) + label::before,
+  .prefs-pane [type='checkbox']:checked + label::before {
+    background: #FFF;
+    border: 1px solid #B1B1B3;
+    border-radius: 3px;
+    content: '';
+    height: 21px;
+    offset-inline-start: 0;
+    position: absolute;
+    top: 0;
+    width: 21px; }
+  .prefs-pane [type='checkbox']:not(:checked) + label::after,
+  .prefs-pane [type='checkbox']:checked + label::after {
+    background: url("chrome://global/skin/in-content/check.svg") no-repeat center center;
+    content: '';
+    height: 21px;
+    offset-inline-start: 0;
+    position: absolute;
+    top: 0;
+    width: 21px;
+    -moz-context-properties: fill, stroke;
+    fill: #0060DF;
+    stroke: none; }
+  .prefs-pane [type='checkbox']:not(:checked) + label::after {
+    opacity: 0; }
+  .prefs-pane [type='checkbox']:checked + label::after {
+    opacity: 1; }
+  .prefs-pane [type='checkbox']:not(:disabled) + label:hover::before {
+    border: 1px solid #0060DF; }
+  .prefs-pane [type='checkbox']:not(:disabled):checked:focus + label::before,
+  .prefs-pane [type='checkbox']:not(:disabled):not(:checked):focus + label::before {
+    border: 1px dotted #0060DF; }
+
+.prefs-pane-button button {
+  background-color: transparent;
+  border: 0;
+  cursor: pointer;
+  fill: rgba(12, 12, 13, 0.6);
+  padding: 15px;
+  position: fixed;
+  offset-inline-end: 15px;
+  top: 15px;
+  z-index: 12001; }
+  .prefs-pane-button button:hover {
+    background-color: #EDEDF0; }
+  .prefs-pane-button button:active {
+    background-color: #F9F9FA; }
+
+.confirmation-dialog .modal {
+  position: fixed;
+  width: 400px;
+  top: 20%;
+  left: 50%;
+  margin-left: -200px;
+  box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.08); }
+
+.confirmation-dialog section {
+  margin: 0; }
+
+.confirmation-dialog .modal-message {
+  padding: 24px; }
+
+.confirmation-dialog .actions {
+  justify-content: flex-end; }
+  .confirmation-dialog .actions button {
+    margin-inline-end: 16px; }
+    .confirmation-dialog .actions button.done {
+      margin-inline-start: 0;
+      margin-inline-end: 0; }
+
+.modal-overlay {
+  background: #EDEDF0;
+  height: 100%;
+  left: 0;
+  opacity: 0.8;
+  position: fixed;
+  top: 0;
+  width: 100%;
+  z-index: 11001; }
+
+.modal {
+  background: #FFF;
+  border: 1px solid #D7D7DB;
+  border-radius: 3px;
+  font-size: 14px;
+  z-index: 11002; }
+
+.card-outer {
+  background: #FFF;
+  display: inline-block;
+  margin-inline-end: 32px;
+  width: 224px;
+  border-radius: 3px;
+  height: 266px;
+  position: relative; }
+  .card-outer .context-menu-button {
+    cursor: pointer;
+    position: absolute;
+    top: -13.5px;
+    offset-inline-end: -13.5px;
+    width: 27px;
+    height: 27px;
+    background-color: #FFF;
+    background-image: url("chrome://browser/skin/page-action.svg");
+    background-position: 55%;
+    background-clip: padding-box;
+    border: 1px solid #B1B1B3;
+    border-radius: 100%;
+    box-shadow: 0 2px rgba(12, 12, 13, 0.1);
+    fill: rgba(12, 12, 13, 0.8);
+    transform: scale(0.25);
+    opacity: 0;
+    transition-property: transform, opacity;
+    transition-duration: 200ms; }
+    .card-outer .context-menu-button:focus, .card-outer .context-menu-button:active {
+      transform: scale(1);
+      opacity: 1; }
+  .card-outer.placeholder {
+    background: transparent; }
+    .card-outer.placeholder .card {
+      box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1); }
+  .card-outer .card {
+    height: 100%;
+    border-radius: 3px;
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1); }
+  .card-outer > a {
+    display: block;
+    color: inherit;
+    height: 100%;
+    outline: none;
+    position: absolute;
+    width: 224px; }
+    .card-outer > a.active .card, .card-outer > a:focus .card {
+      box-shadow: 0 0 0 5px #D7D7DB;
+      transition: box-shadow 150ms; }
+    .card-outer > a.active .card-title, .card-outer > a:focus .card-title {
+      color: #0060DF; }
+  .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) {
+    outline: none;
+    box-shadow: 0 0 0 5px #D7D7DB;
+    transition: box-shadow 150ms; }
+    .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .context-menu-button {
+      transform: scale(1);
+      opacity: 1; }
+    .card-outer:-moz-any(:hover, :focus, .active):not(.placeholder) .card-title {
+      color: #0060DF; }
+  .card-outer .card-preview-image-outer {
+    background-color: #F9F9FA;
+    position: relative;
+    height: 122px;
+    border-radius: 3px 3px 0 0;
+    overflow: hidden; }
+    .card-outer .card-preview-image-outer::after {
+      border-bottom: 1px solid rgba(0, 0, 0, 0.05);
+      bottom: 0;
+      content: " ";
+      position: absolute;
+      width: 100%; }
+    .card-outer .card-preview-image-outer .card-preview-image {
+      width: 100%;
+      height: 100%;
+      background-size: cover;
+      background-position: center;
+      background-repeat: no-repeat;
+      opacity: 0;
+      transition: opacity 1s cubic-bezier(0.07, 0.95, 0, 1); }
+      .card-outer .card-preview-image-outer .card-preview-image.loaded {
+        opacity: 1; }
+  .card-outer .card-details {
+    padding: 15px 16px 12px; }
+    .card-outer .card-details.no-image {
+      padding-top: 16px; }
+  .card-outer .card-text {
+    overflow: hidden;
+    max-height: 78px; }
+    .card-outer .card-text.no-image {
+      max-height: 192px; }
+    .card-outer .card-text.no-host-name, .card-outer .card-text.no-context {
+      max-height: 97px; }
+    .card-outer .card-text.no-image.no-host-name, .card-outer .card-text.no-image.no-context {
+      max-height: 211px; }
+    .card-outer .card-text.no-host-name.no-context {
+      max-height: 116px; }
+    .card-outer .card-text.no-image.no-host-name.no-context {
+      max-height: 230px; }
+    .card-outer .card-text:not(.no-description) .card-title {
+      max-height: 57px;
+      overflow: hidden; }
+  .card-outer .card-host-name {
+    color: #737373;
+    font-size: 10px;
+    padding-bottom: 4px;
+    text-transform: uppercase; }
+  .card-outer .card-title {
+    margin: 0 0 2px;
+    font-size: 14px;
+    word-wrap: break-word;
+    line-height: 19px; }
+  .card-outer .card-description {
+    font-size: 12px;
+    margin: 0;
+    word-wrap: break-word;
+    overflow: hidden;
+    line-height: 19px; }
+  .card-outer .card-context {
+    padding: 12px 16px 12px 14px;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    color: #737373;
+    font-size: 11px;
+    display: flex; }
+  .card-outer .card-context-icon {
+    fill: rgba(12, 12, 13, 0.6);
+    margin-inline-end: 6px; }
+  .card-outer .card-context-label {
+    flex-grow: 1;
+    line-height: 16px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap; }
+
+.manual-migration-container {
+  color: #4A4A4F;
+  font-size: 13px;
+  line-height: 15px;
+  margin-bottom: 40px;
+  text-align: center; }
+  @media (min-width: 544px) {
+    .manual-migration-container {
+      display: flex;
+      justify-content: space-between;
+      text-align: left; } }
+  .manual-migration-container p {
+    margin: 0; }
+    @media (min-width: 544px) {
+      .manual-migration-container p {
+        align-self: center;
+        display: flex;
+        justify-content: space-between; } }
+  .manual-migration-container .icon {
+    display: none; }
+    @media (min-width: 544px) {
+      .manual-migration-container .icon {
+        display: block;
+        fill: rgba(12, 12, 13, 0.6);
+        margin-inline-end: 6px;
+        align-self: center; } }
+
+.manual-migration-actions {
+  border: none;
+  display: block; }
+  @media (min-width: 544px) {
+    .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 .section-title .click-target {
+  cursor: pointer;
+  vertical-align: top;
+  white-space: nowrap; }
+
+.collapsible-section .section-title .icon-arrowhead-down,
+.collapsible-section .section-title .icon-arrowhead-forward {
+  margin-top: -1px;
+  margin-inline-start: 8px; }
+
+.collapsible-section .section-top-bar {
+  position: relative; }
+  .collapsible-section .section-top-bar .section-info-option {
+    offset-inline-end: 0;
+    position: absolute;
+    top: 0; }
+  .collapsible-section .section-top-bar .info-option-icon {
+    background-image: url("../data/content/assets/glyph-info-option-12.svg");
+    background-size: 12px 12px;
+    background-repeat: no-repeat;
+    background-position: center;
+    fill: rgba(12, 12, 13, 0.6);
+    -moz-context-properties: fill;
+    height: 16px;
+    width: 16px;
+    display: inline-block;
+    margin-bottom: -2px;
+    opacity: 0;
+    transition: opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+    .collapsible-section .section-top-bar .info-option-icon:focus, .collapsible-section .section-top-bar .info-option-icon:active {
+      opacity: 1; }
+  .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] {
+    background-color: rgba(12, 12, 13, 0.1);
+    border-radius: 1px;
+    box-shadow: 0 0 0 5px rgba(12, 12, 13, 0.1);
+    fill: rgba(12, 12, 13, 0.8); }
+  .collapsible-section .section-top-bar .section-info-option .info-option {
+    visibility: hidden;
+    opacity: 0;
+    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+    .collapsible-section .section-top-bar .section-info-option .info-option::after, .collapsible-section .section-top-bar .section-info-option .info-option::before {
+      content: "";
+      offset-inline-end: 0;
+      position: absolute; }
+    .collapsible-section .section-top-bar .section-info-option .info-option::before {
+      background-image: url(chrome://global/skin/arrow/panelarrow-vertical-themed.svg), url(chrome://global/skin/arrow/panelarrow-vertical@2x.png);
+      background-position: right 7px bottom;
+      background-repeat: no-repeat;
+      background-size: 18px 10px;
+      height: 32px;
+      top: -32px;
+      width: 43px; }
+    .collapsible-section .section-top-bar .section-info-option .info-option:dir(rtl)::before {
+      background-position-x: 7px; }
+    .collapsible-section .section-top-bar .section-info-option .info-option::after {
+      height: 10px;
+      offset-inline-start: 0;
+      top: -10px; }
+  .collapsible-section .section-top-bar .info-option-icon[aria-expanded="true"] + .info-option {
+    visibility: visible;
+    opacity: 1;
+    transition: visibility 0.2s, opacity 0.2s cubic-bezier(0.07, 0.95, 0, 1); }
+  .collapsible-section .section-top-bar .info-option-icon:not([aria-expanded="true"]) + .info-option {
+    pointer-events: none; }
+  .collapsible-section .section-top-bar .info-option {
+    z-index: 9999;
+    position: absolute;
+    background: #FFF;
+    border: 1px solid #D7D7DB;
+    border-radius: 3px;
+    font-size: 13px;
+    line-height: 120%;
+    margin-inline-end: -9px;
+    offset-inline-end: 0;
+    top: 26px;
+    width: 320px;
+    padding: 24px;
+    box-shadow: 0 1px 4px 0 rgba(12, 12, 13, 0.1);
+    -moz-user-select: none; }
+  .collapsible-section .section-top-bar .info-option-header {
+    font-size: 15px;
+    font-weight: 600; }
+  .collapsible-section .section-top-bar .info-option-body {
+    margin: 0;
+    margin-top: 12px; }
+  .collapsible-section .section-top-bar .info-option-link {
+    color: #0060DF;
+    margin-left: 7px; }
+  .collapsible-section .section-top-bar .info-option-manage {
+    margin-top: 24px; }
+    .collapsible-section .section-top-bar .info-option-manage button {
+      background: none;
+      border: none;
+      color: #0060DF;
+      cursor: pointer;
+      margin: 0;
+      padding: 0; }
+      .collapsible-section .section-top-bar .info-option-manage button::after {
+        background-image: url("../data/content/assets/topic-show-more-12.svg");
+        background-repeat: no-repeat;
+        content: '';
+        -moz-context-properties: fill;
+        display: inline-block;
+        fill: #0060DF;
+        height: 16px;
+        margin-inline-start: 5px;
+        margin-top: 1px;
+        vertical-align: middle;
+        width: 12px; }
+      .collapsible-section .section-top-bar .info-option-manage button:dir(rtl)::after {
+        transform: scaleX(-1); }
+
+.collapsible-section .section-disclaimer {
+  color: #4A4A4F;
+  font-size: 13px;
+  margin-bottom: 16px; }
+  .collapsible-section .section-disclaimer .section-disclaimer-text {
+    display: inline-block; }
+    @media (min-width: 416px) {
+      .collapsible-section .section-disclaimer .section-disclaimer-text {
+        width: 224px; } }
+    @media (min-width: 544px) {
+      .collapsible-section .section-disclaimer .section-disclaimer-text {
+        width: 336px; } }
+    @media (min-width: 800px) {
+      .collapsible-section .section-disclaimer .section-disclaimer-text {
+        width: 640px; } }
+  .collapsible-section .section-disclaimer a {
+    color: #008EA4;
+    padding-left: 3px; }
+  .collapsible-section .section-disclaimer button {
+    margin-top: 2px;
+    offset-inline-end: 0;
+    height: 26px;
+    background: #F9F9FA;
+    border: 1px solid #B1B1B3;
+    border-radius: 4px;
+    cursor: pointer; }
+    .collapsible-section .section-disclaimer button:hover:not(.dismiss) {
+      box-shadow: 0 0 0 5px #D7D7DB;
+      transition: box-shadow 150ms; }
+    @media (min-width: 224px) {
+      .collapsible-section .section-disclaimer button {
+        position: relative; } }
+    @media (min-width: 416px) {
+      .collapsible-section .section-disclaimer button {
+        position: absolute; } }
+
+.collapsible-section .section-body {
+  max-height: 1100px;
+  margin: 0 -7px;
+  padding: 0 7px; }
+  .collapsible-section .section-body.animating {
+    overflow: hidden; }
+
+.collapsible-section.animation-enabled .section-title .icon-arrowhead-down,
+.collapsible-section.animation-enabled .section-title .icon-arrowhead-forward {
+  transition: transform 0.5s cubic-bezier(0.07, 0.95, 0, 1); }
+
+.collapsible-section.animation-enabled .section-body {
+  transition: max-height 0.5s cubic-bezier(0.07, 0.95, 0, 1); }
+
+.collapsible-section.collapsed .section-body {
+  max-height: 0;
+  overflow: hidden; }
+
+.collapsible-section.collapsed .section-disclaimer {
+  position: relative; }
+
+.collapsible-section.collapsed .section-info-option {
+  pointer-events: none; }
+
+.collapsible-section:not(.collapsed):hover .info-option-icon {
+  opacity: 1; }
new file mode 100644
--- /dev/null
+++ b/browser/extensions/activity-stream/css/activity-stream-mac.css
@@ -0,0 +1,1278 @@
+@charset "UTF-8";
+/* This is the mac variant */
+html {
+  box-sizing: border-box; }
+
+*,
+*::before,
+*::after {
+  box-sizing: inherit; }
+
+*::-moz-focus-inner {
+  border: 0; }
+
+body {
+  margin: 0; }
+
+button,
+input {
+  font-family: inherit;
+  font-size: inherit; }
+
+[hidden] {
+  display: none !important; }
+
+.icon {
+  display: inline-block;
+  width: 16px;
+  height: 16px;
+  background-size: 16px;
+  background-position: center center;
+  background-repeat: no-repeat;
+  vertical-align: middle;
+  fill: rgba(12, 12, 13, 0.8);
+  -moz-context-properties: fill; }
+  .icon.icon-spacer {
+    margin-inline-end: 8px; }
+  .icon.icon-small-spacer {
+    margin-inline-end: 6px; }
+  .icon.icon-bookmark-added {
+    background-image: url("chrome://browser/skin/bookmark.svg"); }
+  .icon.icon-bookmark-hollow {
+    background-image: url("chrome://browser/skin/bookmark-hollow.svg"); }
+  .icon.icon-delete {
+    background-image: url("../data/content/assets/glyph-delete-16.svg"); }
+  .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-private {
+    background-image: url("chrome://browser/skin/privateBrowsing.svg"); }
+  .icon.icon-settings {
+    background-image: url("chrome://browser/skin/settings.svg"); }
+  .icon.icon-pin {
+    background-image: url("../data/content/assets/glyph-pin-16.svg"); }
+  .icon.icon-unpin {
+    background-image: url("../data/content/assets/glyph-unpin-16.svg"); }
+  .icon.icon-edit {
+    background-image: url("../data/content/assets/glyph-edit-16.svg"); }
+  .icon.icon-pocket {
+    background-image: url("../data/content/assets/glyph-pocket-16.svg"); }
+  .icon.icon-historyItem {
+    background-image: url("../data/content/assets/glyph-historyItem-16.svg"); }
+  .icon.icon-trending {
+    background-image: url("../data/content/assets/glyph-trending-16.svg");
+    transform: translateY(2px);
+    /* trending bolt is visually top heavy */ }
+  .icon.icon-now {
+    background-image: url("chrome://browser/skin/history.svg"); }
+  .icon.icon-topsites {
+    background-image: url("../data/content/assets/glyph-topsites-16.svg"); }
+  .icon.icon-pin-small {
+    background-image: url("../data/content/assets/glyph-pin-12.svg");
+    background-size: 12px;
+    height: 12px;
+    width: 12px; }
+  .icon.icon-check {
+    background-image: url("chrome://browser/skin/check.svg"); }
+  .icon.icon-webextension {
+    background-image: url("../data/content/assets/glyph-webextension-16.svg"); }
+  .icon.icon-highlights {
+    background-image: url("../data/content/assets/glyph-highlights-16.svg"); }
+  .icon.icon-arrowhead-down {
+    background-image: url("../data/content/assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    width: 12px; }
+  .icon.icon-arrowhead-forward {
+    background-image: url("../data/content/assets/glyph-arrowhead-down-12.svg");
+    background-size: 12px;
+    height: 12px;
+    transform: rotate(-90deg);
+    width: 12px; }
+    .icon.icon-arrowhead-forward:dir(rtl) {
+      transform: rotate(90deg); }
+
+html,
+body,
+#root {
+  height: 100%; }
+
+body {
+  background: #F9F9FA;
+  color: #0C0C0D;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Ubuntu', 'Helvetica Neue', sans-serif;
+  font-size: 16px;
+  overflow-y: scroll; }
+
+h1,
+h2 {
+  font-weight: normal; }
+
+a {
+  color: #0060DF;
+  text-decoration: none; }
+  a:hover {
+    color: #008EA4; }
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0; }
+
+.inner-border {
+  border: 1px solid #D7D7DB;
+  border-radius: 3px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  pointer-events: none;
+  z-index: 100; }
+
+@keyframes fadeIn {
+  from {
+    opacity: 0; }
+  to {
+    opacity: 1; } }
+
+.show-on-init {
+  opacity: 0;
+  transition: opacity 0.2s ease-in; }
+  .show-on-init.on {
+    opacity: 1;
+    animation: fadeIn 0.2s; }
+
+.actions {
+  border-top: 1px solid #D7D7DB;
+  display: flex;
+  flex-direction: row;
+  margin: 0;
+  padding: 15px 25px 0 25px;
+  justify-content: flex-start;
+  flex-wrap: wrap; }
+  .actions button {
+    background: #F9F9FA;
+    border: 1px solid #B1B1B3;
+    border-radius: 4px;
+    color: inherit;
+    cursor: pointer;
+    padding: 10px 30px;
+    margin-bottom: 15px;
+    white-space: nowrap; }
+    .actions button:hover:not(.dismiss) {
+      box-shadow: 0 0 0 5px #D7D7DB;
+      transition: box-shadow 150ms; }
+    .actions button.dismiss {
+      border: 0;
+      padding: 0;
+      text-decoration: underline; }
+    .actions button.done {
+      background: #0060DF;
+      border: solid 1px #0060DF;
+      color: #FFF;
+      margin-inline-start: auto; }
+
+#snippets-container {
+  z-index: 1; }
+
+.outer-wrapper {
+  display: flex;
+  padding: 40px 32px 32px;
+  height: 100%;
+  flex-grow: 1; }
+  .outer-wrapper.fixed-to-top {
+    height: auto; }
+
+main {
+  margin: auto;
+  width: 224px;
+  padding-bottom: 48px; }
+  @media (min-width: 416px) {
+    main {
+      width: 352px; } }
+  @media (min-width: 544px) {
+    main {
+      width: 480px; } }
+  @media (min-width: 800px) {
+    main {
+      width: 736px; } }
+  main section {
+    margin-bottom: 40px;
+    position: relative; }
+