Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Fri, 24 Jul 2015 13:47:28 -0700
changeset 254581 fffd41a27a92c473dfc7d22bb70b2757ac2bbae2
parent 254580 6a28170cf9a2440e1d84cf7ca134094ba3a42b01 (current diff)
parent 254547 db5fae6b64adb2924c9e0a52abdcc90a3415a94d (diff)
child 254582 ea0cd68a2354621d6473790941c316f8058c7c2f
push id29108
push userryanvm@gmail.com
push dateMon, 27 Jul 2015 14:12:01 +0000
treeherdermozilla-central@27ae736ef960 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone42.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 m-c to inbound, a=merge
browser/branding/aurora/content/identity-icons-brand.png
browser/branding/aurora/content/identity-icons-brand@2x.png
browser/branding/nightly/content/identity-icons-brand.png
browser/branding/nightly/content/identity-icons-brand@2x.png
browser/branding/official/content/identity-icons-brand.png
browser/branding/official/content/identity-icons-brand@2x.png
browser/branding/unofficial/content/identity-icons-brand.png
browser/branding/unofficial/content/identity-icons-brand@2x.png
browser/locales/en-US/chrome/browser/browser.properties
dom/html/HTMLMediaElement.cpp
dom/html/HTMLMediaElement.h
dom/media/webaudio/AudioDestinationNode.cpp
dom/media/webaudio/AudioDestinationNode.h
--- a/b2g/config/aries/sources.xml
+++ b/b2g/config/aries/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="173b3104bfcbd23fc9dccd4b0035fc49aae3d444">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8bc59310552179f9a8bc6cdd0188e2475df52fb7"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="9d0e5057ee5404a31ec1bf76131cb11336a7c3b6"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="4efd19d199ae52656604f794c5a77518400220fd">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
@@ -118,17 +118,17 @@
   <project name="platform_system_bluetoothd" path="system/bluetoothd" remote="b2g" revision="3f6ccfc6bc73e28765d70bbe5c277a6276472b08"/>
   <project name="platform/system/extras" path="system/extras" revision="5356165f67f4a81c2ef28671c13697f1657590df"/>
   <project name="platform/system/media" path="system/media" revision="be0e2fe59a8043fa5200f75697df9220a99abe9d"/>
   <project name="platform_system_libfdio" path="system/libfdio" remote="b2g" revision="3c5405863d2002f665ef2b901abb3853c420129b"/>
   <project name="platform/system/netd" path="system/netd" revision="36704b0da24debcab8090156568ac236315036bb"/>
   <project name="platform/system/security" path="system/security" revision="583374f69f531ba68fc3dcbff1f74893d2a96406"/>
   <project name="platform/system/vold" path="system/vold" revision="d4455b8cf361f8353e8aebac15ffd64b4aedd2b9"/>
   <project name="platform/external/icu4c" path="external/icu4c" remote="aosp" revision="b4c6379528887dc25ca9991a535a8d92a61ad6b6"/>
-  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="f3cedd7fd9b1649aa5107d466be9078bb7602af6"/>
+  <project name="platform_frameworks_av" path="frameworks/av" remote="b2g" revision="f313503b5c91aaa6fcf962d4ec9bf260e0c00bf1"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="9395eb5aa885cf6d305a202de6e9694a58a89717"/>
   <default remote="caf" revision="refs/tags/android-4.4.2_r1" sync-j="4"/>
   <!-- Emulator specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="72ffdf71c68a96309212eb13d63560d66db14c9e"/>
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="f390788a00706c06e5248edfd8d27b365387e84a"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="4bebbe8d92368befc31e8b4a99da2d29cc26bfbc"/>
   <project name="platform/external/libnfc-nci" path="external/libnfc-nci" revision="f37bd545063039e30a92f2550ae78c0e6e4e2d08"/>
   <project name="platform_external_wpa_supplicant_8" path="external/wpa_supplicant_8" remote="b2g" revision="0c6a6547cd1fd302fa2b0f6e375654df36bf0ec4"/>
--- a/b2g/config/emulator-l/sources.xml
+++ b/b2g/config/emulator-l/sources.xml
@@ -7,20 +7,20 @@
   <remote fetch="https://git.mozilla.org/b2g" name="mozilla"/>
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
-  <project name="platform_build" path="build" remote="b2g" revision="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
+  <project name="platform_build" path="build" remote="b2g" revision="07c383a786f188904311a37f6062c2cb84c9b61d">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
@@ -138,15 +138,15 @@
   <project name="platform_frameworks_base" path="frameworks/base" remote="b2g" revision="04e26ebdc36ca83f4ee3e9e2082b3fcf04c5b971"/>
   <project name="platform_frameworks_wilhelm" path="frameworks/wilhelm" remote="b2g" revision="0dbf5baafadf6d233c0a29e392fa3293f0121673"/>
   <project name="platform_system_core" path="system/core" remote="b2g" revision="f594bc64eacac490857748b1139ffcb34c856bbd"/>
   <default remote="caf" revision="refs/tags/android-5.1.0_r1" sync-j="4"/>
   <!-- Emulator specific things -->
   <project name="device/generic/armv7-a-neon" path="device/generic/armv7-a-neon" revision="fe7df1bc8dd0fd71571505d7be1c31a4ad1e40fb"/>
   <project name="device_generic_goldfish" path="device/generic/goldfish" remote="b2g" revision="48132ec0b0dfe9fc29c7c3f0e799066be8999198"/>
   <!-- external/qemu for emulator-l need to be updated in bug-1121378 -->
-  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="7639c5c496ffd207bb627f2a59b2c5203ae6fefc"/>
+  <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="85f91439c854061bda3c6228d98381ea8867170c"/>
   <project name="platform_external_wpa_supplicant_8" path="external/wpa_supplicant_8" remote="b2g" revision="cbda29a58abc4ea1f7f4611fe354ab67b606219d"/>
   <project name="platform/development" path="development" revision="0c51f6e0aa2ee57fcb75ec3b2ff6bf754cece63e"/>
   <project name="android-sdk" path="sdk" remote="b2g" revision="ff4190dc603f62a7caa48342aa268acf99863c5c"/>
   <!-- hardware-ril for emulator-l need to be updated in bug-1113054 -->
   <project name="platform/hardware/ril" path="hardware/ril" revision="e00d716e7e3d31729f75399855b6921e90cb0b66"/>
 </manifest>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="173b3104bfcbd23fc9dccd4b0035fc49aae3d444">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8bc59310552179f9a8bc6cdd0188e2475df52fb7"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="9d0e5057ee5404a31ec1bf76131cb11336a7c3b6"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "db299103dd17a873cba4ff88e62ec173bf80fe62", 
+        "git_revision": "ade1ef5249cfab921e00ed67b30f3d03c2e24b5e", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "16f2c422168acd350ff048a22d39297e60508059", 
+    "revision": "e09bb83fd01a4f6ab6d569c3cf2d8b099f30df55", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="4efd19d199ae52656604f794c5a77518400220fd">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/nexus-5-l/sources.xml
+++ b/b2g/config/nexus-5-l/sources.xml
@@ -7,20 +7,20 @@
   <remote fetch="https://git.mozilla.org/b2g" name="mozilla"/>
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
-  <project name="platform_build" path="build" remote="b2g" revision="61e82f99bb8bc78d52b5717e9a2481ec7267fa33">
+  <project name="platform_build" path="build" remote="b2g" revision="07c383a786f188904311a37f6062c2cb84c9b61d">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="db299103dd17a873cba4ff88e62ec173bf80fe62"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="ade1ef5249cfab921e00ed67b30f3d03c2e24b5e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="1b587ca868ee75758959c2470a9c35a21299377f"/>
--- a/browser/base/content/browser-trackingprotection.js
+++ b/browser/base/content/browser-trackingprotection.js
@@ -3,27 +3,37 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 let TrackingProtection = {
   MAX_INTROS: 0,
   PREF_ENABLED_GLOBALLY: "privacy.trackingprotection.enabled",
   PREF_ENABLED_IN_PRIVATE_WINDOWS: "privacy.trackingprotection.pbmode.enabled",
   enabledGlobally: false,
   enabledInPrivateWindows: false,
+  container: null,
+  content: null,
+  icon: null,
+  activeTooltipText: null,
+  disabledTooltipText: null,
 
   init() {
     let $ = selector => document.querySelector(selector);
     this.container = $("#tracking-protection-container");
     this.content = $("#tracking-protection-content");
     this.icon = $("#tracking-protection-icon");
 
     this.updateEnabled();
     Services.prefs.addObserver(this.PREF_ENABLED_GLOBALLY, this, false);
     Services.prefs.addObserver(this.PREF_ENABLED_IN_PRIVATE_WINDOWS, this, false);
 
+    this.activeTooltipText =
+      gNavigatorBundle.getString("trackingProtection.icon.activeTooltip");
+    this.disabledTooltipText =
+      gNavigatorBundle.getString("trackingProtection.icon.disabledTooltip");
+
     this.enabledHistogram.add(this.enabledGlobally);
   },
 
   uninit() {
     Services.prefs.removeObserver(this.PREF_ENABLED_GLOBALLY, this);
     Services.prefs.removeObserver(this.PREF_ENABLED_IN_PRIVATE_WINDOWS, this);
   },
 
@@ -61,38 +71,39 @@ let TrackingProtection = {
     // Only animate the shield if the event was not fired directly from
     // the tabbrowser (due to a browser change).
     if (isSimulated) {
       this.icon.removeAttribute("animate");
     } else {
       this.icon.setAttribute("animate", "true");
     }
 
-    let {
-      STATE_BLOCKED_TRACKING_CONTENT, STATE_LOADED_TRACKING_CONTENT
-    } = Ci.nsIWebProgressListener;
+    let isBlocking = state & Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT;
+    let isAllowing = state & Ci.nsIWebProgressListener.STATE_LOADED_TRACKING_CONTENT;
 
-    for (let element of [this.icon, this.content]) {
-      if (state & STATE_BLOCKED_TRACKING_CONTENT) {
-        element.setAttribute("state", "blocked-tracking-content");
-      } else if (state & STATE_LOADED_TRACKING_CONTENT) {
-        element.setAttribute("state", "loaded-tracking-content");
-      } else {
-        element.removeAttribute("state");
-      }
-    }
+    if (isBlocking) {
+      this.icon.setAttribute("tooltiptext", this.activeTooltipText);
+      this.icon.setAttribute("state", "blocked-tracking-content");
+      this.content.setAttribute("state", "blocked-tracking-content");
 
-    if (state & STATE_BLOCKED_TRACKING_CONTENT) {
       // Open the tracking protection introduction panel, if applicable.
       let introCount = gPrefService.getIntPref("privacy.trackingprotection.introCount");
       if (introCount < TrackingProtection.MAX_INTROS) {
         gPrefService.setIntPref("privacy.trackingprotection.introCount", ++introCount);
         gPrefService.savePrefFile(null);
         this.showIntroPanel();
       }
+    } else if (isAllowing) {
+      this.icon.setAttribute("tooltiptext", this.disabledTooltipText);
+      this.icon.setAttribute("state", "loaded-tracking-content");
+      this.content.setAttribute("state", "loaded-tracking-content");
+    } else {
+      this.icon.removeAttribute("tooltiptext");
+      this.icon.removeAttribute("state");
+      this.content.removeAttribute("state");
     }
 
     // Telemetry for state change.
     this.eventsHistogram.add(0);
   },
 
   disableForCurrentPage() {
     // Convert document URI into the format used by
--- a/browser/base/content/test/general/browser.ini
+++ b/browser/base/content/test/general/browser.ini
@@ -273,16 +273,18 @@ skip-if = os == 'win' || e10s # Bug 1159
 skip-if = e10s # Bug 1094510 - test hits the network in e10s mode only
 [browser_clipboard.js]
 [browser_contentAreaClick.js]
 [browser_contextSearchTabPosition.js]
 skip-if = os == "mac" || e10s # bug 967013; e10s: bug 1094761 - test hits the network in e10s, causing next test to crash
 [browser_ctrlTab.js]
 [browser_datareporting_notification.js]
 skip-if = !datareporting
+[browser_datachoices_notification.js]
+skip-if = !datareporting
 [browser_devedition.js]
 [browser_devices_get_user_media.js]
 skip-if = buildapp == 'mulet' || (os == "linux" && debug) || e10s # linux: bug 976544; e10s: bug 1071623
 [browser_devices_get_user_media_about_urls.js]
 skip-if = e10s # Bug 1071623
 [browser_devices_get_user_media_in_frame.js]
 skip-if = e10s # Bug 1071623
 [browser_discovery.js]
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/general/browser_datachoices_notification.js
@@ -0,0 +1,213 @@
+/* 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";
+
+// Pass an empty scope object to the import to prevent "leaked window property"
+// errors in tests.
+let Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences;
+let TelemetryReportingPolicy =
+  Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm", {}).TelemetryReportingPolicy;
+
+XPCOMUtils.defineLazyGetter(this, "gDatareportingService",
+  () => Cc["@mozilla.org/datareporting/service;1"]
+          .getService(Ci.nsISupports)
+          .wrappedJSObject);
+
+const PREF_BRANCH = "datareporting.policy.";
+const PREF_DRS_ENABLED = "datareporting.healthreport.service.enabled";
+const PREF_BYPASS_NOTIFICATION = PREF_BRANCH + "dataSubmissionPolicyBypassNotification";
+const PREF_CURRENT_POLICY_VERSION = PREF_BRANCH + "currentPolicyVersion";
+const PREF_ACCEPTED_POLICY_VERSION = PREF_BRANCH + "dataSubmissionPolicyAcceptedVersion";
+const PREF_ACCEPTED_POLICY_DATE = PREF_BRANCH + "dataSubmissionPolicyNotifiedTime";
+
+const TEST_POLICY_VERSION = 37;
+
+/**
+ * Wait for a tick.
+ */
+function promiseNextTick() {
+  return new Promise(resolve => executeSoon(resolve));
+}
+
+/**
+ * Wait for a notification to be shown in a notification box.
+ * @param {Object} aNotificationBox The notification box.
+ * @return {Promise} Resolved when the notification is displayed.
+ */
+function promiseWaitForAlertActive(aNotificationBox) {
+  let deferred = PromiseUtils.defer();
+  aNotificationBox.addEventListener("AlertActive", function onActive() {
+    aNotificationBox.removeEventListener("AlertActive", onActive, true);
+    deferred.resolve();
+  });
+  return deferred.promise;
+}
+
+/**
+ * Wait for a notification to be closed.
+ * @param {Object} aNotification The notification.
+ * @return {Promise} Resolved when the notification is closed.
+ */
+function promiseWaitForNotificationClose(aNotification) {
+  let deferred = PromiseUtils.defer();
+  waitForNotificationClose(aNotification, deferred.resolve);
+  return deferred.promise;
+}
+
+let checkInfobarButton = Task.async(function* (aNotification) {
+  // Check that the button on the data choices infobar does the right thing.
+  let buttons = aNotification.getElementsByTagName("button");
+  Assert.equal(buttons.length, 1, "There is 1 button in the data reporting notification.");
+  let button = buttons[0];
+
+  // Add an observer to ensure the "advanced" pane opened (but don't bother
+  // closing it - we close the entire window when done.)
+  let paneLoadedPromise = promiseTopicObserved("advanced-pane-loaded");
+
+  // Click on the button.
+  button.click();
+
+  // Wait for the preferences panel to open.
+  let preferenceWindow = yield paneLoadedPromise;
+  yield promiseNextTick();
+  // If the prefs are being displayed in a dialog we need to close it.
+  // If in a tab (ie, in-content prefs) it closes with the window.
+  if (!Services.prefs.getBoolPref("browser.preferences.inContent")) {
+    prefWin.close();
+  }
+});
+
+add_task(function* setup(){
+  const drsEnabled = Preferences.get(PREF_DRS_ENABLED, true);
+  const bypassNotification = Preferences.get(PREF_BYPASS_NOTIFICATION, true);
+  const currentPolicyVersion = Preferences.get(PREF_CURRENT_POLICY_VERSION, 1);
+
+  // Register a cleanup function to reset our preferences.
+  registerCleanupFunction(() => {
+    Preferences.set(PREF_DRS_ENABLED, drsEnabled);
+    Preferences.set(PREF_BYPASS_NOTIFICATION, bypassNotification);
+    Preferences.set(PREF_CURRENT_POLICY_VERSION, currentPolicyVersion);
+
+    // Start polling again.
+    gDatareportingService.policy.startPolling();
+
+    return closeAllNotifications();
+  });
+
+  // Disable Healthreport/Data reporting service.
+  Preferences.set(PREF_DRS_ENABLED, false);
+  // Don't skip the infobar visualisation.
+  Preferences.set(PREF_BYPASS_NOTIFICATION, false);
+  // Set the current policy version.
+  Preferences.set(PREF_CURRENT_POLICY_VERSION, TEST_POLICY_VERSION);
+
+  // Stop the polling to make sure no policy gets displayed by FHR.
+  gDatareportingService.policy.stopPolling();
+});
+
+function clearAcceptedPolicy() {
+  // Reset the accepted policy.
+  Preferences.reset(PREF_ACCEPTED_POLICY_VERSION);
+  Preferences.reset(PREF_ACCEPTED_POLICY_DATE);
+}
+
+add_task(function* test_single_window(){
+  clearAcceptedPolicy();
+
+  // Close all the notifications, then try to trigger the data choices infobar.
+  yield closeAllNotifications();
+
+  let notificationBox = document.getElementById("global-notificationbox");
+
+  // Make sure that we have a coherent initial state.
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), 0,
+               "No version should be set on init.");
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, 0), 0,
+               "No date should be set on init.");
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "User not notified about datareporting policy.");
+
+  let alertShownPromise = promiseWaitForAlertActive(notificationBox);
+  // This should be false and trigger the Infobar.
+  Assert.ok(!TelemetryReportingPolicy.canUpload(),
+            "User should not be allowed to upload and the infobar should be triggered.");
+
+  // Wait for the infobar to be displayed.
+  yield alertShownPromise;
+
+  Assert.equal(notificationBox.allNotifications.length, 1, "Notification Displayed.");
+  Assert.ok(TelemetryReportingPolicy.canUpload(), "User should be allowed to upload now.");
+
+  yield promiseNextTick();
+  let promiseClosed = promiseWaitForNotificationClose(notificationBox.currentNotification);
+  yield checkInfobarButton(notificationBox.currentNotification);
+  yield promiseClosed;
+
+  Assert.equal(notificationBox.allNotifications.length, 0, "No notifications remain.");
+
+  // Check that we are still clear to upload and that the policy data is saved.
+  Assert.ok(TelemetryReportingPolicy.canUpload());
+  Assert.equal(TelemetryReportingPolicy.testIsUserNotified(), true,
+               "User notified about datareporting policy.");
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), TEST_POLICY_VERSION,
+               "Version pref set.");
+  Assert.greater(parseInt(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), 10), -1,
+                 "Date pref set.");
+});
+
+add_task(function* test_multiple_windows(){
+  clearAcceptedPolicy();
+
+  // Close all the notifications, then try to trigger the data choices infobar.
+  yield closeAllNotifications();
+
+  // Ensure we see the notification on all windows and that action on one window
+  // results in dismiss on every window.
+  let otherWindow = yield BrowserTestUtils.openNewBrowserWindow();
+
+  // Get the notification box for both windows.
+  let notificationBoxes = [
+    document.getElementById("global-notificationbox"),
+    otherWindow.document.getElementById("global-notificationbox")
+  ];
+
+  Assert.ok(notificationBoxes[1], "2nd window has a global notification box.");
+
+  // Make sure that we have a coherent initial state.
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), 0, "No version should be set on init.");
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, 0), 0, "No date should be set on init.");
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(), "User not notified about datareporting policy.");
+
+  let showAlertPromises = [
+    promiseWaitForAlertActive(notificationBoxes[0]),
+    promiseWaitForAlertActive(notificationBoxes[1])
+  ];
+
+  // This should be false and trigger the Infobar.
+  Assert.ok(!TelemetryReportingPolicy.canUpload(),
+            "User should not be allowed to upload and the infobar should be triggered.");
+
+  yield Promise.all(showAlertPromises);
+
+  // Both notification were displayed. Close one and check that both gets closed.
+  let closeAlertPromises = [
+    promiseWaitForNotificationClose(notificationBoxes[0].currentNotification),
+    promiseWaitForNotificationClose(notificationBoxes[1].currentNotification)
+  ];
+  notificationBoxes[0].currentNotification.close();
+  yield Promise.all(closeAlertPromises);
+
+  // Close the second window we opened.
+  yield BrowserTestUtils.closeWindow(otherWindow);
+
+  // Check that we are clear to upload and that the policy data us saved.
+  Assert.ok(TelemetryReportingPolicy.canUpload(),"User should be allowed to upload now.");
+  Assert.equal(TelemetryReportingPolicy.testIsUserNotified(), true,
+               "User notified about datareporting policy.");
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0), TEST_POLICY_VERSION,
+               "Version pref set.");
+  Assert.greater(parseInt(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), 10), -1,
+                 "Date pref set.");
+});
--- a/browser/base/content/test/general/browser_datareporting_notification.js
+++ b/browser/base/content/test/general/browser_datareporting_notification.js
@@ -42,40 +42,16 @@ function sendNotifyRequest(name) {
       deferred.resolve.bind(deferred),
       deferred.reject.bind(deferred)
     );
   }.bind(this), deferred.reject.bind(deferred));
 
   return [policy, deferred.promise];
 }
 
-/**
- * Wait for a <notification> to be closed then call the specified callback.
- */
-function waitForNotificationClose(notification, cb) {
-  let parent = notification.parentNode;
-
-  let observer = new MutationObserver(function onMutatations(mutations) {
-    for (let mutation of mutations) {
-      for (let i = 0; i < mutation.removedNodes.length; i++) {
-        let node = mutation.removedNodes.item(i);
-
-        if (node != notification) {
-          continue;
-        }
-
-        observer.disconnect();
-        cb();
-      }
-    }
-  });
-
-  observer.observe(parent, {childList: true});
-}
-
 let dumpAppender, rootLogger;
 
 function test() {
   registerCleanupFunction(cleanup);
   waitForExplicitFinish();
 
   let ns = {};
   Components.utils.import("resource://gre/modules/Log.jsm", ns);
--- a/browser/base/content/test/general/browser_trackingUI_1.js
+++ b/browser/base/content/test/general/browser_trackingUI_1.js
@@ -41,16 +41,17 @@ function clickButton(sel) {
   el.doCommand();
 }
 
 function testBenignPage() {
   info("Non-tracking content must not be blocked");
   ok(!TrackingProtection.container.hidden, "The container is visible");
   ok(!TrackingProtection.content.hasAttribute("state"), "content: no state");
   ok(!TrackingProtection.icon.hasAttribute("state"), "icon: no state");
+  ok(!TrackingProtection.icon.hasAttribute("tooltiptext"), "icon: no tooltip");
 
   ok(hidden("#tracking-protection-icon"), "icon is hidden");
   ok(hidden("#tracking-action-block"), "blockButton is hidden");
   ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
 
   // Make sure that the no tracking elements message appears
   ok(!hidden("#tracking-not-detected"), "labelNoTracking is visible");
   ok(hidden("#tracking-loaded"), "labelTrackingLoaded is hidden");
@@ -59,16 +60,18 @@ function testBenignPage() {
 
 function testTrackingPage(window) {
   info("Tracking content must be blocked");
   ok(!TrackingProtection.container.hidden, "The container is visible");
   is(TrackingProtection.content.getAttribute("state"), "blocked-tracking-content",
       'content: state="blocked-tracking-content"');
   is(TrackingProtection.icon.getAttribute("state"), "blocked-tracking-content",
       'icon: state="blocked-tracking-content"');
+  is(TrackingProtection.icon.getAttribute("tooltiptext"),
+     gNavigatorBundle.getString("trackingProtection.icon.activeTooltip"), "correct tooltip");
 
   ok(!hidden("#tracking-protection-icon"), "icon is visible");
   ok(hidden("#tracking-action-block"), "blockButton is hidden");
 
 
   if (PrivateBrowsingUtils.isWindowPrivate(window)) {
     ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
     ok(!hidden("#tracking-action-unblock-private"), "unblockButtonPrivate is visible");
@@ -85,16 +88,18 @@ function testTrackingPage(window) {
 
 function testTrackingPageUnblocked() {
   info("Tracking content must be white-listed and not blocked");
   ok(!TrackingProtection.container.hidden, "The container is visible");
   is(TrackingProtection.content.getAttribute("state"), "loaded-tracking-content",
       'content: state="loaded-tracking-content"');
   is(TrackingProtection.icon.getAttribute("state"), "loaded-tracking-content",
       'icon: state="loaded-tracking-content"');
+  is(TrackingProtection.icon.getAttribute("tooltiptext"),
+     gNavigatorBundle.getString("trackingProtection.icon.disabledTooltip"), "correct tooltip");
 
   ok(!hidden("#tracking-protection-icon"), "icon is visible");
   ok(!hidden("#tracking-action-block"), "blockButton is visible");
   ok(hidden("#tracking-action-unblock"), "unblockButton is hidden");
 
   // Make sure that the blocked tracking elements message appears
   ok(hidden("#tracking-not-detected"), "labelNoTracking is hidden");
   ok(!hidden("#tracking-loaded"), "labelTrackingLoaded is visible");
--- a/browser/base/content/test/general/head.js
+++ b/browser/base/content/test/general/head.js
@@ -4,16 +4,37 @@ XPCOMUtils.defineLazyModuleGetter(this, 
   "resource://gre/modules/Promise.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Task",
   "resource://gre/modules/Task.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
   "resource://gre/modules/PlacesUtils.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "PlacesTestUtils",
   "resource://testing-common/PlacesTestUtils.jsm");
 
+/**
+ * Wait for a <notification> to be closed then call the specified callback.
+ */
+function waitForNotificationClose(notification, cb) {
+  let parent = notification.parentNode;
+
+  let observer = new MutationObserver(function onMutatations(mutations) {
+    for (let mutation of mutations) {
+      for (let i = 0; i < mutation.removedNodes.length; i++) {
+        let node = mutation.removedNodes.item(i);
+        if (node != notification) {
+          continue;
+        }
+        observer.disconnect();
+        cb();
+      }
+    }
+  });
+  observer.observe(parent, {childList: true});
+}
+
 function closeAllNotifications () {
   let notificationBox = document.getElementById("global-notificationbox");
 
   if (!notificationBox || !notificationBox.currentNotification) {
     return Promise.resolve();
   }
 
   let deferred = Promise.defer();
deleted file mode 100644
index bcad78dce9c3114a14280c969829ec397482420e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/browser/branding/aurora/content/identity-icons-brand.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid" width="32" height="32" viewBox="0 0 32 32">
+  <style>
+    .cls-1 {
+      fill: #0c99d5;
+      fill-rule: evenodd;
+    }
+  </style>
+  <path d="M26.797,6.125 C26.719,6.050 26.674,6.013 26.674,6.013 C26.715,6.045 26.756,6.082 26.797,6.125 M28.924,21.127 C28.947,20.948 28.949,20.780 28.929,20.626 C28.501,21.359 27.844,22.025 27.228,22.905 C27.980,22.421 28.624,21.866 28.924,21.127 ZM30.097,13.924 C30.082,13.747 30.062,13.570 30.036,13.394 C29.974,12.946 29.875,12.504 29.728,12.076 C29.735,12.102 29.741,12.129 29.747,12.155 C29.737,12.124 29.731,12.107 29.731,12.107 C29.731,12.107 29.614,12.472 29.435,13.070 C29.423,14.290 29.290,15.417 29.094,16.268 C29.419,15.962 29.657,15.599 29.820,15.196 C29.748,15.461 29.649,15.713 29.520,15.947 C29.361,16.217 29.182,16.436 29.009,16.610 C28.821,16.797 28.641,16.932 28.500,17.024 C28.543,16.905 28.585,16.773 28.625,16.631 C28.626,16.629 28.626,16.628 28.627,16.626 C28.637,16.590 28.647,16.552 28.657,16.513 C28.761,16.176 28.854,15.828 28.934,15.474 C29.049,14.961 29.137,14.433 29.192,13.898 C29.300,12.857 29.284,11.787 29.104,10.744 C29.015,10.227 28.886,9.717 28.712,9.220 C28.480,8.559 28.197,8.001 27.916,7.544 C27.895,7.508 27.874,7.472 27.853,7.436 C27.760,7.280 27.665,7.132 27.570,6.994 C27.258,6.543 26.939,6.200 26.674,6.013 C26.715,6.045 26.756,6.082 26.797,6.125 C26.719,6.050 26.674,6.013 26.674,6.013 C26.694,6.035 26.712,6.058 26.732,6.081 C26.682,6.033 26.653,6.008 26.653,6.008 C26.653,6.008 26.682,6.170 26.733,6.456 C25.969,5.218 24.807,4.635 24.807,4.635 C24.807,4.635 24.902,4.945 25.050,5.391 C25.741,5.949 26.345,6.571 26.869,7.227 C26.871,7.238 26.873,7.250 26.875,7.261 C26.905,7.435 26.938,7.624 26.973,7.826 C26.880,7.700 26.782,7.575 26.683,7.451 C25.589,5.958 24.211,4.706 22.611,3.779 C22.625,3.783 22.600,3.776 22.613,3.780 C20.672,2.647 18.429,2.000 16.039,2.000 C12.495,2.000 9.273,3.423 6.880,5.744 C6.814,5.809 7.271,6.270 7.404,6.311 C8.081,6.106 8.838,6.051 9.423,6.120 C9.705,5.897 9.663,5.963 9.961,5.769 L9.964,5.772 C11.767,4.606 13.854,3.982 16.035,3.982 C18.042,3.982 19.969,4.510 21.669,5.503 C22.118,5.635 22.683,5.830 23.182,6.091 C22.663,5.187 22.132,4.560 21.761,4.182 C23.311,5.364 24.150,6.425 24.701,7.396 C24.746,7.475 24.789,7.553 24.830,7.631 C24.928,7.816 25.017,7.998 25.099,8.177 C24.570,7.618 23.753,7.042 23.039,6.772 C22.981,6.750 22.924,6.730 22.868,6.712 C22.708,6.662 22.555,6.628 22.414,6.617 C23.550,7.488 25.407,9.978 25.432,13.744 C25.432,13.765 25.432,13.786 25.432,13.807 C25.432,14.010 25.428,14.216 25.417,14.427 C25.207,13.971 24.877,13.340 24.562,12.869 C24.483,12.751 24.405,12.644 24.330,12.551 C24.265,12.471 24.202,12.400 24.143,12.346 C24.479,15.517 24.324,16.750 24.116,17.651 C24.096,17.734 24.077,17.815 24.057,17.894 C24.015,18.058 23.973,18.216 23.934,18.378 C23.920,18.257 23.899,18.145 23.874,18.040 C23.816,17.791 23.735,17.585 23.666,17.424 C23.643,17.372 23.621,17.322 23.603,17.280 C23.603,17.280 23.581,17.854 23.325,18.780 C23.199,19.234 23.018,19.771 22.754,20.367 C22.294,21.408 21.823,21.903 21.501,22.062 C21.397,22.113 21.309,22.129 21.242,22.117 C21.167,22.112 21.126,22.079 21.127,22.076 C21.135,22.001 21.143,21.926 21.146,21.854 C21.150,21.754 21.145,21.662 21.119,21.593 C21.119,21.593 20.862,21.684 20.697,21.924 C20.630,22.020 20.544,22.115 20.431,22.203 C20.411,22.219 20.614,21.936 20.599,21.949 C20.499,22.033 20.392,22.130 20.285,22.245 C20.170,22.368 20.059,22.494 19.954,22.609 C19.699,22.887 19.483,23.095 19.352,23.001 C19.437,22.975 19.513,22.906 19.572,22.818 C19.635,22.726 19.680,22.613 19.699,22.500 C19.544,22.612 19.152,22.914 18.272,23.049 C18.109,23.074 17.707,23.146 17.127,23.121 C16.424,23.090 15.460,22.916 14.345,22.341 C14.578,22.313 14.903,22.241 15.196,22.312 C15.275,22.331 15.352,22.360 15.424,22.405 C15.392,22.369 15.355,22.338 15.315,22.310 C14.933,22.037 14.212,22.084 13.681,21.911 C13.170,21.744 12.503,21.005 12.119,20.631 C12.263,20.667 12.407,20.696 12.551,20.721 C12.652,20.738 12.752,20.753 12.852,20.765 C13.008,20.784 13.164,20.798 13.319,20.805 C14.486,20.856 15.595,20.569 16.313,20.063 C17.285,19.377 17.861,18.876 18.378,18.994 C18.428,19.006 18.476,19.010 18.522,19.010 C18.543,19.010 18.563,19.009 18.583,19.007 C18.867,18.975 19.053,18.730 19.002,18.441 C18.983,18.332 18.931,18.217 18.836,18.104 C18.561,17.778 18.016,17.375 17.274,17.265 C16.935,17.215 16.556,17.226 16.142,17.333 C15.385,17.528 14.711,18.047 13.824,18.051 C13.526,18.053 13.204,17.996 12.846,17.850 C12.759,17.815 12.671,17.774 12.580,17.728 C12.489,17.681 12.877,17.783 12.781,17.725 C12.508,17.621 12.011,17.386 11.888,17.297 C11.868,17.282 12.094,17.339 12.070,17.324 C10.721,16.501 10.809,15.842 10.809,15.435 C10.809,15.270 10.858,15.077 10.953,14.899 C11.046,14.723 11.183,14.563 11.362,14.461 C11.475,14.502 11.562,14.541 11.616,14.567 C11.655,14.586 11.677,14.598 11.677,14.598 C11.677,14.598 11.664,14.576 11.644,14.546 C11.613,14.499 11.565,14.428 11.530,14.386 C11.544,14.381 11.557,14.377 11.571,14.373 C11.665,14.406 11.829,14.468 11.985,14.532 C12.092,14.576 12.195,14.621 12.268,14.659 C12.514,14.786 12.596,14.916 12.596,14.916 C12.596,14.916 12.654,14.879 12.594,14.749 C12.583,14.726 12.560,14.683 12.519,14.630 C12.465,14.561 12.378,14.473 12.239,14.386 C12.244,14.386 12.248,14.385 12.251,14.385 C12.379,14.437 12.514,14.503 12.663,14.590 C12.670,14.555 12.679,14.520 12.687,14.484 C12.688,14.479 12.690,14.475 12.691,14.470 C12.693,14.462 12.695,14.454 12.697,14.446 C12.704,14.416 12.711,14.385 12.718,14.354 C12.730,14.301 12.740,14.245 12.748,14.185 C12.764,14.058 12.768,13.913 12.740,13.731 C12.695,13.446 12.701,13.373 12.632,13.269 C12.573,13.181 12.648,13.142 12.740,13.221 C12.718,13.151 12.687,13.081 12.650,13.010 C12.650,13.009 12.651,13.009 12.651,13.007 C12.659,12.968 12.693,12.919 12.745,12.864 C12.758,12.849 12.774,12.834 12.790,12.818 C12.805,12.803 12.821,12.789 12.839,12.773 C13.359,12.313 14.782,11.539 14.908,11.443 C15.118,11.283 15.332,11.035 15.466,10.750 C15.508,10.672 15.544,10.578 15.571,10.468 C15.606,10.323 15.625,10.149 15.614,9.937 C15.606,9.764 15.537,9.634 14.917,9.568 C14.584,9.533 14.091,9.516 13.362,9.521 C13.335,9.521 13.309,9.521 13.282,9.521 C12.690,9.526 12.305,9.171 12.073,8.833 C12.025,8.759 11.984,8.689 11.946,8.626 C11.895,8.532 11.861,8.448 11.834,8.381 C11.917,8.070 12.028,7.772 12.165,7.489 C12.456,6.890 12.871,6.355 13.419,5.893 C13.468,5.850 13.226,5.921 13.272,5.877 C13.327,5.824 13.669,5.655 13.733,5.618 C13.772,5.595 13.692,5.556 13.557,5.528 C13.549,5.527 13.541,5.525 13.532,5.524 C13.380,5.496 13.167,5.485 12.972,5.527 C12.581,5.610 12.505,5.658 12.303,5.765 C12.385,5.678 12.650,5.540 12.585,5.554 C12.161,5.652 11.661,5.940 11.235,6.251 C11.231,6.211 11.235,6.179 11.243,6.116 C11.042,6.223 10.557,6.609 10.433,6.903 C10.433,6.839 10.433,6.807 10.425,6.736 C10.299,6.856 10.177,6.996 10.065,7.151 C10.055,7.165 10.044,7.178 10.034,7.192 C10.033,7.195 10.031,7.197 10.029,7.199 C9.691,7.112 9.367,7.055 9.056,7.023 C8.305,6.944 7.631,7.012 7.032,7.178 C6.951,7.201 6.871,7.224 6.793,7.250 C6.579,7.089 6.235,6.843 5.692,5.978 C5.659,5.926 5.656,6.097 5.626,6.042 C5.468,5.748 5.327,5.300 5.258,4.892 C5.234,4.750 5.218,4.613 5.214,4.489 C5.214,4.489 5.050,4.588 4.873,4.889 C4.806,5.003 4.737,5.146 4.675,5.324 C4.662,5.361 4.649,5.399 4.637,5.439 C4.596,5.570 4.568,5.648 4.539,5.720 C4.530,5.742 4.556,5.482 4.546,5.502 C4.530,5.537 4.502,5.579 4.472,5.627 C4.431,5.692 4.385,5.769 4.356,5.851 C4.349,5.870 4.343,5.889 4.338,5.909 C4.308,6.034 4.259,6.110 4.239,6.266 C4.238,6.270 4.237,6.273 4.235,6.276 C4.234,6.261 4.233,6.230 4.231,6.200 C4.229,6.152 4.225,6.105 4.218,6.123 C4.118,6.397 4.024,6.712 3.948,7.067 C3.838,7.628 3.726,8.395 3.793,9.368 C3.792,9.403 3.795,9.438 3.797,9.472 C3.800,9.514 3.803,9.555 3.802,9.594 C3.461,10.078 3.239,10.494 3.153,10.699 C3.066,10.873 2.979,11.068 2.893,11.284 C2.564,12.102 2.241,13.234 1.969,14.813 C1.969,14.813 2.200,14.061 2.661,13.210 C2.321,14.282 2.055,15.950 2.211,18.452 C2.215,18.397 2.248,18.101 2.322,17.660 C2.360,17.435 2.408,17.173 2.470,16.885 C2.473,16.950 2.477,17.015 2.482,17.081 C2.497,17.315 2.519,17.556 2.548,17.803 C2.565,17.949 2.585,18.097 2.607,18.248 C2.814,19.617 3.265,21.166 4.197,22.811 C5.154,24.502 7.676,28.430 14.005,29.900 C13.826,29.847 13.665,29.780 13.524,29.710 C13.117,29.508 12.879,29.280 12.879,29.280 C12.879,29.280 13.080,29.346 13.407,29.439 C14.081,29.630 15.290,29.931 16.388,29.990 C16.586,30.000 16.781,30.004 16.968,29.996 C16.428,29.900 16.320,29.631 16.320,29.631 C16.320,29.631 21.233,29.917 23.785,27.837 C23.835,27.796 23.885,27.754 23.934,27.711 C23.938,27.709 23.941,27.708 23.945,27.706 C24.327,27.379 24.606,27.021 24.755,26.675 C24.636,26.734 24.518,26.789 24.403,26.841 C24.025,27.251 23.564,27.586 23.055,27.860 C22.590,27.996 22.118,28.072 21.749,28.108 C21.581,28.124 21.434,28.132 21.319,28.133 C21.594,27.872 21.957,27.681 22.387,27.495 C23.024,27.219 23.811,26.955 24.683,26.496 C24.685,26.495 24.687,26.494 24.689,26.493 C24.741,26.466 24.793,26.437 24.845,26.409 C25.598,25.996 26.410,25.432 27.244,24.585 C28.038,23.779 28.427,23.083 28.643,22.448 C28.703,22.270 28.750,22.097 28.788,21.928 C28.852,21.645 28.893,21.372 28.934,21.104 C28.934,21.103 28.934,21.101 28.934,21.100 C28.934,21.102 28.933,21.103 28.933,21.105 C28.926,21.144 28.918,21.183 28.910,21.221 C28.671,22.267 27.797,22.972 26.794,23.585 C26.608,23.698 26.417,23.808 26.226,23.917 C26.339,23.696 26.459,23.491 26.582,23.294 C26.586,23.289 26.589,23.284 26.592,23.279 C26.590,23.284 26.588,23.288 26.586,23.293 C26.573,23.319 26.561,23.344 26.550,23.367 C26.567,23.339 26.585,23.311 26.603,23.283 C26.798,22.973 27.012,22.669 27.232,22.372 C27.760,21.689 28.278,21.118 28.621,20.490 C28.672,20.397 28.726,20.292 28.782,20.177 C28.803,20.134 28.825,20.090 28.846,20.043 C29.220,19.292 29.607,18.267 29.857,17.120 C29.969,16.606 30.053,16.067 30.097,15.517 C30.138,14.992 30.142,14.457 30.097,13.924 Z" class="cls-1"/>
+</svg>
deleted file mode 100644
index 3ee34b01b8e8ae5718994cc36d6879e32ff79c1c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/branding/aurora/content/jar.mn
+++ b/browser/branding/aurora/content/jar.mn
@@ -9,12 +9,11 @@ browser.jar:
   content/branding/about-logo.png                (about-logo.png)
   content/branding/about-logo@2x.png             (about-logo@2x.png)
   content/branding/about-wordmark.svg            (about-wordmark.svg)
   content/branding/icon48.png                    (icon48.png)
   content/branding/icon64.png                    (icon64.png)
   content/branding/icon16.png                    (../default16.png)
   content/branding/icon32.png                    (../default32.png)
   content/branding/icon128.png                   (../mozicon128.png)
-  content/branding/identity-icons-brand.png      (identity-icons-brand.png)
-  content/branding/identity-icons-brand@2x.png   (identity-icons-brand@2x.png)
+  content/branding/identity-icons-brand.svg      (identity-icons-brand.svg)
   content/branding/silhouette-40.svg             (silhouette-40.svg)
   content/branding/aboutDialog.css               (aboutDialog.css)
deleted file mode 100644
index feba1607a9bb7fa8a5be6f335cdeb32fc3e70636..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/browser/branding/nightly/content/identity-icons-brand.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid" width="32" height="32" viewBox="0 0 32 32">
+  <style>
+    .cls-1 {
+      fill: #144787;
+      fill-rule: evenodd;
+    }
+  </style>
+  <path d="M15.953,30.000 C8.221,30.000 1.953,23.732 1.953,16.000 C1.953,8.268 8.221,2.000 15.953,2.000 C23.685,2.000 29.953,8.268 29.953,16.000 C29.953,23.732 23.685,30.000 15.953,30.000 ZM16.000,4.000 C9.373,4.000 4.000,9.373 4.000,16.000 C4.000,22.627 9.373,28.000 16.000,28.000 C22.627,28.000 28.000,22.627 28.000,16.000 C28.000,9.373 22.627,4.000 16.000,4.000 ZM27.085,16.311 C27.142,16.652 27.085,17.189 26.942,17.483 C26.885,17.958 26.784,18.470 26.561,18.931 C26.407,19.254 26.189,19.798 25.772,19.846 C25.646,19.858 25.319,20.214 25.283,20.155 C25.208,20.028 25.155,19.869 24.999,19.809 C24.873,19.751 24.990,19.698 24.895,19.643 C24.828,19.607 24.816,19.527 24.803,19.452 C24.756,19.459 24.710,19.469 24.668,19.492 C24.580,19.543 24.528,19.636 24.445,19.693 C24.391,19.671 24.300,19.631 24.307,19.561 C24.235,19.627 24.158,19.762 24.088,19.660 C24.030,19.576 24.071,19.459 24.068,19.367 C24.064,19.275 23.978,19.139 23.883,19.254 C23.816,19.334 23.769,19.345 23.665,19.365 C23.570,19.385 23.496,19.449 23.395,19.450 C23.156,19.456 23.176,19.563 23.117,19.744 C23.063,19.902 22.845,19.920 22.750,20.050 C22.700,20.117 22.549,20.431 22.421,20.318 C22.319,20.227 22.581,19.988 22.581,19.868 C22.581,19.767 22.498,19.709 22.475,19.618 C22.457,19.552 22.479,19.498 22.403,19.463 C22.448,19.376 22.500,19.239 22.455,19.142 C22.398,19.015 22.189,19.130 22.139,19.206 C22.088,19.277 21.964,19.523 21.848,19.374 C21.819,19.341 21.840,19.299 21.785,19.301 C21.747,19.301 21.720,19.325 21.702,19.354 C21.621,19.328 21.652,19.254 21.682,19.199 C21.770,19.040 21.781,18.864 21.900,18.718 C22.026,18.561 22.220,18.468 22.333,18.301 C22.372,18.242 22.441,18.131 22.385,18.064 C22.364,18.038 22.326,18.027 22.313,17.995 C22.297,17.956 22.315,17.913 22.310,17.874 C22.268,17.891 22.222,17.909 22.175,17.894 C22.169,17.851 22.175,17.805 22.164,17.761 C22.108,17.783 22.049,17.851 21.982,17.836 C21.919,17.823 21.927,17.867 21.857,17.865 C21.916,17.772 21.952,17.667 22.015,17.575 C22.051,17.521 22.101,17.473 22.130,17.413 C22.198,17.271 22.058,17.158 22.081,17.020 C22.106,16.863 22.281,16.825 22.417,16.839 C22.554,16.854 22.707,16.980 22.845,16.930 C22.975,16.887 23.014,16.706 22.977,16.590 C22.933,16.460 22.768,16.424 22.779,16.265 C22.784,16.172 22.831,16.089 22.813,15.996 C22.799,15.921 22.761,15.854 22.743,15.779 C22.700,15.598 22.867,15.549 22.923,15.405 C22.951,15.329 22.964,15.138 23.092,15.223 C23.205,15.300 23.158,15.476 23.266,15.564 C23.392,15.670 23.563,15.600 23.690,15.535 C23.796,15.480 23.958,15.425 24.012,15.314 C24.088,15.163 23.947,14.988 24.138,14.892 C24.217,14.853 24.415,14.744 24.505,14.779 C24.587,14.810 24.616,14.902 24.675,14.961 C24.699,14.882 24.731,14.810 24.781,14.748 C24.889,14.613 25.040,14.518 25.035,14.330 C25.082,14.104 25.010,14.119 24.970,13.940 C24.961,13.858 24.888,13.292 25.017,13.315 C25.310,13.366 25.065,12.676 25.022,12.563 C25.008,12.523 24.942,12.470 24.895,12.448 C24.767,12.330 24.692,12.528 24.611,12.454 C24.512,12.332 24.530,12.133 24.515,11.982 C24.490,11.818 24.397,11.698 24.393,11.534 C24.391,11.455 23.924,10.932 24.021,10.856 C24.079,10.823 24.816,10.879 24.776,10.823 C24.654,10.644 24.704,10.469 24.461,10.371 C24.307,10.307 24.204,10.138 24.055,10.065 C23.983,10.030 23.679,9.806 23.937,9.790 C24.106,9.779 23.902,9.526 23.827,9.502 C23.735,9.473 23.742,9.752 23.654,9.509 C23.635,9.469 23.273,9.012 23.264,9.056 C23.252,9.127 23.343,9.225 23.333,9.307 C23.306,9.533 22.982,9.108 22.993,9.125 C22.933,9.059 22.694,8.882 22.666,8.802 C22.671,8.819 22.774,8.629 22.775,8.629 C22.833,8.553 22.774,8.467 22.707,8.398 C22.624,8.314 22.486,8.305 22.473,8.177 C22.471,8.157 22.374,7.979 22.459,7.982 C22.529,7.988 22.754,8.172 22.836,8.210 C23.061,8.314 22.996,8.383 23.128,8.505 C23.313,8.638 23.606,8.799 23.768,8.997 C23.793,9.043 24.122,9.380 24.134,9.252 C24.138,9.209 24.019,8.872 23.971,8.855 C23.971,8.855 23.755,8.580 23.750,8.556 C23.751,8.565 23.408,8.154 23.493,8.168 C23.624,8.192 24.093,8.542 24.064,8.677 C24.044,8.766 24.221,8.830 24.248,8.912 C24.255,8.935 24.567,9.221 24.611,9.241 C24.658,9.263 24.819,9.415 24.855,9.460 C24.920,9.506 24.972,9.462 24.994,9.578 C25.003,9.631 25.087,9.819 25.114,9.855 C25.193,9.961 25.247,10.125 25.294,10.249 C25.360,10.431 25.319,10.633 25.323,10.821 C25.342,10.874 25.233,10.938 25.240,11.005 C25.253,11.111 25.254,11.235 25.269,11.329 C25.283,11.426 25.466,11.679 25.436,11.759 C25.366,11.907 25.416,11.891 25.486,12.027 C25.533,12.120 25.436,12.159 25.479,12.277 C25.296,12.295 25.477,12.379 25.360,12.421 C25.254,12.435 25.222,12.414 25.132,12.483 C25.100,12.506 25.506,13.100 25.580,12.526 C25.600,12.372 25.765,12.220 25.921,12.157 C26.006,12.120 26.087,12.281 26.110,12.120 C26.115,12.075 26.029,11.929 26.071,11.909 C26.155,11.878 26.299,12.539 26.365,12.588 C26.529,12.703 26.642,12.893 26.664,13.093 C26.687,13.325 27.108,13.685 27.021,13.898 C26.960,14.050 26.984,14.494 27.000,14.662 C27.027,14.841 27.085,14.984 27.086,15.176 C27.086,15.280 27.016,15.531 27.063,15.619 C27.169,15.815 27.050,16.103 27.085,16.311 ZM22.142,23.184 C22.112,23.125 22.171,23.051 22.238,23.053 C22.254,23.009 22.333,22.943 22.382,22.954 C22.416,22.963 22.419,23.000 22.453,22.969 C22.486,22.940 22.480,22.892 22.522,22.869 C22.633,22.801 22.687,22.918 22.624,23.003 C22.576,23.067 22.455,23.115 22.380,23.094 C22.284,23.069 22.231,23.151 22.142,23.184 ZM23.207,22.324 C23.239,22.315 23.270,22.260 23.306,22.269 C23.406,22.296 23.298,22.486 23.288,22.537 C23.275,22.612 23.284,22.763 23.169,22.745 L23.178,22.726 C23.171,22.725 23.158,22.726 23.151,22.728 C23.149,22.736 23.142,22.743 23.142,22.745 C23.147,22.701 23.158,22.644 23.137,22.603 C23.111,22.555 23.056,22.544 23.013,22.521 C22.969,22.499 22.959,22.482 22.986,22.442 C23.007,22.409 23.041,22.351 23.077,22.331 C23.117,22.311 23.164,22.338 23.207,22.324 ZM22.843,22.551 C22.923,22.537 22.969,22.582 23.023,22.635 C23.084,22.697 23.040,22.772 22.962,22.794 C22.887,22.818 22.856,22.754 22.786,22.754 C22.784,22.741 22.788,22.725 22.782,22.715 L22.784,22.717 C22.770,22.644 22.750,22.570 22.843,22.551 ZM21.519,24.762 C21.567,24.727 21.846,24.663 21.821,24.594 C21.794,24.527 21.833,24.497 21.894,24.472 C21.932,24.456 21.966,24.405 22.006,24.399 C22.036,24.472 22.031,24.559 22.135,24.559 C22.214,24.559 22.293,24.523 22.355,24.476 C22.432,24.421 22.439,24.330 22.536,24.295 C22.621,24.266 22.687,24.230 22.764,24.186 C22.833,24.148 22.894,24.066 22.975,24.056 C23.014,24.053 23.111,24.047 23.138,24.086 C23.178,24.144 23.007,24.248 22.971,24.277 C22.933,24.308 22.826,24.395 22.905,24.445 C22.964,24.479 23.050,24.417 23.102,24.395 C23.176,24.363 23.259,24.339 23.313,24.275 C23.363,24.217 23.378,24.138 23.448,24.097 C23.536,24.044 23.588,23.991 23.640,23.902 C23.674,23.845 23.670,23.783 23.719,23.732 C23.768,23.678 23.748,23.617 23.778,23.557 C23.830,23.464 23.868,23.572 23.893,23.610 C23.953,23.590 23.971,23.508 24.025,23.473 C24.059,23.452 24.122,23.435 24.138,23.393 C24.152,23.359 24.143,23.326 24.174,23.297 C24.231,23.242 24.357,23.260 24.429,23.226 C24.472,23.206 24.526,23.098 24.578,23.111 C24.487,23.399 24.310,23.603 24.102,23.820 C23.895,24.033 23.706,24.266 23.458,24.435 C23.205,24.609 22.957,24.793 22.680,24.931 C22.405,25.070 22.198,25.292 21.945,25.461 C21.384,25.837 20.791,26.207 20.145,26.425 C19.822,26.536 19.494,26.666 19.162,26.751 C19.054,26.779 18.944,26.802 18.835,26.828 C18.811,26.833 18.676,26.883 18.658,26.872 C18.648,26.848 18.444,26.892 18.414,26.908 C18.301,26.966 18.196,26.992 18.071,26.992 C17.968,26.992 17.857,26.963 17.765,27.012 C17.733,27.030 17.578,27.065 17.628,26.974 C17.655,26.924 17.821,26.954 17.862,26.954 C17.963,26.952 18.056,26.912 18.150,26.879 C18.270,26.839 18.383,26.793 18.504,26.755 C18.570,26.735 18.631,26.724 18.687,26.688 C18.784,26.624 18.892,26.637 18.993,26.598 C19.061,26.573 19.104,26.473 19.201,26.498 C19.250,26.511 19.275,26.533 19.329,26.533 C19.399,26.531 19.370,26.513 19.385,26.462 C19.403,26.392 19.458,26.381 19.487,26.438 C19.525,26.511 19.644,26.394 19.694,26.381 C19.771,26.363 19.759,26.287 19.866,26.290 C19.962,26.296 20.025,26.216 20.116,26.197 C20.163,26.186 20.285,26.190 20.310,26.145 C20.187,26.148 20.064,26.166 19.947,26.214 C19.825,26.263 19.710,26.334 19.579,26.360 C19.457,26.381 19.329,26.369 19.207,26.396 C19.090,26.422 18.986,26.482 18.874,26.520 C18.777,26.555 18.653,26.580 18.556,26.531 C18.448,26.473 18.551,26.391 18.624,26.372 C18.720,26.350 18.836,26.365 18.919,26.305 C18.986,26.258 19.005,26.172 19.025,26.099 C18.982,26.103 18.525,26.137 18.667,26.010 C18.732,25.950 18.835,25.935 18.919,25.917 C19.013,25.897 19.102,25.851 19.201,25.855 C19.324,25.860 19.401,25.950 19.520,25.868 C19.590,25.820 19.647,25.747 19.728,25.716 C19.807,25.684 19.904,25.746 19.976,25.693 C20.039,25.645 20.052,25.567 20.138,25.545 C20.224,25.523 20.384,25.545 20.399,25.418 C20.408,25.352 20.267,25.281 20.230,25.230 C20.183,25.164 20.122,25.079 20.066,25.020 C20.028,24.982 19.915,24.969 19.920,24.904 C19.929,24.802 20.086,24.807 20.156,24.791 C20.266,24.763 20.348,24.703 20.467,24.729 C20.569,24.749 20.647,24.763 20.738,24.703 C20.819,24.650 20.891,24.596 20.986,24.569 C20.943,24.654 20.934,24.754 20.879,24.835 C20.830,24.904 20.749,24.947 20.695,25.015 C20.542,25.206 20.843,25.316 20.879,25.172 C20.897,25.095 20.857,25.039 20.952,24.999 C21.010,24.975 21.102,24.977 21.110,24.907 C21.123,24.820 21.227,24.762 21.312,24.751 C21.400,24.738 21.497,24.663 21.583,24.671 C21.562,24.691 21.508,24.727 21.519,24.762 ZM19.358,6.878 C19.266,7.018 19.200,7.122 19.066,7.232 C18.993,7.294 19.013,7.534 18.871,7.436 C18.822,7.401 18.820,7.388 18.748,7.396 C18.700,7.401 18.649,7.447 18.639,7.487 C18.612,7.492 18.581,7.587 18.547,7.525 C18.527,7.534 18.419,7.572 18.400,7.563 C18.371,7.551 18.347,7.478 18.319,7.454 C18.245,7.394 18.373,7.308 18.310,7.246 C18.263,7.199 18.205,7.193 18.151,7.226 C18.065,7.283 18.029,7.228 17.946,7.244 C17.858,7.261 17.905,7.195 17.891,7.131 C17.853,7.113 17.808,7.117 17.770,7.128 C17.720,7.142 17.736,7.152 17.731,7.173 C17.713,7.157 17.630,7.152 17.618,7.150 C17.610,7.117 17.702,7.062 17.707,7.011 C17.707,6.997 17.689,6.860 17.684,6.855 C17.616,6.805 17.722,6.776 17.761,6.811 C17.806,6.849 17.844,6.778 17.902,6.802 C17.907,6.774 17.799,6.742 17.776,6.738 C17.715,6.729 17.653,6.800 17.589,6.807 C17.567,6.809 17.475,6.842 17.463,6.813 C17.452,6.791 17.468,6.758 17.475,6.738 C17.443,6.711 17.407,6.694 17.364,6.691 C17.299,6.685 17.233,6.705 17.173,6.672 C17.098,6.629 17.057,6.599 16.969,6.585 C16.906,6.574 16.852,6.537 16.843,6.474 C16.834,6.423 16.808,6.293 16.821,6.242 C16.893,6.228 16.846,6.304 16.904,6.308 C16.963,6.312 17.008,6.330 17.067,6.337 C17.118,6.343 17.191,6.377 17.242,6.361 C17.324,6.335 17.348,6.204 17.395,6.193 C17.393,6.175 17.382,6.160 17.366,6.149 C17.404,6.140 17.441,6.128 17.472,6.106 C17.445,6.091 17.382,6.133 17.391,6.075 C17.398,6.033 17.423,5.996 17.429,5.954 C17.438,5.869 17.231,5.867 17.181,5.887 C17.139,5.902 17.102,5.931 17.076,5.967 C17.037,6.025 16.994,6.000 16.925,5.991 C16.938,5.900 16.871,5.883 16.818,5.825 C16.742,5.745 16.690,5.636 16.699,5.528 C16.706,5.439 16.629,5.364 16.690,5.278 C16.785,5.145 17.116,5.151 17.272,5.206 C17.623,5.224 17.968,5.258 18.310,5.355 C18.696,5.464 19.038,5.663 19.417,5.781 C19.597,5.836 19.649,5.934 19.590,6.104 C19.539,6.250 19.669,6.293 19.784,6.333 C19.886,6.372 20.003,6.441 19.955,6.568 C19.913,6.678 19.759,6.701 19.658,6.718 C19.530,6.738 19.430,6.765 19.358,6.878 ZM16.767,16.426 C16.812,16.438 16.868,16.393 16.922,16.404 C16.956,16.411 16.963,16.433 16.990,16.444 C17.021,16.460 17.021,16.460 17.051,16.453 C17.073,16.438 17.096,16.433 17.127,16.449 C17.147,16.462 17.152,16.484 17.179,16.493 C17.218,16.510 17.247,16.493 17.289,16.491 C17.350,16.500 17.377,16.542 17.420,16.482 C17.447,16.426 17.459,16.373 17.526,16.373 C17.578,16.377 17.618,16.400 17.578,16.442 C17.553,16.473 17.535,16.502 17.538,16.551 C17.549,16.590 17.582,16.590 17.610,16.566 C17.643,16.533 17.653,16.473 17.709,16.466 C17.759,16.462 17.804,16.508 17.857,16.511 C17.882,16.513 17.905,16.508 17.932,16.517 C17.961,16.526 17.972,16.539 17.991,16.551 C18.040,16.571 18.076,16.553 18.115,16.577 C18.189,16.632 18.220,16.715 18.277,16.774 C18.311,16.807 18.364,16.817 18.391,16.852 C18.403,16.874 18.409,16.889 18.419,16.903 C18.439,16.914 18.459,16.925 18.473,16.947 C18.500,16.981 18.480,17.011 18.475,17.052 C18.468,17.087 18.484,17.116 18.502,17.153 C18.531,17.195 18.579,17.322 18.489,17.328 C18.466,17.335 18.432,17.335 18.414,17.331 C18.382,17.331 18.400,17.335 18.378,17.315 C18.346,17.291 18.313,17.266 18.283,17.242 C18.238,17.202 18.240,17.145 18.211,17.094 C18.195,17.065 18.162,17.054 18.124,17.038 C18.103,17.020 18.090,17.020 18.060,17.001 C18.033,16.992 18.008,16.998 17.975,16.998 C17.923,16.996 17.849,16.932 17.821,16.890 C17.804,16.861 17.801,16.847 17.767,16.847 C17.742,16.845 17.715,16.867 17.688,16.867 C17.621,16.867 17.571,16.830 17.499,16.848 C17.436,16.865 17.384,16.852 17.314,16.845 C17.240,16.848 17.161,16.836 17.105,16.785 C17.073,16.759 17.055,16.723 17.015,16.699 C16.979,16.692 16.938,16.694 16.911,16.684 C16.848,16.668 16.769,16.655 16.711,16.628 C16.665,16.608 16.636,16.566 16.595,16.535 C16.546,16.506 16.474,16.491 16.424,16.462 C16.379,16.449 16.264,16.422 16.318,16.375 C16.345,16.351 16.406,16.329 16.440,16.327 C16.501,16.336 16.505,16.386 16.546,16.415 C16.578,16.440 16.625,16.429 16.659,16.397 C16.679,16.375 16.674,16.358 16.704,16.377 C16.731,16.386 16.747,16.415 16.767,16.426 ZM16.489,5.335 C16.436,5.355 16.381,5.339 16.325,5.351 C16.325,5.348 16.323,5.342 16.323,5.339 C16.285,5.328 16.242,5.295 16.257,5.253 C16.303,5.233 16.589,5.189 16.598,5.257 C16.604,5.293 16.515,5.324 16.489,5.335 ZM15.832,5.765 C15.861,5.889 15.724,6.033 15.696,6.158 C15.671,6.273 15.550,6.434 15.455,6.505 C15.354,6.581 15.158,6.740 15.027,6.700 C14.950,6.678 14.871,6.658 14.791,6.638 C14.711,6.618 14.644,6.548 14.572,6.530 C14.617,6.417 14.687,6.558 14.741,6.477 C14.747,6.501 14.799,6.523 14.820,6.499 C14.844,6.477 14.822,6.415 14.822,6.388 C14.820,6.319 14.939,6.235 15.002,6.228 C15.047,6.224 15.099,6.226 15.137,6.200 C15.185,6.166 15.223,6.202 15.286,6.186 C15.331,6.177 15.503,6.078 15.480,6.018 C15.392,6.027 15.354,6.018 15.277,6.082 C15.293,6.020 15.419,5.951 15.399,5.894 C15.338,5.896 15.336,5.980 15.279,5.989 C15.223,5.998 15.214,5.892 15.182,5.865 C15.043,5.750 14.982,6.140 14.854,6.107 C14.797,6.093 14.815,6.013 14.732,6.029 C14.630,6.049 14.603,6.122 14.596,6.215 C14.592,6.268 14.500,6.330 14.459,6.379 C14.394,6.457 14.311,6.441 14.236,6.388 C14.171,6.344 14.180,6.242 14.101,6.215 C14.026,6.188 13.929,6.210 13.860,6.250 C13.778,6.297 13.736,6.394 13.657,6.437 C13.583,6.474 13.461,6.461 13.384,6.465 C13.339,6.466 13.136,6.492 13.157,6.397 C13.172,6.330 13.215,6.275 13.138,6.228 C13.098,6.202 13.019,6.153 13.062,6.097 C13.098,6.051 13.175,6.053 13.197,5.996 C13.127,5.958 13.031,5.947 13.035,5.849 C12.924,5.829 12.884,5.927 12.814,5.980 C12.717,6.051 12.773,5.914 12.792,5.882 C12.818,5.838 12.866,5.774 12.915,5.758 C12.965,5.739 12.969,5.690 13.003,5.656 L12.990,5.667 C12.951,5.628 12.933,5.550 12.951,5.499 C12.972,5.437 13.048,5.448 13.100,5.441 C13.256,5.422 13.431,5.288 13.592,5.340 C13.745,5.391 13.848,5.300 14.002,5.306 C14.080,5.308 14.169,5.293 14.247,5.286 C14.329,5.277 14.394,5.227 14.480,5.227 C14.542,5.227 14.680,5.238 14.631,5.328 C14.606,5.377 14.576,5.462 14.673,5.455 C14.800,5.446 14.887,5.264 15.005,5.237 C15.086,5.216 15.045,5.306 15.020,5.335 C15.011,5.344 14.915,5.492 14.993,5.461 C15.011,5.452 15.025,5.439 15.036,5.422 C15.063,5.380 15.111,5.377 15.160,5.364 C15.253,5.339 15.342,5.309 15.431,5.275 C15.604,5.207 15.669,5.282 15.818,5.349 C15.863,5.371 16.160,5.346 16.131,5.441 C16.111,5.504 15.976,5.534 15.920,5.552 C15.789,5.594 15.807,5.648 15.832,5.765 ZM12.967,8.084 C12.936,8.126 12.792,8.137 12.760,8.097 C12.764,8.090 12.767,8.077 12.774,8.072 L12.742,8.086 C12.694,8.134 12.623,8.154 12.557,8.145 C12.559,8.110 12.541,8.057 12.555,8.026 C12.571,7.993 12.614,7.984 12.638,7.957 C12.679,7.908 12.704,7.835 12.753,7.793 C12.807,7.747 12.907,7.731 12.927,7.815 C12.949,7.895 12.868,7.928 12.853,7.991 C12.909,7.988 13.008,8.032 12.967,8.084 ZM12.708,6.525 C12.735,6.534 12.771,6.548 12.803,6.552 C12.783,6.576 12.776,6.609 12.830,6.594 C12.803,6.652 12.746,6.714 12.683,6.731 C12.611,6.749 12.528,6.732 12.474,6.793 C12.386,6.893 12.501,7.060 12.631,7.008 C12.643,7.057 12.607,7.068 12.647,7.084 C12.530,7.226 12.440,7.387 12.298,7.166 C12.165,6.960 11.940,7.117 11.804,7.241 C11.654,7.376 11.638,7.600 11.856,7.676 C11.994,7.725 11.973,7.742 11.870,7.831 C11.917,7.886 11.775,7.937 11.759,8.004 C11.796,7.964 11.874,7.970 11.886,7.906 C11.951,7.917 11.911,7.837 11.960,7.848 C12.082,7.873 11.928,8.001 11.906,8.026 C11.949,8.055 11.998,8.032 12.045,8.032 C12.086,8.032 12.125,8.059 12.165,8.052 C12.221,8.044 12.194,7.999 12.230,7.982 C12.294,7.955 12.253,8.061 12.244,8.073 C12.205,8.130 12.176,8.248 12.109,8.261 C12.048,8.272 12.014,8.283 12.025,8.360 C12.034,8.432 12.057,8.425 12.009,8.502 C11.940,8.606 12.055,8.642 12.071,8.726 C12.088,8.815 12.061,8.791 12.140,8.830 C12.206,8.862 12.273,8.857 12.343,8.868 C12.426,8.879 12.566,8.782 12.537,8.689 C12.523,8.644 12.516,8.620 12.550,8.584 C12.573,8.558 12.640,8.502 12.674,8.544 C12.641,8.498 12.701,8.465 12.708,8.420 C12.715,8.365 12.814,8.374 12.778,8.303 C12.758,8.268 12.638,8.230 12.650,8.210 C12.728,8.201 12.810,8.190 12.884,8.221 C13.003,8.272 13.046,8.471 13.202,8.398 C13.366,8.321 13.483,8.163 13.529,7.995 C13.565,7.860 13.454,7.829 13.350,7.791 C13.287,7.767 13.278,7.727 13.249,7.669 C13.217,7.603 13.342,7.536 13.245,7.521 C13.125,7.501 13.084,7.376 13.209,7.325 C13.267,7.303 13.328,7.317 13.386,7.301 C13.438,7.286 13.458,7.144 13.506,7.228 C13.510,7.166 13.666,7.232 13.715,7.228 C13.783,7.223 13.729,7.164 13.790,7.172 C13.830,7.179 13.855,7.217 13.894,7.221 C13.948,7.226 13.947,7.181 13.984,7.162 C14.035,7.141 14.069,7.210 14.110,7.219 C14.155,7.228 14.202,7.261 14.249,7.239 C14.283,7.223 14.342,7.197 14.349,7.261 C14.362,7.348 14.405,7.403 14.414,7.478 C14.423,7.552 14.601,7.554 14.489,7.653 C14.425,7.709 14.358,7.815 14.263,7.786 C14.204,7.769 14.216,7.798 14.162,7.831 C14.114,7.860 14.107,7.913 14.063,7.917 C13.925,7.930 14.083,8.044 14.078,8.110 C14.072,8.166 14.112,8.194 14.114,8.245 C14.117,8.301 14.071,8.361 14.063,8.418 C14.051,8.503 14.216,8.647 14.263,8.718 C14.344,8.841 14.425,8.955 14.560,9.026 C14.644,9.070 14.684,9.165 14.763,9.216 C14.802,9.241 14.862,9.225 14.863,9.274 C14.863,9.320 14.858,9.371 14.874,9.416 C14.894,9.478 15.023,9.487 15.079,9.487 C15.088,9.588 15.235,9.480 15.279,9.469 C15.180,9.584 15.104,9.693 14.986,9.793 C14.930,9.839 14.865,9.899 14.790,9.910 C14.725,9.921 14.673,9.883 14.619,9.939 C14.576,9.983 14.585,10.052 14.543,10.100 C14.504,10.145 14.421,10.152 14.371,10.191 C14.347,10.207 14.112,10.371 14.128,10.251 C14.133,10.209 14.160,10.176 14.169,10.136 C14.182,10.080 14.117,10.076 14.092,10.049 C14.049,10.003 14.020,10.038 14.008,9.957 C14.000,9.912 13.986,9.861 13.945,9.832 C13.876,9.784 13.898,9.786 13.866,9.708 C13.840,9.646 13.781,9.606 13.758,9.546 C13.700,9.404 13.716,9.256 13.616,9.127 C13.612,9.178 13.652,9.220 13.635,9.260 C13.619,9.303 13.632,9.373 13.657,9.411 C13.569,9.404 13.513,9.376 13.450,9.316 C13.422,9.291 13.328,9.200 13.289,9.254 C13.337,9.249 13.441,9.394 13.504,9.425 C13.648,9.497 13.648,9.548 13.587,9.695 C13.646,9.706 13.736,9.655 13.776,9.724 C13.812,9.786 13.756,9.854 13.864,9.852 C13.848,9.996 13.706,10.089 13.698,10.234 C13.693,10.316 13.725,10.386 13.698,10.469 C13.670,10.557 13.600,10.633 13.506,10.659 C13.276,10.721 13.175,10.484 13.094,10.331 C13.060,10.267 12.974,10.209 12.898,10.245 C12.868,10.260 12.855,10.293 12.825,10.307 C12.767,10.336 12.706,10.322 12.652,10.362 C12.587,10.409 12.551,10.495 12.469,10.521 C12.418,10.537 12.350,10.521 12.307,10.553 C12.280,10.573 12.273,10.608 12.271,10.639 C12.235,10.646 12.208,10.670 12.185,10.697 C12.136,10.754 12.041,10.790 12.003,10.847 C11.951,10.923 12.066,10.992 12.057,11.069 C12.052,11.115 11.976,11.231 11.940,11.244 C11.777,11.300 11.894,11.463 11.937,11.554 C11.946,11.572 11.953,11.597 11.929,11.610 C11.890,11.634 11.904,11.650 11.929,11.698 C11.971,11.776 12.037,11.836 12.106,11.893 C12.163,11.938 12.289,11.965 12.305,12.031 C12.334,12.149 12.251,12.244 12.185,12.335 C12.133,12.406 12.091,12.488 12.055,12.568 C12.037,12.607 12.037,12.707 12.001,12.731 C11.852,12.829 11.879,12.435 11.707,12.526 C11.600,12.583 11.572,12.751 11.439,12.767 C11.370,12.776 11.343,12.705 11.334,12.652 C11.297,12.652 11.253,12.649 11.219,12.630 C11.140,12.592 11.192,12.567 11.210,12.512 C11.237,12.425 11.327,12.435 11.392,12.390 C11.475,12.332 11.396,12.281 11.397,12.211 C11.336,12.204 11.286,12.111 11.252,12.069 C11.183,11.989 11.117,11.987 11.018,11.985 C10.975,11.985 10.941,11.956 10.905,11.936 C10.892,11.985 10.712,11.934 10.651,11.965 C10.596,11.995 10.518,12.162 10.603,12.180 C10.572,12.250 10.491,12.328 10.502,12.405 C10.506,12.430 10.551,12.415 10.515,12.454 C10.486,12.483 10.480,12.526 10.473,12.565 C10.443,12.740 10.491,12.900 10.538,13.064 C10.459,13.084 10.383,13.122 10.310,13.162 C10.367,13.091 10.302,12.973 10.204,13.004 C10.204,13.039 10.191,13.071 10.177,13.100 C10.119,13.113 10.080,13.111 10.053,13.062 C10.015,12.993 10.056,13.013 10.087,12.960 C10.150,12.851 10.011,12.709 9.956,12.836 C9.952,12.725 9.761,12.548 9.729,12.762 C9.720,12.829 9.758,12.958 9.628,12.915 C9.571,12.896 9.510,12.771 9.499,12.716 C9.490,12.820 9.603,12.873 9.585,12.960 C9.576,13.009 9.481,13.090 9.441,13.126 C9.508,13.124 9.580,13.120 9.645,13.130 C9.643,13.179 9.601,13.206 9.601,13.268 C9.589,13.270 9.576,13.274 9.565,13.275 C9.610,13.332 9.574,13.414 9.558,13.476 C9.537,13.472 9.502,13.485 9.481,13.483 C9.477,13.518 9.463,13.538 9.434,13.529 C9.438,13.540 9.436,13.549 9.431,13.558 C9.420,13.567 9.407,13.567 9.396,13.560 C9.396,13.543 9.386,13.518 9.387,13.501 C9.334,13.552 9.305,13.470 9.245,13.481 C9.236,13.567 9.244,13.651 9.125,13.625 C9.078,13.616 8.979,13.507 8.934,13.520 C8.915,13.525 8.902,13.552 8.893,13.583 C8.871,13.574 8.846,13.569 8.818,13.567 C8.728,13.560 8.663,13.642 8.555,13.629 C8.435,13.614 8.418,13.629 8.320,13.698 C8.233,13.760 8.172,13.685 8.086,13.669 C8.028,13.658 7.971,13.656 7.915,13.640 C7.892,13.633 7.863,13.620 7.849,13.600 C7.822,13.560 7.726,13.569 7.676,13.563 C7.466,13.545 7.257,13.549 7.070,13.658 C6.928,13.742 6.752,13.875 6.723,14.046 C6.676,14.327 7.052,14.356 7.218,14.476 C7.431,14.629 6.987,14.759 6.881,14.797 C6.756,14.841 6.632,14.901 6.536,14.995 C6.461,15.068 6.412,15.243 6.277,15.185 C6.087,15.101 5.939,14.870 5.832,14.704 C5.745,14.664 5.666,14.383 5.655,14.294 C5.648,14.239 5.549,14.061 5.627,14.046 C5.643,14.001 5.601,13.953 5.583,13.917 C5.549,13.846 5.571,13.762 5.540,13.687 C5.508,13.611 5.630,13.479 5.614,13.385 C5.607,13.345 5.574,13.326 5.609,13.286 C5.652,13.233 5.659,13.195 5.670,13.130 C5.690,13.022 5.817,13.031 5.846,12.936 C5.855,12.909 5.857,12.856 5.893,12.847 C5.965,12.829 5.884,12.953 5.921,12.982 C5.923,12.884 5.956,12.789 5.956,12.687 C5.956,12.567 5.977,12.448 5.995,12.330 C6.008,12.239 6.024,12.146 6.065,12.064 C6.094,12.011 6.099,11.832 5.990,11.918 C5.986,11.721 5.988,11.524 6.024,11.331 C6.065,11.107 6.164,10.910 6.267,10.710 C6.466,10.324 6.626,9.908 6.869,9.546 C6.987,9.369 7.126,9.207 7.246,9.030 C7.309,8.934 7.378,8.841 7.426,8.737 C7.471,8.640 7.548,8.585 7.620,8.507 C7.750,8.369 7.854,8.237 8.009,8.119 C8.075,8.068 8.149,7.973 8.242,7.995 C8.345,8.017 8.375,7.937 8.449,7.889 C8.447,7.953 8.460,8.001 8.451,8.066 C8.508,8.004 8.546,7.917 8.598,7.849 C8.672,7.758 8.756,7.676 8.857,7.612 C8.895,7.587 8.920,7.547 8.960,7.523 C8.990,7.507 9.026,7.509 9.057,7.492 C9.093,7.470 9.316,7.357 9.283,7.319 C9.157,7.168 8.710,7.729 8.578,7.704 C8.573,7.633 8.758,7.538 8.809,7.503 C8.956,7.405 9.096,7.277 9.236,7.168 C9.384,7.053 9.533,6.931 9.691,6.829 C9.765,6.783 9.846,6.751 9.914,6.698 C9.963,6.661 10.017,6.589 10.089,6.598 C10.081,6.747 10.202,6.612 10.259,6.598 C10.400,6.563 10.547,6.463 10.678,6.404 C10.761,6.366 11.435,5.923 11.466,6.046 C11.529,6.053 11.561,5.965 11.640,5.978 C11.743,5.993 11.807,5.947 11.890,5.894 C12.027,5.805 12.172,5.716 12.312,5.632 C12.366,5.601 12.415,5.594 12.406,5.672 C12.400,5.719 12.303,5.739 12.269,5.759 C12.206,5.798 12.160,5.854 12.122,5.916 C12.064,6.007 11.985,6.080 11.920,6.168 C11.985,6.182 12.016,6.128 12.071,6.109 C12.140,6.089 12.154,6.142 12.224,6.098 C12.257,6.080 12.289,6.104 12.316,6.115 C12.356,6.131 12.365,6.106 12.397,6.093 C12.444,6.075 12.499,6.169 12.562,6.171 C12.758,6.171 12.357,6.397 12.553,6.426 C12.636,6.437 12.631,6.497 12.708,6.525 ZM12.925,6.519 C12.893,6.521 12.868,6.543 12.836,6.550 C12.827,6.552 12.814,6.552 12.803,6.552 C12.810,6.543 12.819,6.536 12.827,6.532 C12.857,6.519 12.893,6.517 12.925,6.519 ZM7.191,20.631 C7.273,20.622 7.280,20.739 7.342,20.770 C7.342,20.762 7.343,20.759 7.345,20.753 C7.390,20.788 7.412,20.824 7.421,20.882 C7.430,20.954 7.448,20.992 7.473,21.057 C7.491,21.103 7.494,21.205 7.426,21.221 C7.365,21.234 7.349,21.156 7.307,21.128 C7.200,21.057 7.047,21.183 7.002,20.999 C6.984,20.928 6.993,20.881 6.943,20.819 C6.903,20.770 6.860,20.739 6.896,20.671 C6.950,20.571 7.122,20.522 7.191,20.631 ZM7.360,20.726 C7.356,20.737 7.351,20.744 7.345,20.753 C7.340,20.748 7.334,20.744 7.329,20.740 L7.360,20.726 ZM7.298,20.467 C7.237,20.411 7.275,20.221 7.370,20.301 C7.410,20.332 7.426,20.425 7.405,20.462 C7.378,20.507 7.322,20.527 7.298,20.467 ZM7.521,14.913 C7.548,14.895 7.548,14.870 7.565,14.848 C7.588,14.815 7.606,14.817 7.636,14.830 C7.647,14.835 7.660,14.848 7.676,14.842 C7.699,14.833 7.678,14.824 7.694,14.819 C7.751,14.766 7.748,14.850 7.746,14.893 C7.748,14.943 7.768,14.928 7.795,14.952 C7.818,14.970 7.798,14.984 7.805,15.008 C7.814,15.030 7.843,15.037 7.861,15.065 C7.881,15.090 7.870,15.112 7.856,15.141 C7.805,15.218 7.705,15.178 7.640,15.141 C7.611,15.134 7.574,15.105 7.550,15.088 C7.527,15.072 7.496,15.057 7.473,15.041 C7.444,15.034 7.403,15.014 7.410,14.986 C7.412,14.968 7.458,14.935 7.475,14.930 L7.521,14.913 ZM16.778,18.530 C16.859,18.576 16.931,18.607 17.024,18.572 C17.107,18.539 17.164,18.488 17.260,18.497 C17.373,18.507 17.386,18.572 17.425,18.658 C17.486,18.789 17.698,18.758 17.670,18.940 C17.520,19.022 17.664,19.144 17.704,19.248 C17.724,19.301 17.720,19.359 17.722,19.416 C17.722,19.458 17.738,19.529 17.704,19.561 C17.673,19.591 17.603,19.591 17.564,19.600 C17.510,19.614 17.458,19.642 17.402,19.649 C17.305,19.664 17.229,19.600 17.141,19.667 C17.107,19.693 17.082,19.725 17.042,19.746 C16.997,19.767 16.942,19.775 16.893,19.786 C16.846,19.797 16.791,19.815 16.744,19.795 C16.706,19.778 16.688,19.736 16.652,19.716 C16.564,19.665 16.427,19.756 16.341,19.784 C16.273,19.806 16.147,19.875 16.075,19.840 C15.971,19.789 16.116,19.654 16.145,19.600 C16.190,19.510 16.170,19.410 16.192,19.315 C16.154,19.312 16.149,19.283 16.118,19.270 C16.107,19.264 16.080,19.266 16.068,19.263 C16.053,19.261 16.039,19.252 16.025,19.248 C16.019,19.292 15.949,19.334 15.951,19.272 C15.931,19.266 15.915,19.261 15.897,19.255 C15.899,19.219 15.965,19.099 16.010,19.100 L15.998,19.090 C16.111,18.986 16.235,18.865 16.391,18.833 C16.463,18.816 16.551,18.791 16.602,18.732 C16.659,18.667 16.589,18.596 16.607,18.523 C16.627,18.439 16.729,18.503 16.778,18.530 ZM17.698,17.537 C17.704,17.564 17.756,17.581 17.754,17.605 C17.754,17.616 17.691,17.621 17.680,17.621 C17.646,17.632 17.610,17.632 17.582,17.648 C17.560,17.659 17.542,17.676 17.519,17.687 C17.432,17.725 17.497,17.597 17.497,17.552 C17.502,17.512 17.465,17.406 17.504,17.366 L17.499,17.339 C17.499,17.315 17.488,17.293 17.506,17.266 C17.511,17.247 17.546,17.237 17.564,17.220 C17.587,17.209 17.610,17.176 17.632,17.198 C17.644,17.209 17.650,17.227 17.650,17.238 C17.666,17.255 17.684,17.273 17.695,17.295 C17.700,17.322 17.700,17.357 17.688,17.379 C17.682,17.419 17.693,17.430 17.698,17.468 C17.698,17.492 17.688,17.513 17.698,17.537 ZM18.757,18.490 C18.745,18.519 18.682,18.516 18.649,18.510 C18.631,18.510 18.613,18.510 18.595,18.494 C18.576,18.476 18.590,18.446 18.561,18.452 C18.536,18.448 18.522,18.477 18.493,18.481 C18.482,18.485 18.461,18.474 18.446,18.485 C18.376,18.497 18.414,18.514 18.407,18.563 C18.405,18.607 18.355,18.636 18.369,18.678 C18.378,18.718 18.407,18.767 18.425,18.802 C18.486,18.955 18.277,18.829 18.232,18.791 C18.186,18.760 18.141,18.740 18.133,18.683 C18.117,18.640 18.121,18.598 18.115,18.552 C18.107,18.441 18.141,18.333 18.151,18.224 C18.153,18.164 18.139,18.120 18.130,18.064 C18.115,18.022 18.076,17.982 18.119,17.949 C18.146,17.891 18.130,17.861 18.115,17.801 C18.099,17.759 18.092,17.738 18.087,17.692 C18.096,17.581 18.015,17.508 17.988,17.397 C17.977,17.348 18.000,17.298 18.060,17.326 L18.103,17.346 C18.119,17.371 18.115,17.395 18.141,17.399 C18.177,17.415 18.263,17.349 18.286,17.397 C18.293,17.417 18.272,17.424 18.279,17.446 C18.288,17.468 18.310,17.477 18.324,17.484 C18.367,17.504 18.405,17.523 18.416,17.572 C18.416,17.590 18.409,17.603 18.425,17.628 C18.443,17.646 18.461,17.645 18.479,17.645 C18.531,17.652 18.588,17.643 18.610,17.688 C18.648,17.741 18.569,17.739 18.565,17.783 C18.561,17.825 18.603,17.852 18.624,17.882 C18.648,17.909 18.680,17.951 18.689,17.989 C18.700,18.040 18.664,18.058 18.666,18.111 C18.658,18.160 18.736,18.188 18.714,18.250 C18.700,18.295 18.658,18.346 18.676,18.399 C18.696,18.435 18.772,18.445 18.757,18.490 ZM7.507,20.618 C7.588,20.596 7.665,20.660 7.744,20.642 C7.827,20.624 7.852,20.527 7.859,20.458 C7.892,20.498 7.935,20.489 7.964,20.527 C7.994,20.573 8.061,20.580 8.106,20.602 C8.125,20.545 8.077,20.452 8.079,20.391 C8.079,20.356 8.045,20.288 8.055,20.263 C8.079,20.205 8.188,20.155 8.244,20.137 C8.311,20.115 8.390,20.165 8.449,20.190 C8.508,20.216 8.573,20.201 8.634,20.188 C8.665,20.181 8.697,20.177 8.729,20.176 C8.737,20.148 8.751,20.123 8.773,20.103 C8.819,20.055 8.873,20.075 8.924,20.101 C9.021,20.146 9.100,19.953 9.118,19.873 C9.141,19.771 9.152,19.580 9.123,19.478 C9.091,19.359 9.062,19.325 9.172,19.266 C9.195,19.255 9.202,19.228 9.213,19.203 C9.121,19.037 9.073,18.856 9.166,18.701 C9.242,18.574 9.409,18.461 9.359,18.322 C9.443,18.330 9.529,18.337 9.616,18.344 C9.751,18.169 9.950,18.047 10.166,18.011 C10.292,17.871 10.493,17.721 10.644,17.834 C10.693,17.871 10.723,17.929 10.779,17.956 C10.833,17.982 10.896,17.971 10.955,17.969 C11.164,17.964 11.370,18.100 11.448,18.297 C11.397,18.359 11.349,18.421 11.298,18.483 C11.360,18.711 11.712,18.793 11.849,18.601 C11.940,18.476 11.946,18.270 12.089,18.219 C12.161,18.193 12.244,18.219 12.323,18.246 C12.325,18.244 12.325,18.244 12.327,18.242 C12.329,18.242 12.329,18.248 12.329,18.248 C12.395,18.270 12.462,18.292 12.516,18.290 C12.530,18.266 12.532,18.257 12.548,18.230 C12.546,18.231 12.564,18.255 12.568,18.264 C12.586,18.255 12.605,18.257 12.618,18.237 C12.672,18.162 12.627,18.051 12.661,17.965 C12.694,17.885 12.782,17.887 12.857,17.920 C12.909,17.814 12.960,17.712 13.028,17.566 C13.062,17.492 13.033,17.869 12.981,18.242 C12.987,18.246 12.983,18.255 12.990,18.259 C13.031,18.271 13.073,18.237 13.102,18.202 C13.170,18.118 13.220,18.016 13.307,17.949 C13.364,17.903 13.440,17.896 13.508,17.913 C13.538,17.865 13.571,17.809 13.587,17.805 C13.682,17.783 13.756,17.745 13.853,17.781 C13.936,17.814 14.004,17.880 14.090,17.902 C14.148,17.916 14.256,17.914 14.286,17.976 C14.310,18.027 14.351,18.027 14.412,18.044 C14.437,18.051 14.489,18.053 14.491,18.089 C14.488,18.109 14.477,18.113 14.457,18.100 C14.464,18.155 14.534,18.153 14.574,18.169 C14.648,18.200 14.709,18.250 14.772,18.295 C14.894,18.384 14.978,18.514 15.070,18.632 C15.093,18.663 15.196,18.783 15.153,18.825 C15.126,18.853 15.068,18.847 15.034,18.864 C14.978,18.889 14.898,18.920 14.849,18.955 C14.804,18.986 14.784,19.039 14.739,19.066 C14.617,19.139 14.518,18.955 14.452,18.900 C14.362,18.825 14.400,18.691 14.328,18.630 C14.213,18.530 14.056,18.485 13.921,18.419 C13.848,18.383 13.767,18.355 13.704,18.301 C13.661,18.262 13.619,18.219 13.560,18.206 C13.560,18.206 13.558,18.208 13.558,18.210 C13.528,18.322 13.670,18.374 13.742,18.426 C13.830,18.490 13.851,18.587 13.894,18.678 C13.945,18.783 14.027,18.871 14.103,18.958 C14.137,18.995 14.182,19.022 14.205,19.068 C14.227,19.111 14.207,19.161 14.238,19.201 C14.090,19.259 13.963,18.947 13.878,18.876 C13.844,18.845 13.774,18.809 13.727,18.827 C13.700,18.880 13.653,18.949 13.691,18.991 C13.722,19.024 13.718,19.075 13.734,19.115 C13.752,19.161 13.790,19.210 13.815,19.252 C13.846,19.299 13.900,19.319 13.930,19.367 C13.950,19.399 13.959,19.436 13.975,19.469 C14.002,19.525 14.080,19.622 14.153,19.580 C14.234,19.534 14.204,19.168 14.322,19.332 C14.383,19.418 14.403,19.857 14.581,19.762 C14.685,19.707 14.662,19.643 14.791,19.694 C14.853,19.716 14.926,19.605 14.953,19.713 C14.977,19.797 14.995,19.778 15.068,19.818 C15.126,19.849 15.122,19.926 15.122,19.981 C15.122,20.048 15.126,20.128 15.209,20.143 C15.282,20.154 15.264,20.239 15.275,20.290 C15.324,20.513 15.636,20.316 15.680,20.474 C15.690,20.516 15.696,20.558 15.742,20.576 C15.769,20.587 15.805,20.589 15.822,20.615 C15.872,20.684 15.867,20.724 15.971,20.748 C16.100,20.779 16.305,20.742 16.402,20.647 C16.445,20.607 16.462,20.511 16.517,20.489 C16.582,20.462 16.658,20.569 16.672,20.615 C16.701,20.697 16.704,20.766 16.782,20.821 C16.859,20.873 16.929,20.924 16.970,21.010 C17.069,21.214 16.835,21.365 16.915,21.558 C16.933,21.602 16.965,21.640 16.999,21.671 C16.992,21.691 16.976,21.733 16.997,21.752 C17.049,21.797 17.112,21.695 17.148,21.757 C17.247,21.936 17.013,22.016 16.902,22.085 C16.780,22.162 16.834,22.357 16.848,22.471 C16.943,22.466 17.021,22.378 17.121,22.377 C17.267,22.377 17.152,22.579 17.100,22.623 C16.986,22.715 16.789,22.739 16.654,22.675 C16.613,22.657 16.535,22.604 16.507,22.670 C16.478,22.734 16.417,22.792 16.462,22.865 C16.537,22.992 16.747,22.945 16.780,23.118 C16.801,23.237 16.622,23.313 16.749,23.391 C16.848,23.452 16.888,23.532 16.951,23.621 C17.028,23.732 17.170,23.521 17.220,23.656 C17.197,23.574 17.307,23.599 17.351,23.590 C17.414,23.579 17.463,23.523 17.481,23.464 C17.515,23.357 17.380,23.306 17.310,23.257 C17.251,23.215 17.262,23.186 17.310,23.140 C17.278,23.058 17.195,23.023 17.147,22.954 C17.085,22.865 17.127,22.721 17.217,22.664 C17.359,22.573 17.493,22.787 17.627,22.812 C17.778,22.841 17.946,22.805 18.071,22.914 C18.184,23.011 18.241,23.149 18.382,23.220 C18.443,23.251 18.506,23.268 18.518,23.344 C18.531,23.430 18.619,23.393 18.676,23.450 C18.714,23.486 18.718,23.543 18.777,23.557 C18.676,23.681 18.563,23.796 18.435,23.894 C18.329,23.976 18.211,24.051 18.144,24.169 C18.008,24.412 18.117,24.716 17.950,24.949 C17.808,25.150 17.592,25.250 17.520,25.498 C17.454,25.725 17.395,25.931 17.161,26.044 C16.893,26.172 16.582,26.210 16.289,26.239 C16.012,26.265 15.724,26.268 15.485,26.429 C15.262,26.578 15.043,26.706 14.764,26.706 C14.698,26.706 14.633,26.702 14.567,26.697 C14.511,26.739 14.475,26.799 14.421,26.842 C14.313,26.930 14.187,26.821 14.085,26.782 C14.101,26.815 14.105,26.848 14.096,26.883 C14.044,26.862 13.988,26.912 13.939,26.873 C13.896,26.842 13.871,26.790 13.813,26.779 C13.679,26.755 13.596,26.819 13.465,26.733 C13.274,26.609 13.078,26.627 12.855,26.598 C12.625,26.567 12.397,26.516 12.172,26.451 C11.769,26.336 11.334,26.207 10.968,26.001 C10.797,25.906 10.621,25.778 10.560,25.587 C10.534,25.512 10.556,25.416 10.529,25.345 C10.511,25.299 10.315,25.279 10.267,25.263 C10.162,25.228 9.925,25.244 9.972,25.088 C10.004,24.977 10.148,25.017 10.234,25.009 C10.403,24.995 10.387,24.822 10.285,24.732 C10.193,24.650 9.992,24.616 10.000,24.472 C10.011,24.326 10.107,24.022 9.911,23.964 C9.763,23.920 9.621,23.900 9.569,23.750 C9.542,23.670 9.472,23.616 9.441,23.532 C9.409,23.450 9.316,23.371 9.235,23.339 C9.179,23.315 9.024,23.342 9.003,23.278 C8.987,23.229 8.970,23.165 8.972,23.115 C8.983,22.940 9.218,23.211 9.285,23.211 C9.423,23.207 9.547,23.036 9.452,22.920 C9.494,22.900 9.569,22.909 9.589,22.858 C9.542,22.848 9.445,22.892 9.416,22.834 C9.387,22.777 9.449,22.699 9.400,22.648 C9.357,22.601 9.280,22.657 9.226,22.652 C9.161,22.646 9.265,22.577 9.262,22.553 C9.186,22.551 9.123,22.617 9.058,22.644 C8.999,22.672 8.936,22.688 8.877,22.715 C8.825,22.679 8.897,22.626 8.922,22.601 C8.978,22.548 8.943,22.490 8.922,22.431 C9.051,22.440 9.055,22.347 8.979,22.269 C8.880,22.169 8.925,22.096 8.880,21.981 C8.828,21.848 8.746,21.919 8.699,22.001 C8.611,22.152 8.525,21.963 8.483,22.003 C8.444,21.888 8.356,21.828 8.258,21.761 C8.170,21.702 8.158,21.597 8.097,21.518 C8.023,21.425 7.897,21.391 7.836,21.285 C7.780,21.189 7.755,21.076 7.680,20.990 C7.635,20.939 7.295,20.673 7.507,20.618 ZM8.787,22.989 C8.819,22.987 8.868,23.022 8.857,23.053 L8.843,23.067 C8.857,23.073 8.868,23.078 8.871,23.094 C8.819,23.100 8.827,23.167 8.807,23.202 C8.724,23.202 8.685,23.116 8.721,23.053 C8.731,23.031 8.758,22.991 8.787,22.989 ZM24.510,20.174 C24.490,20.126 24.542,20.112 24.566,20.075 C24.594,20.033 24.580,19.982 24.647,19.984 C24.675,19.986 24.679,19.993 24.704,19.984 C24.729,19.977 24.758,19.955 24.781,19.942 C24.796,20.002 24.814,20.039 24.843,20.090 C24.871,20.139 24.852,20.181 24.819,20.223 C24.796,20.250 24.773,20.281 24.737,20.292 C24.697,20.307 24.638,20.312 24.634,20.258 C24.631,20.258 24.625,20.258 24.621,20.256 C24.623,20.252 24.625,20.250 24.627,20.247 L24.618,20.258 C24.584,20.241 24.524,20.210 24.510,20.174 ZM24.501,21.961 C24.438,22.069 24.310,22.100 24.213,22.160 C24.127,22.216 24.075,22.304 23.990,22.360 C23.857,22.449 23.538,22.719 23.383,22.666 C23.368,22.568 23.539,22.466 23.609,22.418 C23.663,22.382 23.687,22.336 23.726,22.295 C23.785,22.236 23.856,22.205 23.897,22.121 C23.951,22.012 23.849,21.817 23.942,21.746 C24.014,21.693 24.048,21.761 24.122,21.739 C24.167,21.724 24.194,21.691 24.217,21.666 C24.287,21.562 24.233,21.373 24.104,21.345 C24.138,21.240 24.345,21.061 24.471,21.103 C24.460,21.148 24.426,21.207 24.449,21.263 C24.544,21.258 24.639,21.123 24.621,21.032 C24.612,20.992 24.566,20.934 24.526,20.915 C24.434,20.879 24.433,20.941 24.377,20.961 C24.260,21.005 24.127,20.992 24.003,21.048 C23.884,21.099 23.811,21.147 23.670,21.123 C23.660,21.107 23.660,21.090 23.670,21.076 C23.701,21.079 23.748,21.061 23.778,21.066 C23.785,20.997 23.917,20.955 23.978,20.924 C24.003,20.910 24.052,20.886 24.071,20.875 C24.096,20.859 24.138,20.821 24.161,20.808 C24.251,20.751 24.409,20.573 24.524,20.569 C24.560,20.667 24.616,20.740 24.733,20.722 C24.789,20.711 24.810,20.718 24.837,20.637 C24.855,20.584 24.859,20.533 24.821,20.487 C25.037,20.498 24.897,20.321 25.028,20.232 C25.096,20.288 25.143,20.212 25.217,20.234 C25.220,20.250 25.224,20.265 25.227,20.281 C25.247,20.272 25.287,20.278 25.308,20.259 C25.398,20.421 25.186,20.764 25.105,20.908 C25.053,20.999 24.979,21.074 24.942,21.170 C24.898,21.281 24.920,21.413 24.826,21.496 C24.751,21.562 24.690,21.588 24.623,21.668 C24.587,21.710 24.550,21.728 24.530,21.783 C24.508,21.845 24.537,21.899 24.501,21.961 Z" class="cls-1"/>
+</svg>
deleted file mode 100644
index 9b2d6bc66f21ff97506d6f09497049c5af18e4ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/branding/nightly/content/jar.mn
+++ b/browser/branding/nightly/content/jar.mn
@@ -9,12 +9,11 @@ browser.jar:
   content/branding/about-logo.png                (about-logo.png)
   content/branding/about-logo@2x.png             (about-logo@2x.png)
   content/branding/about-wordmark.svg            (about-wordmark.svg)
   content/branding/icon48.png                    (icon48.png)
   content/branding/icon64.png                    (icon64.png)
   content/branding/icon16.png                    (../default16.png)
   content/branding/icon32.png                    (../default32.png)
   content/branding/icon128.png                   (../mozicon128.png)
-  content/branding/identity-icons-brand.png      (identity-icons-brand.png)
-  content/branding/identity-icons-brand@2x.png   (identity-icons-brand@2x.png)
+  content/branding/identity-icons-brand.svg      (identity-icons-brand.svg)
   content/branding/silhouette-40.svg             (silhouette-40.svg)
   content/branding/aboutDialog.css               (aboutDialog.css)
deleted file mode 100644
index afce613e2fd2d6dedb69c453ea978d9aeb7692ef..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/browser/branding/official/content/identity-icons-brand.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid" width="32" height="32" viewBox="0 0 32 32">
+  <style>
+    .cls-1 {
+      fill: #ff9500;
+      fill-rule: evenodd;
+    }
+  </style>
+  <path d="M26.797,6.125 C26.719,6.050 26.674,6.013 26.674,6.013 C26.715,6.045 26.756,6.082 26.797,6.125 M28.924,21.127 C28.947,20.948 28.949,20.780 28.929,20.626 C28.501,21.359 27.844,22.025 27.228,22.905 C27.980,22.421 28.624,21.866 28.924,21.127 ZM30.097,13.924 C30.082,13.747 30.062,13.570 30.036,13.394 C29.974,12.946 29.875,12.504 29.728,12.076 C29.735,12.102 29.741,12.129 29.747,12.155 C29.737,12.124 29.731,12.107 29.731,12.107 C29.731,12.107 29.614,12.472 29.435,13.070 C29.423,14.290 29.290,15.417 29.094,16.268 C29.419,15.962 29.657,15.599 29.820,15.196 C29.748,15.461 29.649,15.713 29.520,15.947 C29.361,16.217 29.182,16.436 29.009,16.610 C28.821,16.797 28.641,16.932 28.500,17.024 C28.543,16.905 28.585,16.773 28.625,16.631 C28.626,16.629 28.626,16.628 28.627,16.626 C28.637,16.590 28.647,16.552 28.657,16.513 C28.761,16.176 28.854,15.828 28.934,15.474 C29.049,14.961 29.137,14.433 29.192,13.898 C29.300,12.857 29.284,11.787 29.104,10.744 C29.015,10.227 28.886,9.717 28.712,9.220 C28.480,8.559 28.197,8.001 27.916,7.544 C27.895,7.508 27.874,7.472 27.853,7.436 C27.760,7.280 27.665,7.132 27.570,6.994 C27.258,6.543 26.939,6.200 26.674,6.013 C26.715,6.045 26.756,6.082 26.797,6.125 C26.719,6.050 26.674,6.013 26.674,6.013 C26.694,6.035 26.712,6.058 26.732,6.081 C26.682,6.033 26.653,6.008 26.653,6.008 C26.653,6.008 26.682,6.170 26.733,6.456 C25.969,5.218 24.807,4.635 24.807,4.635 C24.807,4.635 24.902,4.945 25.050,5.391 C25.741,5.949 26.345,6.571 26.869,7.227 C26.871,7.238 26.873,7.250 26.875,7.261 C26.905,7.435 26.938,7.624 26.973,7.826 C26.880,7.700 26.782,7.575 26.683,7.451 C25.589,5.958 24.211,4.706 22.611,3.779 C22.625,3.783 22.600,3.776 22.613,3.780 C20.672,2.647 18.429,2.000 16.039,2.000 C12.495,2.000 9.273,3.423 6.880,5.744 C6.814,5.809 7.271,6.270 7.404,6.311 C8.081,6.106 8.838,6.051 9.423,6.120 C9.705,5.897 9.663,5.963 9.961,5.769 L9.964,5.772 C11.767,4.606 13.854,3.982 16.035,3.982 C18.042,3.982 19.969,4.510 21.669,5.503 C22.118,5.635 22.683,5.830 23.182,6.091 C22.663,5.187 22.132,4.560 21.761,4.182 C23.311,5.364 24.150,6.425 24.701,7.396 C24.746,7.475 24.789,7.553 24.830,7.631 C24.928,7.816 25.017,7.998 25.099,8.177 C24.570,7.618 23.753,7.042 23.039,6.772 C22.981,6.750 22.924,6.730 22.868,6.712 C22.708,6.662 22.555,6.628 22.414,6.617 C23.550,7.488 25.407,9.978 25.432,13.744 C25.432,13.765 25.432,13.786 25.432,13.807 C25.432,14.010 25.428,14.216 25.417,14.427 C25.207,13.971 24.877,13.340 24.562,12.869 C24.483,12.751 24.405,12.644 24.330,12.551 C24.265,12.471 24.202,12.400 24.143,12.346 C24.479,15.517 24.324,16.750 24.116,17.651 C24.096,17.734 24.077,17.815 24.057,17.894 C24.015,18.058 23.973,18.216 23.934,18.378 C23.920,18.257 23.899,18.145 23.874,18.040 C23.816,17.791 23.735,17.585 23.666,17.424 C23.643,17.372 23.621,17.322 23.603,17.280 C23.603,17.280 23.581,17.854 23.325,18.780 C23.199,19.234 23.018,19.771 22.754,20.367 C22.294,21.408 21.823,21.903 21.501,22.062 C21.397,22.113 21.309,22.129 21.242,22.117 C21.167,22.112 21.126,22.079 21.127,22.076 C21.135,22.001 21.143,21.926 21.146,21.854 C21.150,21.754 21.145,21.662 21.119,21.593 C21.119,21.593 20.862,21.684 20.697,21.924 C20.630,22.020 20.544,22.115 20.431,22.203 C20.411,22.219 20.614,21.936 20.599,21.949 C20.499,22.033 20.392,22.130 20.285,22.245 C20.170,22.368 20.059,22.494 19.954,22.609 C19.699,22.887 19.483,23.095 19.352,23.001 C19.437,22.975 19.513,22.906 19.572,22.818 C19.635,22.726 19.680,22.613 19.699,22.500 C19.544,22.612 19.152,22.914 18.272,23.049 C18.109,23.074 17.707,23.146 17.127,23.121 C16.424,23.090 15.460,22.916 14.345,22.341 C14.578,22.313 14.903,22.241 15.196,22.312 C15.275,22.331 15.352,22.360 15.424,22.405 C15.392,22.369 15.355,22.338 15.315,22.310 C14.933,22.037 14.212,22.084 13.681,21.911 C13.170,21.744 12.503,21.005 12.119,20.631 C12.263,20.667 12.407,20.696 12.551,20.721 C12.652,20.738 12.752,20.753 12.852,20.765 C13.008,20.784 13.164,20.798 13.319,20.805 C14.486,20.856 15.595,20.569 16.313,20.063 C17.285,19.377 17.861,18.876 18.378,18.994 C18.428,19.006 18.476,19.010 18.522,19.010 C18.543,19.010 18.563,19.009 18.583,19.007 C18.867,18.975 19.053,18.730 19.002,18.441 C18.983,18.332 18.931,18.217 18.836,18.104 C18.561,17.778 18.016,17.375 17.274,17.265 C16.935,17.215 16.556,17.226 16.142,17.333 C15.385,17.528 14.711,18.047 13.824,18.051 C13.526,18.053 13.204,17.996 12.846,17.850 C12.759,17.815 12.671,17.774 12.580,17.728 C12.489,17.681 12.877,17.783 12.781,17.725 C12.508,17.621 12.011,17.386 11.888,17.297 C11.868,17.282 12.094,17.339 12.070,17.324 C10.721,16.501 10.809,15.842 10.809,15.435 C10.809,15.270 10.858,15.077 10.953,14.899 C11.046,14.723 11.183,14.563 11.362,14.461 C11.475,14.502 11.562,14.541 11.616,14.567 C11.655,14.586 11.677,14.598 11.677,14.598 C11.677,14.598 11.664,14.576 11.644,14.546 C11.613,14.499 11.565,14.428 11.530,14.386 C11.544,14.381 11.557,14.377 11.571,14.373 C11.665,14.406 11.829,14.468 11.985,14.532 C12.092,14.576 12.195,14.621 12.268,14.659 C12.514,14.786 12.596,14.916 12.596,14.916 C12.596,14.916 12.654,14.879 12.594,14.749 C12.583,14.726 12.560,14.683 12.519,14.630 C12.465,14.561 12.378,14.473 12.239,14.386 C12.244,14.386 12.248,14.385 12.251,14.385 C12.379,14.437 12.514,14.503 12.663,14.590 C12.670,14.555 12.679,14.520 12.687,14.484 C12.688,14.479 12.690,14.475 12.691,14.470 C12.693,14.462 12.695,14.454 12.697,14.446 C12.704,14.416 12.711,14.385 12.718,14.354 C12.730,14.301 12.740,14.245 12.748,14.185 C12.764,14.058 12.768,13.913 12.740,13.731 C12.695,13.446 12.701,13.373 12.632,13.269 C12.573,13.181 12.648,13.142 12.740,13.221 C12.718,13.151 12.687,13.081 12.650,13.010 C12.650,13.009 12.651,13.009 12.651,13.007 C12.659,12.968 12.693,12.919 12.745,12.864 C12.758,12.849 12.774,12.834 12.790,12.818 C12.805,12.803 12.821,12.789 12.839,12.773 C13.359,12.313 14.782,11.539 14.908,11.443 C15.118,11.283 15.332,11.035 15.466,10.750 C15.508,10.672 15.544,10.578 15.571,10.468 C15.606,10.323 15.625,10.149 15.614,9.937 C15.606,9.764 15.537,9.634 14.917,9.568 C14.584,9.533 14.091,9.516 13.362,9.521 C13.335,9.521 13.309,9.521 13.282,9.521 C12.690,9.526 12.305,9.171 12.073,8.833 C12.025,8.759 11.984,8.689 11.946,8.626 C11.895,8.532 11.861,8.448 11.834,8.381 C11.917,8.070 12.028,7.772 12.165,7.489 C12.456,6.890 12.871,6.355 13.419,5.893 C13.468,5.850 13.226,5.921 13.272,5.877 C13.327,5.824 13.669,5.655 13.733,5.618 C13.772,5.595 13.692,5.556 13.557,5.528 C13.549,5.527 13.541,5.525 13.532,5.524 C13.380,5.496 13.167,5.485 12.972,5.527 C12.581,5.610 12.505,5.658 12.303,5.765 C12.385,5.678 12.650,5.540 12.585,5.554 C12.161,5.652 11.661,5.940 11.235,6.251 C11.231,6.211 11.235,6.179 11.243,6.116 C11.042,6.223 10.557,6.609 10.433,6.903 C10.433,6.839 10.433,6.807 10.425,6.736 C10.299,6.856 10.177,6.996 10.065,7.151 C10.055,7.165 10.044,7.178 10.034,7.192 C10.033,7.195 10.031,7.197 10.029,7.199 C9.691,7.112 9.367,7.055 9.056,7.023 C8.305,6.944 7.631,7.012 7.032,7.178 C6.951,7.201 6.871,7.224 6.793,7.250 C6.579,7.089 6.235,6.843 5.692,5.978 C5.659,5.926 5.656,6.097 5.626,6.042 C5.468,5.748 5.327,5.300 5.258,4.892 C5.234,4.750 5.218,4.613 5.214,4.489 C5.214,4.489 5.050,4.588 4.873,4.889 C4.806,5.003 4.737,5.146 4.675,5.324 C4.662,5.361 4.649,5.399 4.637,5.439 C4.596,5.570 4.568,5.648 4.539,5.720 C4.530,5.742 4.556,5.482 4.546,5.502 C4.530,5.537 4.502,5.579 4.472,5.627 C4.431,5.692 4.385,5.769 4.356,5.851 C4.349,5.870 4.343,5.889 4.338,5.909 C4.308,6.034 4.259,6.110 4.239,6.266 C4.238,6.270 4.237,6.273 4.235,6.276 C4.234,6.261 4.233,6.230 4.231,6.200 C4.229,6.152 4.225,6.105 4.218,6.123 C4.118,6.397 4.024,6.712 3.948,7.067 C3.838,7.628 3.726,8.395 3.793,9.368 C3.792,9.403 3.795,9.438 3.797,9.472 C3.800,9.514 3.803,9.555 3.802,9.594 C3.461,10.078 3.239,10.494 3.153,10.699 C3.066,10.873 2.979,11.068 2.893,11.284 C2.564,12.102 2.241,13.234 1.969,14.813 C1.969,14.813 2.200,14.061 2.661,13.210 C2.321,14.282 2.055,15.950 2.211,18.452 C2.215,18.397 2.248,18.101 2.322,17.660 C2.360,17.435 2.408,17.173 2.470,16.885 C2.473,16.950 2.477,17.015 2.482,17.081 C2.497,17.315 2.519,17.556 2.548,17.803 C2.565,17.949 2.585,18.097 2.607,18.248 C2.814,19.617 3.265,21.166 4.197,22.811 C5.154,24.502 7.676,28.430 14.005,29.900 C13.826,29.847 13.665,29.780 13.524,29.710 C13.117,29.508 12.879,29.280 12.879,29.280 C12.879,29.280 13.080,29.346 13.407,29.439 C14.081,29.630 15.290,29.931 16.388,29.990 C16.586,30.000 16.781,30.004 16.968,29.996 C16.428,29.900 16.320,29.631 16.320,29.631 C16.320,29.631 21.233,29.917 23.785,27.837 C23.835,27.796 23.885,27.754 23.934,27.711 C23.938,27.709 23.941,27.708 23.945,27.706 C24.327,27.379 24.606,27.021 24.755,26.675 C24.636,26.734 24.518,26.789 24.403,26.841 C24.025,27.251 23.564,27.586 23.055,27.860 C22.590,27.996 22.118,28.072 21.749,28.108 C21.581,28.124 21.434,28.132 21.319,28.133 C21.594,27.872 21.957,27.681 22.387,27.495 C23.024,27.219 23.811,26.955 24.683,26.496 C24.685,26.495 24.687,26.494 24.689,26.493 C24.741,26.466 24.793,26.437 24.845,26.409 C25.598,25.996 26.410,25.432 27.244,24.585 C28.038,23.779 28.427,23.083 28.643,22.448 C28.703,22.270 28.750,22.097 28.788,21.928 C28.852,21.645 28.893,21.372 28.934,21.104 C28.934,21.103 28.934,21.101 28.934,21.100 C28.934,21.102 28.933,21.103 28.933,21.105 C28.926,21.144 28.918,21.183 28.910,21.221 C28.671,22.267 27.797,22.972 26.794,23.585 C26.608,23.698 26.417,23.808 26.226,23.917 C26.339,23.696 26.459,23.491 26.582,23.294 C26.586,23.289 26.589,23.284 26.592,23.279 C26.590,23.284 26.588,23.288 26.586,23.293 C26.573,23.319 26.561,23.344 26.550,23.367 C26.567,23.339 26.585,23.311 26.603,23.283 C26.798,22.973 27.012,22.669 27.232,22.372 C27.760,21.689 28.278,21.118 28.621,20.490 C28.672,20.397 28.726,20.292 28.782,20.177 C28.803,20.134 28.825,20.090 28.846,20.043 C29.220,19.292 29.607,18.267 29.857,17.120 C29.969,16.606 30.053,16.067 30.097,15.517 C30.138,14.992 30.142,14.457 30.097,13.924 Z" class="cls-1"/>
+</svg>
deleted file mode 100644
index 531ff5dec0cd353a41a0c7799bcefcc47fbcd8d8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/branding/official/content/jar.mn
+++ b/browser/branding/official/content/jar.mn
@@ -8,12 +8,11 @@ browser.jar:
   content/branding/about-logo.png                (about-logo.png)
   content/branding/about-logo@2x.png             (about-logo@2x.png)
   content/branding/about-wordmark.svg            (about-wordmark.svg)
   content/branding/icon48.png                    (icon48.png)
   content/branding/icon64.png                    (icon64.png)
   content/branding/icon16.png                    (../default16.png)
   content/branding/icon32.png                    (../default32.png)
   content/branding/icon128.png                   (../mozicon128.png)
-  content/branding/identity-icons-brand.png      (identity-icons-brand.png)
-  content/branding/identity-icons-brand@2x.png   (identity-icons-brand@2x.png)
+  content/branding/identity-icons-brand.svg      (identity-icons-brand.svg)
   content/branding/silhouette-40.svg             (silhouette-40.svg)
   content/branding/aboutDialog.css               (aboutDialog.css)
deleted file mode 100644
index feba1607a9bb7fa8a5be6f335cdeb32fc3e70636..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
--- /dev/null
+++ b/browser/branding/unofficial/content/identity-icons-brand.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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/. -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid" width="32" height="32" viewBox="0 0 32 32">
+  <style>
+    .cls-1 {
+      fill: #144787;
+      fill-rule: evenodd;
+    }
+  </style>
+  <path d="M15.953,30.000 C8.221,30.000 1.953,23.732 1.953,16.000 C1.953,8.268 8.221,2.000 15.953,2.000 C23.685,2.000 29.953,8.268 29.953,16.000 C29.953,23.732 23.685,30.000 15.953,30.000 ZM16.000,4.000 C9.373,4.000 4.000,9.373 4.000,16.000 C4.000,22.627 9.373,28.000 16.000,28.000 C22.627,28.000 28.000,22.627 28.000,16.000 C28.000,9.373 22.627,4.000 16.000,4.000 ZM27.085,16.311 C27.142,16.652 27.085,17.189 26.942,17.483 C26.885,17.958 26.784,18.470 26.561,18.931 C26.407,19.254 26.189,19.798 25.772,19.846 C25.646,19.858 25.319,20.214 25.283,20.155 C25.208,20.028 25.155,19.869 24.999,19.809 C24.873,19.751 24.990,19.698 24.895,19.643 C24.828,19.607 24.816,19.527 24.803,19.452 C24.756,19.459 24.710,19.469 24.668,19.492 C24.580,19.543 24.528,19.636 24.445,19.693 C24.391,19.671 24.300,19.631 24.307,19.561 C24.235,19.627 24.158,19.762 24.088,19.660 C24.030,19.576 24.071,19.459 24.068,19.367 C24.064,19.275 23.978,19.139 23.883,19.254 C23.816,19.334 23.769,19.345 23.665,19.365 C23.570,19.385 23.496,19.449 23.395,19.450 C23.156,19.456 23.176,19.563 23.117,19.744 C23.063,19.902 22.845,19.920 22.750,20.050 C22.700,20.117 22.549,20.431 22.421,20.318 C22.319,20.227 22.581,19.988 22.581,19.868 C22.581,19.767 22.498,19.709 22.475,19.618 C22.457,19.552 22.479,19.498 22.403,19.463 C22.448,19.376 22.500,19.239 22.455,19.142 C22.398,19.015 22.189,19.130 22.139,19.206 C22.088,19.277 21.964,19.523 21.848,19.374 C21.819,19.341 21.840,19.299 21.785,19.301 C21.747,19.301 21.720,19.325 21.702,19.354 C21.621,19.328 21.652,19.254 21.682,19.199 C21.770,19.040 21.781,18.864 21.900,18.718 C22.026,18.561 22.220,18.468 22.333,18.301 C22.372,18.242 22.441,18.131 22.385,18.064 C22.364,18.038 22.326,18.027 22.313,17.995 C22.297,17.956 22.315,17.913 22.310,17.874 C22.268,17.891 22.222,17.909 22.175,17.894 C22.169,17.851 22.175,17.805 22.164,17.761 C22.108,17.783 22.049,17.851 21.982,17.836 C21.919,17.823 21.927,17.867 21.857,17.865 C21.916,17.772 21.952,17.667 22.015,17.575 C22.051,17.521 22.101,17.473 22.130,17.413 C22.198,17.271 22.058,17.158 22.081,17.020 C22.106,16.863 22.281,16.825 22.417,16.839 C22.554,16.854 22.707,16.980 22.845,16.930 C22.975,16.887 23.014,16.706 22.977,16.590 C22.933,16.460 22.768,16.424 22.779,16.265 C22.784,16.172 22.831,16.089 22.813,15.996 C22.799,15.921 22.761,15.854 22.743,15.779 C22.700,15.598 22.867,15.549 22.923,15.405 C22.951,15.329 22.964,15.138 23.092,15.223 C23.205,15.300 23.158,15.476 23.266,15.564 C23.392,15.670 23.563,15.600 23.690,15.535 C23.796,15.480 23.958,15.425 24.012,15.314 C24.088,15.163 23.947,14.988 24.138,14.892 C24.217,14.853 24.415,14.744 24.505,14.779 C24.587,14.810 24.616,14.902 24.675,14.961 C24.699,14.882 24.731,14.810 24.781,14.748 C24.889,14.613 25.040,14.518 25.035,14.330 C25.082,14.104 25.010,14.119 24.970,13.940 C24.961,13.858 24.888,13.292 25.017,13.315 C25.310,13.366 25.065,12.676 25.022,12.563 C25.008,12.523 24.942,12.470 24.895,12.448 C24.767,12.330 24.692,12.528 24.611,12.454 C24.512,12.332 24.530,12.133 24.515,11.982 C24.490,11.818 24.397,11.698 24.393,11.534 C24.391,11.455 23.924,10.932 24.021,10.856 C24.079,10.823 24.816,10.879 24.776,10.823 C24.654,10.644 24.704,10.469 24.461,10.371 C24.307,10.307 24.204,10.138 24.055,10.065 C23.983,10.030 23.679,9.806 23.937,9.790 C24.106,9.779 23.902,9.526 23.827,9.502 C23.735,9.473 23.742,9.752 23.654,9.509 C23.635,9.469 23.273,9.012 23.264,9.056 C23.252,9.127 23.343,9.225 23.333,9.307 C23.306,9.533 22.982,9.108 22.993,9.125 C22.933,9.059 22.694,8.882 22.666,8.802 C22.671,8.819 22.774,8.629 22.775,8.629 C22.833,8.553 22.774,8.467 22.707,8.398 C22.624,8.314 22.486,8.305 22.473,8.177 C22.471,8.157 22.374,7.979 22.459,7.982 C22.529,7.988 22.754,8.172 22.836,8.210 C23.061,8.314 22.996,8.383 23.128,8.505 C23.313,8.638 23.606,8.799 23.768,8.997 C23.793,9.043 24.122,9.380 24.134,9.252 C24.138,9.209 24.019,8.872 23.971,8.855 C23.971,8.855 23.755,8.580 23.750,8.556 C23.751,8.565 23.408,8.154 23.493,8.168 C23.624,8.192 24.093,8.542 24.064,8.677 C24.044,8.766 24.221,8.830 24.248,8.912 C24.255,8.935 24.567,9.221 24.611,9.241 C24.658,9.263 24.819,9.415 24.855,9.460 C24.920,9.506 24.972,9.462 24.994,9.578 C25.003,9.631 25.087,9.819 25.114,9.855 C25.193,9.961 25.247,10.125 25.294,10.249 C25.360,10.431 25.319,10.633 25.323,10.821 C25.342,10.874 25.233,10.938 25.240,11.005 C25.253,11.111 25.254,11.235 25.269,11.329 C25.283,11.426 25.466,11.679 25.436,11.759 C25.366,11.907 25.416,11.891 25.486,12.027 C25.533,12.120 25.436,12.159 25.479,12.277 C25.296,12.295 25.477,12.379 25.360,12.421 C25.254,12.435 25.222,12.414 25.132,12.483 C25.100,12.506 25.506,13.100 25.580,12.526 C25.600,12.372 25.765,12.220 25.921,12.157 C26.006,12.120 26.087,12.281 26.110,12.120 C26.115,12.075 26.029,11.929 26.071,11.909 C26.155,11.878 26.299,12.539 26.365,12.588 C26.529,12.703 26.642,12.893 26.664,13.093 C26.687,13.325 27.108,13.685 27.021,13.898 C26.960,14.050 26.984,14.494 27.000,14.662 C27.027,14.841 27.085,14.984 27.086,15.176 C27.086,15.280 27.016,15.531 27.063,15.619 C27.169,15.815 27.050,16.103 27.085,16.311 ZM22.142,23.184 C22.112,23.125 22.171,23.051 22.238,23.053 C22.254,23.009 22.333,22.943 22.382,22.954 C22.416,22.963 22.419,23.000 22.453,22.969 C22.486,22.940 22.480,22.892 22.522,22.869 C22.633,22.801 22.687,22.918 22.624,23.003 C22.576,23.067 22.455,23.115 22.380,23.094 C22.284,23.069 22.231,23.151 22.142,23.184 ZM23.207,22.324 C23.239,22.315 23.270,22.260 23.306,22.269 C23.406,22.296 23.298,22.486 23.288,22.537 C23.275,22.612 23.284,22.763 23.169,22.745 L23.178,22.726 C23.171,22.725 23.158,22.726 23.151,22.728 C23.149,22.736 23.142,22.743 23.142,22.745 C23.147,22.701 23.158,22.644 23.137,22.603 C23.111,22.555 23.056,22.544 23.013,22.521 C22.969,22.499 22.959,22.482 22.986,22.442 C23.007,22.409 23.041,22.351 23.077,22.331 C23.117,22.311 23.164,22.338 23.207,22.324 ZM22.843,22.551 C22.923,22.537 22.969,22.582 23.023,22.635 C23.084,22.697 23.040,22.772 22.962,22.794 C22.887,22.818 22.856,22.754 22.786,22.754 C22.784,22.741 22.788,22.725 22.782,22.715 L22.784,22.717 C22.770,22.644 22.750,22.570 22.843,22.551 ZM21.519,24.762 C21.567,24.727 21.846,24.663 21.821,24.594 C21.794,24.527 21.833,24.497 21.894,24.472 C21.932,24.456 21.966,24.405 22.006,24.399 C22.036,24.472 22.031,24.559 22.135,24.559 C22.214,24.559 22.293,24.523 22.355,24.476 C22.432,24.421 22.439,24.330 22.536,24.295 C22.621,24.266 22.687,24.230 22.764,24.186 C22.833,24.148 22.894,24.066 22.975,24.056 C23.014,24.053 23.111,24.047 23.138,24.086 C23.178,24.144 23.007,24.248 22.971,24.277 C22.933,24.308 22.826,24.395 22.905,24.445 C22.964,24.479 23.050,24.417 23.102,24.395 C23.176,24.363 23.259,24.339 23.313,24.275 C23.363,24.217 23.378,24.138 23.448,24.097 C23.536,24.044 23.588,23.991 23.640,23.902 C23.674,23.845 23.670,23.783 23.719,23.732 C23.768,23.678 23.748,23.617 23.778,23.557 C23.830,23.464 23.868,23.572 23.893,23.610 C23.953,23.590 23.971,23.508 24.025,23.473 C24.059,23.452 24.122,23.435 24.138,23.393 C24.152,23.359 24.143,23.326 24.174,23.297 C24.231,23.242 24.357,23.260 24.429,23.226 C24.472,23.206 24.526,23.098 24.578,23.111 C24.487,23.399 24.310,23.603 24.102,23.820 C23.895,24.033 23.706,24.266 23.458,24.435 C23.205,24.609 22.957,24.793 22.680,24.931 C22.405,25.070 22.198,25.292 21.945,25.461 C21.384,25.837 20.791,26.207 20.145,26.425 C19.822,26.536 19.494,26.666 19.162,26.751 C19.054,26.779 18.944,26.802 18.835,26.828 C18.811,26.833 18.676,26.883 18.658,26.872 C18.648,26.848 18.444,26.892 18.414,26.908 C18.301,26.966 18.196,26.992 18.071,26.992 C17.968,26.992 17.857,26.963 17.765,27.012 C17.733,27.030 17.578,27.065 17.628,26.974 C17.655,26.924 17.821,26.954 17.862,26.954 C17.963,26.952 18.056,26.912 18.150,26.879 C18.270,26.839 18.383,26.793 18.504,26.755 C18.570,26.735 18.631,26.724 18.687,26.688 C18.784,26.624 18.892,26.637 18.993,26.598 C19.061,26.573 19.104,26.473 19.201,26.498 C19.250,26.511 19.275,26.533 19.329,26.533 C19.399,26.531 19.370,26.513 19.385,26.462 C19.403,26.392 19.458,26.381 19.487,26.438 C19.525,26.511 19.644,26.394 19.694,26.381 C19.771,26.363 19.759,26.287 19.866,26.290 C19.962,26.296 20.025,26.216 20.116,26.197 C20.163,26.186 20.285,26.190 20.310,26.145 C20.187,26.148 20.064,26.166 19.947,26.214 C19.825,26.263 19.710,26.334 19.579,26.360 C19.457,26.381 19.329,26.369 19.207,26.396 C19.090,26.422 18.986,26.482 18.874,26.520 C18.777,26.555 18.653,26.580 18.556,26.531 C18.448,26.473 18.551,26.391 18.624,26.372 C18.720,26.350 18.836,26.365 18.919,26.305 C18.986,26.258 19.005,26.172 19.025,26.099 C18.982,26.103 18.525,26.137 18.667,26.010 C18.732,25.950 18.835,25.935 18.919,25.917 C19.013,25.897 19.102,25.851 19.201,25.855 C19.324,25.860 19.401,25.950 19.520,25.868 C19.590,25.820 19.647,25.747 19.728,25.716 C19.807,25.684 19.904,25.746 19.976,25.693 C20.039,25.645 20.052,25.567 20.138,25.545 C20.224,25.523 20.384,25.545 20.399,25.418 C20.408,25.352 20.267,25.281 20.230,25.230 C20.183,25.164 20.122,25.079 20.066,25.020 C20.028,24.982 19.915,24.969 19.920,24.904 C19.929,24.802 20.086,24.807 20.156,24.791 C20.266,24.763 20.348,24.703 20.467,24.729 C20.569,24.749 20.647,24.763 20.738,24.703 C20.819,24.650 20.891,24.596 20.986,24.569 C20.943,24.654 20.934,24.754 20.879,24.835 C20.830,24.904 20.749,24.947 20.695,25.015 C20.542,25.206 20.843,25.316 20.879,25.172 C20.897,25.095 20.857,25.039 20.952,24.999 C21.010,24.975 21.102,24.977 21.110,24.907 C21.123,24.820 21.227,24.762 21.312,24.751 C21.400,24.738 21.497,24.663 21.583,24.671 C21.562,24.691 21.508,24.727 21.519,24.762 ZM19.358,6.878 C19.266,7.018 19.200,7.122 19.066,7.232 C18.993,7.294 19.013,7.534 18.871,7.436 C18.822,7.401 18.820,7.388 18.748,7.396 C18.700,7.401 18.649,7.447 18.639,7.487 C18.612,7.492 18.581,7.587 18.547,7.525 C18.527,7.534 18.419,7.572 18.400,7.563 C18.371,7.551 18.347,7.478 18.319,7.454 C18.245,7.394 18.373,7.308 18.310,7.246 C18.263,7.199 18.205,7.193 18.151,7.226 C18.065,7.283 18.029,7.228 17.946,7.244 C17.858,7.261 17.905,7.195 17.891,7.131 C17.853,7.113 17.808,7.117 17.770,7.128 C17.720,7.142 17.736,7.152 17.731,7.173 C17.713,7.157 17.630,7.152 17.618,7.150 C17.610,7.117 17.702,7.062 17.707,7.011 C17.707,6.997 17.689,6.860 17.684,6.855 C17.616,6.805 17.722,6.776 17.761,6.811 C17.806,6.849 17.844,6.778 17.902,6.802 C17.907,6.774 17.799,6.742 17.776,6.738 C17.715,6.729 17.653,6.800 17.589,6.807 C17.567,6.809 17.475,6.842 17.463,6.813 C17.452,6.791 17.468,6.758 17.475,6.738 C17.443,6.711 17.407,6.694 17.364,6.691 C17.299,6.685 17.233,6.705 17.173,6.672 C17.098,6.629 17.057,6.599 16.969,6.585 C16.906,6.574 16.852,6.537 16.843,6.474 C16.834,6.423 16.808,6.293 16.821,6.242 C16.893,6.228 16.846,6.304 16.904,6.308 C16.963,6.312 17.008,6.330 17.067,6.337 C17.118,6.343 17.191,6.377 17.242,6.361 C17.324,6.335 17.348,6.204 17.395,6.193 C17.393,6.175 17.382,6.160 17.366,6.149 C17.404,6.140 17.441,6.128 17.472,6.106 C17.445,6.091 17.382,6.133 17.391,6.075 C17.398,6.033 17.423,5.996 17.429,5.954 C17.438,5.869 17.231,5.867 17.181,5.887 C17.139,5.902 17.102,5.931 17.076,5.967 C17.037,6.025 16.994,6.000 16.925,5.991 C16.938,5.900 16.871,5.883 16.818,5.825 C16.742,5.745 16.690,5.636 16.699,5.528 C16.706,5.439 16.629,5.364 16.690,5.278 C16.785,5.145 17.116,5.151 17.272,5.206 C17.623,5.224 17.968,5.258 18.310,5.355 C18.696,5.464 19.038,5.663 19.417,5.781 C19.597,5.836 19.649,5.934 19.590,6.104 C19.539,6.250 19.669,6.293 19.784,6.333 C19.886,6.372 20.003,6.441 19.955,6.568 C19.913,6.678 19.759,6.701 19.658,6.718 C19.530,6.738 19.430,6.765 19.358,6.878 ZM16.767,16.426 C16.812,16.438 16.868,16.393 16.922,16.404 C16.956,16.411 16.963,16.433 16.990,16.444 C17.021,16.460 17.021,16.460 17.051,16.453 C17.073,16.438 17.096,16.433 17.127,16.449 C17.147,16.462 17.152,16.484 17.179,16.493 C17.218,16.510 17.247,16.493 17.289,16.491 C17.350,16.500 17.377,16.542 17.420,16.482 C17.447,16.426 17.459,16.373 17.526,16.373 C17.578,16.377 17.618,16.400 17.578,16.442 C17.553,16.473 17.535,16.502 17.538,16.551 C17.549,16.590 17.582,16.590 17.610,16.566 C17.643,16.533 17.653,16.473 17.709,16.466 C17.759,16.462 17.804,16.508 17.857,16.511 C17.882,16.513 17.905,16.508 17.932,16.517 C17.961,16.526 17.972,16.539 17.991,16.551 C18.040,16.571 18.076,16.553 18.115,16.577 C18.189,16.632 18.220,16.715 18.277,16.774 C18.311,16.807 18.364,16.817 18.391,16.852 C18.403,16.874 18.409,16.889 18.419,16.903 C18.439,16.914 18.459,16.925 18.473,16.947 C18.500,16.981 18.480,17.011 18.475,17.052 C18.468,17.087 18.484,17.116 18.502,17.153 C18.531,17.195 18.579,17.322 18.489,17.328 C18.466,17.335 18.432,17.335 18.414,17.331 C18.382,17.331 18.400,17.335 18.378,17.315 C18.346,17.291 18.313,17.266 18.283,17.242 C18.238,17.202 18.240,17.145 18.211,17.094 C18.195,17.065 18.162,17.054 18.124,17.038 C18.103,17.020 18.090,17.020 18.060,17.001 C18.033,16.992 18.008,16.998 17.975,16.998 C17.923,16.996 17.849,16.932 17.821,16.890 C17.804,16.861 17.801,16.847 17.767,16.847 C17.742,16.845 17.715,16.867 17.688,16.867 C17.621,16.867 17.571,16.830 17.499,16.848 C17.436,16.865 17.384,16.852 17.314,16.845 C17.240,16.848 17.161,16.836 17.105,16.785 C17.073,16.759 17.055,16.723 17.015,16.699 C16.979,16.692 16.938,16.694 16.911,16.684 C16.848,16.668 16.769,16.655 16.711,16.628 C16.665,16.608 16.636,16.566 16.595,16.535 C16.546,16.506 16.474,16.491 16.424,16.462 C16.379,16.449 16.264,16.422 16.318,16.375 C16.345,16.351 16.406,16.329 16.440,16.327 C16.501,16.336 16.505,16.386 16.546,16.415 C16.578,16.440 16.625,16.429 16.659,16.397 C16.679,16.375 16.674,16.358 16.704,16.377 C16.731,16.386 16.747,16.415 16.767,16.426 ZM16.489,5.335 C16.436,5.355 16.381,5.339 16.325,5.351 C16.325,5.348 16.323,5.342 16.323,5.339 C16.285,5.328 16.242,5.295 16.257,5.253 C16.303,5.233 16.589,5.189 16.598,5.257 C16.604,5.293 16.515,5.324 16.489,5.335 ZM15.832,5.765 C15.861,5.889 15.724,6.033 15.696,6.158 C15.671,6.273 15.550,6.434 15.455,6.505 C15.354,6.581 15.158,6.740 15.027,6.700 C14.950,6.678 14.871,6.658 14.791,6.638 C14.711,6.618 14.644,6.548 14.572,6.530 C14.617,6.417 14.687,6.558 14.741,6.477 C14.747,6.501 14.799,6.523 14.820,6.499 C14.844,6.477 14.822,6.415 14.822,6.388 C14.820,6.319 14.939,6.235 15.002,6.228 C15.047,6.224 15.099,6.226 15.137,6.200 C15.185,6.166 15.223,6.202 15.286,6.186 C15.331,6.177 15.503,6.078 15.480,6.018 C15.392,6.027 15.354,6.018 15.277,6.082 C15.293,6.020 15.419,5.951 15.399,5.894 C15.338,5.896 15.336,5.980 15.279,5.989 C15.223,5.998 15.214,5.892 15.182,5.865 C15.043,5.750 14.982,6.140 14.854,6.107 C14.797,6.093 14.815,6.013 14.732,6.029 C14.630,6.049 14.603,6.122 14.596,6.215 C14.592,6.268 14.500,6.330 14.459,6.379 C14.394,6.457 14.311,6.441 14.236,6.388 C14.171,6.344 14.180,6.242 14.101,6.215 C14.026,6.188 13.929,6.210 13.860,6.250 C13.778,6.297 13.736,6.394 13.657,6.437 C13.583,6.474 13.461,6.461 13.384,6.465 C13.339,6.466 13.136,6.492 13.157,6.397 C13.172,6.330 13.215,6.275 13.138,6.228 C13.098,6.202 13.019,6.153 13.062,6.097 C13.098,6.051 13.175,6.053 13.197,5.996 C13.127,5.958 13.031,5.947 13.035,5.849 C12.924,5.829 12.884,5.927 12.814,5.980 C12.717,6.051 12.773,5.914 12.792,5.882 C12.818,5.838 12.866,5.774 12.915,5.758 C12.965,5.739 12.969,5.690 13.003,5.656 L12.990,5.667 C12.951,5.628 12.933,5.550 12.951,5.499 C12.972,5.437 13.048,5.448 13.100,5.441 C13.256,5.422 13.431,5.288 13.592,5.340 C13.745,5.391 13.848,5.300 14.002,5.306 C14.080,5.308 14.169,5.293 14.247,5.286 C14.329,5.277 14.394,5.227 14.480,5.227 C14.542,5.227 14.680,5.238 14.631,5.328 C14.606,5.377 14.576,5.462 14.673,5.455 C14.800,5.446 14.887,5.264 15.005,5.237 C15.086,5.216 15.045,5.306 15.020,5.335 C15.011,5.344 14.915,5.492 14.993,5.461 C15.011,5.452 15.025,5.439 15.036,5.422 C15.063,5.380 15.111,5.377 15.160,5.364 C15.253,5.339 15.342,5.309 15.431,5.275 C15.604,5.207 15.669,5.282 15.818,5.349 C15.863,5.371 16.160,5.346 16.131,5.441 C16.111,5.504 15.976,5.534 15.920,5.552 C15.789,5.594 15.807,5.648 15.832,5.765 ZM12.967,8.084 C12.936,8.126 12.792,8.137 12.760,8.097 C12.764,8.090 12.767,8.077 12.774,8.072 L12.742,8.086 C12.694,8.134 12.623,8.154 12.557,8.145 C12.559,8.110 12.541,8.057 12.555,8.026 C12.571,7.993 12.614,7.984 12.638,7.957 C12.679,7.908 12.704,7.835 12.753,7.793 C12.807,7.747 12.907,7.731 12.927,7.815 C12.949,7.895 12.868,7.928 12.853,7.991 C12.909,7.988 13.008,8.032 12.967,8.084 ZM12.708,6.525 C12.735,6.534 12.771,6.548 12.803,6.552 C12.783,6.576 12.776,6.609 12.830,6.594 C12.803,6.652 12.746,6.714 12.683,6.731 C12.611,6.749 12.528,6.732 12.474,6.793 C12.386,6.893 12.501,7.060 12.631,7.008 C12.643,7.057 12.607,7.068 12.647,7.084 C12.530,7.226 12.440,7.387 12.298,7.166 C12.165,6.960 11.940,7.117 11.804,7.241 C11.654,7.376 11.638,7.600 11.856,7.676 C11.994,7.725 11.973,7.742 11.870,7.831 C11.917,7.886 11.775,7.937 11.759,8.004 C11.796,7.964 11.874,7.970 11.886,7.906 C11.951,7.917 11.911,7.837 11.960,7.848 C12.082,7.873 11.928,8.001 11.906,8.026 C11.949,8.055 11.998,8.032 12.045,8.032 C12.086,8.032 12.125,8.059 12.165,8.052 C12.221,8.044 12.194,7.999 12.230,7.982 C12.294,7.955 12.253,8.061 12.244,8.073 C12.205,8.130 12.176,8.248 12.109,8.261 C12.048,8.272 12.014,8.283 12.025,8.360 C12.034,8.432 12.057,8.425 12.009,8.502 C11.940,8.606 12.055,8.642 12.071,8.726 C12.088,8.815 12.061,8.791 12.140,8.830 C12.206,8.862 12.273,8.857 12.343,8.868 C12.426,8.879 12.566,8.782 12.537,8.689 C12.523,8.644 12.516,8.620 12.550,8.584 C12.573,8.558 12.640,8.502 12.674,8.544 C12.641,8.498 12.701,8.465 12.708,8.420 C12.715,8.365 12.814,8.374 12.778,8.303 C12.758,8.268 12.638,8.230 12.650,8.210 C12.728,8.201 12.810,8.190 12.884,8.221 C13.003,8.272 13.046,8.471 13.202,8.398 C13.366,8.321 13.483,8.163 13.529,7.995 C13.565,7.860 13.454,7.829 13.350,7.791 C13.287,7.767 13.278,7.727 13.249,7.669 C13.217,7.603 13.342,7.536 13.245,7.521 C13.125,7.501 13.084,7.376 13.209,7.325 C13.267,7.303 13.328,7.317 13.386,7.301 C13.438,7.286 13.458,7.144 13.506,7.228 C13.510,7.166 13.666,7.232 13.715,7.228 C13.783,7.223 13.729,7.164 13.790,7.172 C13.830,7.179 13.855,7.217 13.894,7.221 C13.948,7.226 13.947,7.181 13.984,7.162 C14.035,7.141 14.069,7.210 14.110,7.219 C14.155,7.228 14.202,7.261 14.249,7.239 C14.283,7.223 14.342,7.197 14.349,7.261 C14.362,7.348 14.405,7.403 14.414,7.478 C14.423,7.552 14.601,7.554 14.489,7.653 C14.425,7.709 14.358,7.815 14.263,7.786 C14.204,7.769 14.216,7.798 14.162,7.831 C14.114,7.860 14.107,7.913 14.063,7.917 C13.925,7.930 14.083,8.044 14.078,8.110 C14.072,8.166 14.112,8.194 14.114,8.245 C14.117,8.301 14.071,8.361 14.063,8.418 C14.051,8.503 14.216,8.647 14.263,8.718 C14.344,8.841 14.425,8.955 14.560,9.026 C14.644,9.070 14.684,9.165 14.763,9.216 C14.802,9.241 14.862,9.225 14.863,9.274 C14.863,9.320 14.858,9.371 14.874,9.416 C14.894,9.478 15.023,9.487 15.079,9.487 C15.088,9.588 15.235,9.480 15.279,9.469 C15.180,9.584 15.104,9.693 14.986,9.793 C14.930,9.839 14.865,9.899 14.790,9.910 C14.725,9.921 14.673,9.883 14.619,9.939 C14.576,9.983 14.585,10.052 14.543,10.100 C14.504,10.145 14.421,10.152 14.371,10.191 C14.347,10.207 14.112,10.371 14.128,10.251 C14.133,10.209 14.160,10.176 14.169,10.136 C14.182,10.080 14.117,10.076 14.092,10.049 C14.049,10.003 14.020,10.038 14.008,9.957 C14.000,9.912 13.986,9.861 13.945,9.832 C13.876,9.784 13.898,9.786 13.866,9.708 C13.840,9.646 13.781,9.606 13.758,9.546 C13.700,9.404 13.716,9.256 13.616,9.127 C13.612,9.178 13.652,9.220 13.635,9.260 C13.619,9.303 13.632,9.373 13.657,9.411 C13.569,9.404 13.513,9.376 13.450,9.316 C13.422,9.291 13.328,9.200 13.289,9.254 C13.337,9.249 13.441,9.394 13.504,9.425 C13.648,9.497 13.648,9.548 13.587,9.695 C13.646,9.706 13.736,9.655 13.776,9.724 C13.812,9.786 13.756,9.854 13.864,9.852 C13.848,9.996 13.706,10.089 13.698,10.234 C13.693,10.316 13.725,10.386 13.698,10.469 C13.670,10.557 13.600,10.633 13.506,10.659 C13.276,10.721 13.175,10.484 13.094,10.331 C13.060,10.267 12.974,10.209 12.898,10.245 C12.868,10.260 12.855,10.293 12.825,10.307 C12.767,10.336 12.706,10.322 12.652,10.362 C12.587,10.409 12.551,10.495 12.469,10.521 C12.418,10.537 12.350,10.521 12.307,10.553 C12.280,10.573 12.273,10.608 12.271,10.639 C12.235,10.646 12.208,10.670 12.185,10.697 C12.136,10.754 12.041,10.790 12.003,10.847 C11.951,10.923 12.066,10.992 12.057,11.069 C12.052,11.115 11.976,11.231 11.940,11.244 C11.777,11.300 11.894,11.463 11.937,11.554 C11.946,11.572 11.953,11.597 11.929,11.610 C11.890,11.634 11.904,11.650 11.929,11.698 C11.971,11.776 12.037,11.836 12.106,11.893 C12.163,11.938 12.289,11.965 12.305,12.031 C12.334,12.149 12.251,12.244 12.185,12.335 C12.133,12.406 12.091,12.488 12.055,12.568 C12.037,12.607 12.037,12.707 12.001,12.731 C11.852,12.829 11.879,12.435 11.707,12.526 C11.600,12.583 11.572,12.751 11.439,12.767 C11.370,12.776 11.343,12.705 11.334,12.652 C11.297,12.652 11.253,12.649 11.219,12.630 C11.140,12.592 11.192,12.567 11.210,12.512 C11.237,12.425 11.327,12.435 11.392,12.390 C11.475,12.332 11.396,12.281 11.397,12.211 C11.336,12.204 11.286,12.111 11.252,12.069 C11.183,11.989 11.117,11.987 11.018,11.985 C10.975,11.985 10.941,11.956 10.905,11.936 C10.892,11.985 10.712,11.934 10.651,11.965 C10.596,11.995 10.518,12.162 10.603,12.180 C10.572,12.250 10.491,12.328 10.502,12.405 C10.506,12.430 10.551,12.415 10.515,12.454 C10.486,12.483 10.480,12.526 10.473,12.565 C10.443,12.740 10.491,12.900 10.538,13.064 C10.459,13.084 10.383,13.122 10.310,13.162 C10.367,13.091 10.302,12.973 10.204,13.004 C10.204,13.039 10.191,13.071 10.177,13.100 C10.119,13.113 10.080,13.111 10.053,13.062 C10.015,12.993 10.056,13.013 10.087,12.960 C10.150,12.851 10.011,12.709 9.956,12.836 C9.952,12.725 9.761,12.548 9.729,12.762 C9.720,12.829 9.758,12.958 9.628,12.915 C9.571,12.896 9.510,12.771 9.499,12.716 C9.490,12.820 9.603,12.873 9.585,12.960 C9.576,13.009 9.481,13.090 9.441,13.126 C9.508,13.124 9.580,13.120 9.645,13.130 C9.643,13.179 9.601,13.206 9.601,13.268 C9.589,13.270 9.576,13.274 9.565,13.275 C9.610,13.332 9.574,13.414 9.558,13.476 C9.537,13.472 9.502,13.485 9.481,13.483 C9.477,13.518 9.463,13.538 9.434,13.529 C9.438,13.540 9.436,13.549 9.431,13.558 C9.420,13.567 9.407,13.567 9.396,13.560 C9.396,13.543 9.386,13.518 9.387,13.501 C9.334,13.552 9.305,13.470 9.245,13.481 C9.236,13.567 9.244,13.651 9.125,13.625 C9.078,13.616 8.979,13.507 8.934,13.520 C8.915,13.525 8.902,13.552 8.893,13.583 C8.871,13.574 8.846,13.569 8.818,13.567 C8.728,13.560 8.663,13.642 8.555,13.629 C8.435,13.614 8.418,13.629 8.320,13.698 C8.233,13.760 8.172,13.685 8.086,13.669 C8.028,13.658 7.971,13.656 7.915,13.640 C7.892,13.633 7.863,13.620 7.849,13.600 C7.822,13.560 7.726,13.569 7.676,13.563 C7.466,13.545 7.257,13.549 7.070,13.658 C6.928,13.742 6.752,13.875 6.723,14.046 C6.676,14.327 7.052,14.356 7.218,14.476 C7.431,14.629 6.987,14.759 6.881,14.797 C6.756,14.841 6.632,14.901 6.536,14.995 C6.461,15.068 6.412,15.243 6.277,15.185 C6.087,15.101 5.939,14.870 5.832,14.704 C5.745,14.664 5.666,14.383 5.655,14.294 C5.648,14.239 5.549,14.061 5.627,14.046 C5.643,14.001 5.601,13.953 5.583,13.917 C5.549,13.846 5.571,13.762 5.540,13.687 C5.508,13.611 5.630,13.479 5.614,13.385 C5.607,13.345 5.574,13.326 5.609,13.286 C5.652,13.233 5.659,13.195 5.670,13.130 C5.690,13.022 5.817,13.031 5.846,12.936 C5.855,12.909 5.857,12.856 5.893,12.847 C5.965,12.829 5.884,12.953 5.921,12.982 C5.923,12.884 5.956,12.789 5.956,12.687 C5.956,12.567 5.977,12.448 5.995,12.330 C6.008,12.239 6.024,12.146 6.065,12.064 C6.094,12.011 6.099,11.832 5.990,11.918 C5.986,11.721 5.988,11.524 6.024,11.331 C6.065,11.107 6.164,10.910 6.267,10.710 C6.466,10.324 6.626,9.908 6.869,9.546 C6.987,9.369 7.126,9.207 7.246,9.030 C7.309,8.934 7.378,8.841 7.426,8.737 C7.471,8.640 7.548,8.585 7.620,8.507 C7.750,8.369 7.854,8.237 8.009,8.119 C8.075,8.068 8.149,7.973 8.242,7.995 C8.345,8.017 8.375,7.937 8.449,7.889 C8.447,7.953 8.460,8.001 8.451,8.066 C8.508,8.004 8.546,7.917 8.598,7.849 C8.672,7.758 8.756,7.676 8.857,7.612 C8.895,7.587 8.920,7.547 8.960,7.523 C8.990,7.507 9.026,7.509 9.057,7.492 C9.093,7.470 9.316,7.357 9.283,7.319 C9.157,7.168 8.710,7.729 8.578,7.704 C8.573,7.633 8.758,7.538 8.809,7.503 C8.956,7.405 9.096,7.277 9.236,7.168 C9.384,7.053 9.533,6.931 9.691,6.829 C9.765,6.783 9.846,6.751 9.914,6.698 C9.963,6.661 10.017,6.589 10.089,6.598 C10.081,6.747 10.202,6.612 10.259,6.598 C10.400,6.563 10.547,6.463 10.678,6.404 C10.761,6.366 11.435,5.923 11.466,6.046 C11.529,6.053 11.561,5.965 11.640,5.978 C11.743,5.993 11.807,5.947 11.890,5.894 C12.027,5.805 12.172,5.716 12.312,5.632 C12.366,5.601 12.415,5.594 12.406,5.672 C12.400,5.719 12.303,5.739 12.269,5.759 C12.206,5.798 12.160,5.854 12.122,5.916 C12.064,6.007 11.985,6.080 11.920,6.168 C11.985,6.182 12.016,6.128 12.071,6.109 C12.140,6.089 12.154,6.142 12.224,6.098 C12.257,6.080 12.289,6.104 12.316,6.115 C12.356,6.131 12.365,6.106 12.397,6.093 C12.444,6.075 12.499,6.169 12.562,6.171 C12.758,6.171 12.357,6.397 12.553,6.426 C12.636,6.437 12.631,6.497 12.708,6.525 ZM12.925,6.519 C12.893,6.521 12.868,6.543 12.836,6.550 C12.827,6.552 12.814,6.552 12.803,6.552 C12.810,6.543 12.819,6.536 12.827,6.532 C12.857,6.519 12.893,6.517 12.925,6.519 ZM7.191,20.631 C7.273,20.622 7.280,20.739 7.342,20.770 C7.342,20.762 7.343,20.759 7.345,20.753 C7.390,20.788 7.412,20.824 7.421,20.882 C7.430,20.954 7.448,20.992 7.473,21.057 C7.491,21.103 7.494,21.205 7.426,21.221 C7.365,21.234 7.349,21.156 7.307,21.128 C7.200,21.057 7.047,21.183 7.002,20.999 C6.984,20.928 6.993,20.881 6.943,20.819 C6.903,20.770 6.860,20.739 6.896,20.671 C6.950,20.571 7.122,20.522 7.191,20.631 ZM7.360,20.726 C7.356,20.737 7.351,20.744 7.345,20.753 C7.340,20.748 7.334,20.744 7.329,20.740 L7.360,20.726 ZM7.298,20.467 C7.237,20.411 7.275,20.221 7.370,20.301 C7.410,20.332 7.426,20.425 7.405,20.462 C7.378,20.507 7.322,20.527 7.298,20.467 ZM7.521,14.913 C7.548,14.895 7.548,14.870 7.565,14.848 C7.588,14.815 7.606,14.817 7.636,14.830 C7.647,14.835 7.660,14.848 7.676,14.842 C7.699,14.833 7.678,14.824 7.694,14.819 C7.751,14.766 7.748,14.850 7.746,14.893 C7.748,14.943 7.768,14.928 7.795,14.952 C7.818,14.970 7.798,14.984 7.805,15.008 C7.814,15.030 7.843,15.037 7.861,15.065 C7.881,15.090 7.870,15.112 7.856,15.141 C7.805,15.218 7.705,15.178 7.640,15.141 C7.611,15.134 7.574,15.105 7.550,15.088 C7.527,15.072 7.496,15.057 7.473,15.041 C7.444,15.034 7.403,15.014 7.410,14.986 C7.412,14.968 7.458,14.935 7.475,14.930 L7.521,14.913 ZM16.778,18.530 C16.859,18.576 16.931,18.607 17.024,18.572 C17.107,18.539 17.164,18.488 17.260,18.497 C17.373,18.507 17.386,18.572 17.425,18.658 C17.486,18.789 17.698,18.758 17.670,18.940 C17.520,19.022 17.664,19.144 17.704,19.248 C17.724,19.301 17.720,19.359 17.722,19.416 C17.722,19.458 17.738,19.529 17.704,19.561 C17.673,19.591 17.603,19.591 17.564,19.600 C17.510,19.614 17.458,19.642 17.402,19.649 C17.305,19.664 17.229,19.600 17.141,19.667 C17.107,19.693 17.082,19.725 17.042,19.746 C16.997,19.767 16.942,19.775 16.893,19.786 C16.846,19.797 16.791,19.815 16.744,19.795 C16.706,19.778 16.688,19.736 16.652,19.716 C16.564,19.665 16.427,19.756 16.341,19.784 C16.273,19.806 16.147,19.875 16.075,19.840 C15.971,19.789 16.116,19.654 16.145,19.600 C16.190,19.510 16.170,19.410 16.192,19.315 C16.154,19.312 16.149,19.283 16.118,19.270 C16.107,19.264 16.080,19.266 16.068,19.263 C16.053,19.261 16.039,19.252 16.025,19.248 C16.019,19.292 15.949,19.334 15.951,19.272 C15.931,19.266 15.915,19.261 15.897,19.255 C15.899,19.219 15.965,19.099 16.010,19.100 L15.998,19.090 C16.111,18.986 16.235,18.865 16.391,18.833 C16.463,18.816 16.551,18.791 16.602,18.732 C16.659,18.667 16.589,18.596 16.607,18.523 C16.627,18.439 16.729,18.503 16.778,18.530 ZM17.698,17.537 C17.704,17.564 17.756,17.581 17.754,17.605 C17.754,17.616 17.691,17.621 17.680,17.621 C17.646,17.632 17.610,17.632 17.582,17.648 C17.560,17.659 17.542,17.676 17.519,17.687 C17.432,17.725 17.497,17.597 17.497,17.552 C17.502,17.512 17.465,17.406 17.504,17.366 L17.499,17.339 C17.499,17.315 17.488,17.293 17.506,17.266 C17.511,17.247 17.546,17.237 17.564,17.220 C17.587,17.209 17.610,17.176 17.632,17.198 C17.644,17.209 17.650,17.227 17.650,17.238 C17.666,17.255 17.684,17.273 17.695,17.295 C17.700,17.322 17.700,17.357 17.688,17.379 C17.682,17.419 17.693,17.430 17.698,17.468 C17.698,17.492 17.688,17.513 17.698,17.537 ZM18.757,18.490 C18.745,18.519 18.682,18.516 18.649,18.510 C18.631,18.510 18.613,18.510 18.595,18.494 C18.576,18.476 18.590,18.446 18.561,18.452 C18.536,18.448 18.522,18.477 18.493,18.481 C18.482,18.485 18.461,18.474 18.446,18.485 C18.376,18.497 18.414,18.514 18.407,18.563 C18.405,18.607 18.355,18.636 18.369,18.678 C18.378,18.718 18.407,18.767 18.425,18.802 C18.486,18.955 18.277,18.829 18.232,18.791 C18.186,18.760 18.141,18.740 18.133,18.683 C18.117,18.640 18.121,18.598 18.115,18.552 C18.107,18.441 18.141,18.333 18.151,18.224 C18.153,18.164 18.139,18.120 18.130,18.064 C18.115,18.022 18.076,17.982 18.119,17.949 C18.146,17.891 18.130,17.861 18.115,17.801 C18.099,17.759 18.092,17.738 18.087,17.692 C18.096,17.581 18.015,17.508 17.988,17.397 C17.977,17.348 18.000,17.298 18.060,17.326 L18.103,17.346 C18.119,17.371 18.115,17.395 18.141,17.399 C18.177,17.415 18.263,17.349 18.286,17.397 C18.293,17.417 18.272,17.424 18.279,17.446 C18.288,17.468 18.310,17.477 18.324,17.484 C18.367,17.504 18.405,17.523 18.416,17.572 C18.416,17.590 18.409,17.603 18.425,17.628 C18.443,17.646 18.461,17.645 18.479,17.645 C18.531,17.652 18.588,17.643 18.610,17.688 C18.648,17.741 18.569,17.739 18.565,17.783 C18.561,17.825 18.603,17.852 18.624,17.882 C18.648,17.909 18.680,17.951 18.689,17.989 C18.700,18.040 18.664,18.058 18.666,18.111 C18.658,18.160 18.736,18.188 18.714,18.250 C18.700,18.295 18.658,18.346 18.676,18.399 C18.696,18.435 18.772,18.445 18.757,18.490 ZM7.507,20.618 C7.588,20.596 7.665,20.660 7.744,20.642 C7.827,20.624 7.852,20.527 7.859,20.458 C7.892,20.498 7.935,20.489 7.964,20.527 C7.994,20.573 8.061,20.580 8.106,20.602 C8.125,20.545 8.077,20.452 8.079,20.391 C8.079,20.356 8.045,20.288 8.055,20.263 C8.079,20.205 8.188,20.155 8.244,20.137 C8.311,20.115 8.390,20.165 8.449,20.190 C8.508,20.216 8.573,20.201 8.634,20.188 C8.665,20.181 8.697,20.177 8.729,20.176 C8.737,20.148 8.751,20.123 8.773,20.103 C8.819,20.055 8.873,20.075 8.924,20.101 C9.021,20.146 9.100,19.953 9.118,19.873 C9.141,19.771 9.152,19.580 9.123,19.478 C9.091,19.359 9.062,19.325 9.172,19.266 C9.195,19.255 9.202,19.228 9.213,19.203 C9.121,19.037 9.073,18.856 9.166,18.701 C9.242,18.574 9.409,18.461 9.359,18.322 C9.443,18.330 9.529,18.337 9.616,18.344 C9.751,18.169 9.950,18.047 10.166,18.011 C10.292,17.871 10.493,17.721 10.644,17.834 C10.693,17.871 10.723,17.929 10.779,17.956 C10.833,17.982 10.896,17.971 10.955,17.969 C11.164,17.964 11.370,18.100 11.448,18.297 C11.397,18.359 11.349,18.421 11.298,18.483 C11.360,18.711 11.712,18.793 11.849,18.601 C11.940,18.476 11.946,18.270 12.089,18.219 C12.161,18.193 12.244,18.219 12.323,18.246 C12.325,18.244 12.325,18.244 12.327,18.242 C12.329,18.242 12.329,18.248 12.329,18.248 C12.395,18.270 12.462,18.292 12.516,18.290 C12.530,18.266 12.532,18.257 12.548,18.230 C12.546,18.231 12.564,18.255 12.568,18.264 C12.586,18.255 12.605,18.257 12.618,18.237 C12.672,18.162 12.627,18.051 12.661,17.965 C12.694,17.885 12.782,17.887 12.857,17.920 C12.909,17.814 12.960,17.712 13.028,17.566 C13.062,17.492 13.033,17.869 12.981,18.242 C12.987,18.246 12.983,18.255 12.990,18.259 C13.031,18.271 13.073,18.237 13.102,18.202 C13.170,18.118 13.220,18.016 13.307,17.949 C13.364,17.903 13.440,17.896 13.508,17.913 C13.538,17.865 13.571,17.809 13.587,17.805 C13.682,17.783 13.756,17.745 13.853,17.781 C13.936,17.814 14.004,17.880 14.090,17.902 C14.148,17.916 14.256,17.914 14.286,17.976 C14.310,18.027 14.351,18.027 14.412,18.044 C14.437,18.051 14.489,18.053 14.491,18.089 C14.488,18.109 14.477,18.113 14.457,18.100 C14.464,18.155 14.534,18.153 14.574,18.169 C14.648,18.200 14.709,18.250 14.772,18.295 C14.894,18.384 14.978,18.514 15.070,18.632 C15.093,18.663 15.196,18.783 15.153,18.825 C15.126,18.853 15.068,18.847 15.034,18.864 C14.978,18.889 14.898,18.920 14.849,18.955 C14.804,18.986 14.784,19.039 14.739,19.066 C14.617,19.139 14.518,18.955 14.452,18.900 C14.362,18.825 14.400,18.691 14.328,18.630 C14.213,18.530 14.056,18.485 13.921,18.419 C13.848,18.383 13.767,18.355 13.704,18.301 C13.661,18.262 13.619,18.219 13.560,18.206 C13.560,18.206 13.558,18.208 13.558,18.210 C13.528,18.322 13.670,18.374 13.742,18.426 C13.830,18.490 13.851,18.587 13.894,18.678 C13.945,18.783 14.027,18.871 14.103,18.958 C14.137,18.995 14.182,19.022 14.205,19.068 C14.227,19.111 14.207,19.161 14.238,19.201 C14.090,19.259 13.963,18.947 13.878,18.876 C13.844,18.845 13.774,18.809 13.727,18.827 C13.700,18.880 13.653,18.949 13.691,18.991 C13.722,19.024 13.718,19.075 13.734,19.115 C13.752,19.161 13.790,19.210 13.815,19.252 C13.846,19.299 13.900,19.319 13.930,19.367 C13.950,19.399 13.959,19.436 13.975,19.469 C14.002,19.525 14.080,19.622 14.153,19.580 C14.234,19.534 14.204,19.168 14.322,19.332 C14.383,19.418 14.403,19.857 14.581,19.762 C14.685,19.707 14.662,19.643 14.791,19.694 C14.853,19.716 14.926,19.605 14.953,19.713 C14.977,19.797 14.995,19.778 15.068,19.818 C15.126,19.849 15.122,19.926 15.122,19.981 C15.122,20.048 15.126,20.128 15.209,20.143 C15.282,20.154 15.264,20.239 15.275,20.290 C15.324,20.513 15.636,20.316 15.680,20.474 C15.690,20.516 15.696,20.558 15.742,20.576 C15.769,20.587 15.805,20.589 15.822,20.615 C15.872,20.684 15.867,20.724 15.971,20.748 C16.100,20.779 16.305,20.742 16.402,20.647 C16.445,20.607 16.462,20.511 16.517,20.489 C16.582,20.462 16.658,20.569 16.672,20.615 C16.701,20.697 16.704,20.766 16.782,20.821 C16.859,20.873 16.929,20.924 16.970,21.010 C17.069,21.214 16.835,21.365 16.915,21.558 C16.933,21.602 16.965,21.640 16.999,21.671 C16.992,21.691 16.976,21.733 16.997,21.752 C17.049,21.797 17.112,21.695 17.148,21.757 C17.247,21.936 17.013,22.016 16.902,22.085 C16.780,22.162 16.834,22.357 16.848,22.471 C16.943,22.466 17.021,22.378 17.121,22.377 C17.267,22.377 17.152,22.579 17.100,22.623 C16.986,22.715 16.789,22.739 16.654,22.675 C16.613,22.657 16.535,22.604 16.507,22.670 C16.478,22.734 16.417,22.792 16.462,22.865 C16.537,22.992 16.747,22.945 16.780,23.118 C16.801,23.237 16.622,23.313 16.749,23.391 C16.848,23.452 16.888,23.532 16.951,23.621 C17.028,23.732 17.170,23.521 17.220,23.656 C17.197,23.574 17.307,23.599 17.351,23.590 C17.414,23.579 17.463,23.523 17.481,23.464 C17.515,23.357 17.380,23.306 17.310,23.257 C17.251,23.215 17.262,23.186 17.310,23.140 C17.278,23.058 17.195,23.023 17.147,22.954 C17.085,22.865 17.127,22.721 17.217,22.664 C17.359,22.573 17.493,22.787 17.627,22.812 C17.778,22.841 17.946,22.805 18.071,22.914 C18.184,23.011 18.241,23.149 18.382,23.220 C18.443,23.251 18.506,23.268 18.518,23.344 C18.531,23.430 18.619,23.393 18.676,23.450 C18.714,23.486 18.718,23.543 18.777,23.557 C18.676,23.681 18.563,23.796 18.435,23.894 C18.329,23.976 18.211,24.051 18.144,24.169 C18.008,24.412 18.117,24.716 17.950,24.949 C17.808,25.150 17.592,25.250 17.520,25.498 C17.454,25.725 17.395,25.931 17.161,26.044 C16.893,26.172 16.582,26.210 16.289,26.239 C16.012,26.265 15.724,26.268 15.485,26.429 C15.262,26.578 15.043,26.706 14.764,26.706 C14.698,26.706 14.633,26.702 14.567,26.697 C14.511,26.739 14.475,26.799 14.421,26.842 C14.313,26.930 14.187,26.821 14.085,26.782 C14.101,26.815 14.105,26.848 14.096,26.883 C14.044,26.862 13.988,26.912 13.939,26.873 C13.896,26.842 13.871,26.790 13.813,26.779 C13.679,26.755 13.596,26.819 13.465,26.733 C13.274,26.609 13.078,26.627 12.855,26.598 C12.625,26.567 12.397,26.516 12.172,26.451 C11.769,26.336 11.334,26.207 10.968,26.001 C10.797,25.906 10.621,25.778 10.560,25.587 C10.534,25.512 10.556,25.416 10.529,25.345 C10.511,25.299 10.315,25.279 10.267,25.263 C10.162,25.228 9.925,25.244 9.972,25.088 C10.004,24.977 10.148,25.017 10.234,25.009 C10.403,24.995 10.387,24.822 10.285,24.732 C10.193,24.650 9.992,24.616 10.000,24.472 C10.011,24.326 10.107,24.022 9.911,23.964 C9.763,23.920 9.621,23.900 9.569,23.750 C9.542,23.670 9.472,23.616 9.441,23.532 C9.409,23.450 9.316,23.371 9.235,23.339 C9.179,23.315 9.024,23.342 9.003,23.278 C8.987,23.229 8.970,23.165 8.972,23.115 C8.983,22.940 9.218,23.211 9.285,23.211 C9.423,23.207 9.547,23.036 9.452,22.920 C9.494,22.900 9.569,22.909 9.589,22.858 C9.542,22.848 9.445,22.892 9.416,22.834 C9.387,22.777 9.449,22.699 9.400,22.648 C9.357,22.601 9.280,22.657 9.226,22.652 C9.161,22.646 9.265,22.577 9.262,22.553 C9.186,22.551 9.123,22.617 9.058,22.644 C8.999,22.672 8.936,22.688 8.877,22.715 C8.825,22.679 8.897,22.626 8.922,22.601 C8.978,22.548 8.943,22.490 8.922,22.431 C9.051,22.440 9.055,22.347 8.979,22.269 C8.880,22.169 8.925,22.096 8.880,21.981 C8.828,21.848 8.746,21.919 8.699,22.001 C8.611,22.152 8.525,21.963 8.483,22.003 C8.444,21.888 8.356,21.828 8.258,21.761 C8.170,21.702 8.158,21.597 8.097,21.518 C8.023,21.425 7.897,21.391 7.836,21.285 C7.780,21.189 7.755,21.076 7.680,20.990 C7.635,20.939 7.295,20.673 7.507,20.618 ZM8.787,22.989 C8.819,22.987 8.868,23.022 8.857,23.053 L8.843,23.067 C8.857,23.073 8.868,23.078 8.871,23.094 C8.819,23.100 8.827,23.167 8.807,23.202 C8.724,23.202 8.685,23.116 8.721,23.053 C8.731,23.031 8.758,22.991 8.787,22.989 ZM24.510,20.174 C24.490,20.126 24.542,20.112 24.566,20.075 C24.594,20.033 24.580,19.982 24.647,19.984 C24.675,19.986 24.679,19.993 24.704,19.984 C24.729,19.977 24.758,19.955 24.781,19.942 C24.796,20.002 24.814,20.039 24.843,20.090 C24.871,20.139 24.852,20.181 24.819,20.223 C24.796,20.250 24.773,20.281 24.737,20.292 C24.697,20.307 24.638,20.312 24.634,20.258 C24.631,20.258 24.625,20.258 24.621,20.256 C24.623,20.252 24.625,20.250 24.627,20.247 L24.618,20.258 C24.584,20.241 24.524,20.210 24.510,20.174 ZM24.501,21.961 C24.438,22.069 24.310,22.100 24.213,22.160 C24.127,22.216 24.075,22.304 23.990,22.360 C23.857,22.449 23.538,22.719 23.383,22.666 C23.368,22.568 23.539,22.466 23.609,22.418 C23.663,22.382 23.687,22.336 23.726,22.295 C23.785,22.236 23.856,22.205 23.897,22.121 C23.951,22.012 23.849,21.817 23.942,21.746 C24.014,21.693 24.048,21.761 24.122,21.739 C24.167,21.724 24.194,21.691 24.217,21.666 C24.287,21.562 24.233,21.373 24.104,21.345 C24.138,21.240 24.345,21.061 24.471,21.103 C24.460,21.148 24.426,21.207 24.449,21.263 C24.544,21.258 24.639,21.123 24.621,21.032 C24.612,20.992 24.566,20.934 24.526,20.915 C24.434,20.879 24.433,20.941 24.377,20.961 C24.260,21.005 24.127,20.992 24.003,21.048 C23.884,21.099 23.811,21.147 23.670,21.123 C23.660,21.107 23.660,21.090 23.670,21.076 C23.701,21.079 23.748,21.061 23.778,21.066 C23.785,20.997 23.917,20.955 23.978,20.924 C24.003,20.910 24.052,20.886 24.071,20.875 C24.096,20.859 24.138,20.821 24.161,20.808 C24.251,20.751 24.409,20.573 24.524,20.569 C24.560,20.667 24.616,20.740 24.733,20.722 C24.789,20.711 24.810,20.718 24.837,20.637 C24.855,20.584 24.859,20.533 24.821,20.487 C25.037,20.498 24.897,20.321 25.028,20.232 C25.096,20.288 25.143,20.212 25.217,20.234 C25.220,20.250 25.224,20.265 25.227,20.281 C25.247,20.272 25.287,20.278 25.308,20.259 C25.398,20.421 25.186,20.764 25.105,20.908 C25.053,20.999 24.979,21.074 24.942,21.170 C24.898,21.281 24.920,21.413 24.826,21.496 C24.751,21.562 24.690,21.588 24.623,21.668 C24.587,21.710 24.550,21.728 24.530,21.783 C24.508,21.845 24.537,21.899 24.501,21.961 Z" class="cls-1"/>
+</svg>
deleted file mode 100644
index 9b2d6bc66f21ff97506d6f09497049c5af18e4ab..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
--- a/browser/branding/unofficial/content/jar.mn
+++ b/browser/branding/unofficial/content/jar.mn
@@ -9,12 +9,11 @@ browser.jar:
   content/branding/about-logo.png                (about-logo.png)
   content/branding/about-logo@2x.png             (about-logo@2x.png)
   content/branding/about-wordmark.svg            (about-wordmark.svg)
   content/branding/icon48.png                    (icon48.png)
   content/branding/icon64.png                    (icon64.png)
   content/branding/icon16.png                    (../default16.png)
   content/branding/icon32.png                    (../default32.png)
   content/branding/icon128.png                   (../mozicon128.png)
-  content/branding/identity-icons-brand.png      (identity-icons-brand.png)
-  content/branding/identity-icons-brand@2x.png   (identity-icons-brand@2x.png)
+  content/branding/identity-icons-brand.svg      (identity-icons-brand.svg)
   content/branding/silhouette-40.svg             (silhouette-40.svg)
   content/branding/aboutDialog.css               (aboutDialog.css)
--- a/browser/components/loop/content/js/roomViews.js
+++ b/browser/components/loop/content/js/roomViews.js
@@ -633,16 +633,17 @@ loop.roomViews = (function(mozL10n) {
             // since the remoteVideo hasn't yet been enabled, if the
             // media is connected, then we should be displaying an avatar.
             return false;
           }
 
           return true;
 
         case ROOM_STATES.READY:
+        case ROOM_STATES.GATHER:
         case ROOM_STATES.INIT:
         case ROOM_STATES.JOINING:
         case ROOM_STATES.SESSION_CONNECTED:
         case ROOM_STATES.JOINED:
         case ROOM_STATES.MEDIA_WAIT:
           // this case is so that we don't show an avatar while waiting for
           // the other party to connect
           return true;
--- a/browser/components/loop/content/js/roomViews.jsx
+++ b/browser/components/loop/content/js/roomViews.jsx
@@ -633,16 +633,17 @@ loop.roomViews = (function(mozL10n) {
             // since the remoteVideo hasn't yet been enabled, if the
             // media is connected, then we should be displaying an avatar.
             return false;
           }
 
           return true;
 
         case ROOM_STATES.READY:
+        case ROOM_STATES.GATHER:
         case ROOM_STATES.INIT:
         case ROOM_STATES.JOINING:
         case ROOM_STATES.SESSION_CONNECTED:
         case ROOM_STATES.JOINED:
         case ROOM_STATES.MEDIA_WAIT:
           // this case is so that we don't show an avatar while waiting for
           // the other party to connect
           return true;
--- a/browser/components/loop/standalone/content/js/standaloneRoomViews.js
+++ b/browser/components/loop/standalone/content/js/standaloneRoomViews.js
@@ -367,16 +367,17 @@ loop.standaloneRoomViews = (function(moz
             // since the remoteVideo hasn't yet been enabled, if the
             // media is connected, then we should be displaying an avatar.
             return false;
           }
 
           return true;
 
         case ROOM_STATES.READY:
+        case ROOM_STATES.GATHER:
         case ROOM_STATES.INIT:
         case ROOM_STATES.JOINING:
         case ROOM_STATES.SESSION_CONNECTED:
         case ROOM_STATES.JOINED:
         case ROOM_STATES.MEDIA_WAIT:
           // this case is so that we don't show an avatar while waiting for
           // the other party to connect
           return true;
--- a/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx
+++ b/browser/components/loop/standalone/content/js/standaloneRoomViews.jsx
@@ -367,16 +367,17 @@ loop.standaloneRoomViews = (function(moz
             // since the remoteVideo hasn't yet been enabled, if the
             // media is connected, then we should be displaying an avatar.
             return false;
           }
 
           return true;
 
         case ROOM_STATES.READY:
+        case ROOM_STATES.GATHER:
         case ROOM_STATES.INIT:
         case ROOM_STATES.JOINING:
         case ROOM_STATES.SESSION_CONNECTED:
         case ROOM_STATES.JOINED:
         case ROOM_STATES.MEDIA_WAIT:
           // this case is so that we don't show an avatar while waiting for
           // the other party to connect
           return true;
--- a/browser/locales/en-US/chrome/browser/browser.properties
+++ b/browser/locales/en-US/chrome/browser/browser.properties
@@ -338,16 +338,19 @@ identity.unknown.tooltip=This website do
 
 trackingProtection.intro.title=How Tracking Protection works
 # LOCALIZATION NOTE (trackingProtection.intro.description): %S is brandShortName
 trackingProtection.intro.description=When the shield is visible, that means Firefox is actively blocking content that tracks you.
 # LOCALIZATION NOTE (trackingProtection.intro.step1of3): Indicates that the intro panel is step one of three in a tour.
 trackingProtection.intro.step1of3=1 of 3
 trackingProtection.intro.nextButton.label=Next
 
+trackingProtection.icon.activeTooltip=Tracking attempts blocked
+trackingProtection.icon.disabledTooltip=Tracking content detected
+
 # Edit Bookmark UI
 editBookmarkPanel.pageBookmarkedTitle=Page Bookmarked
 editBookmarkPanel.pageBookmarkedDescription=%S will always remember this page for you.
 editBookmarkPanel.bookmarkedRemovedTitle=Bookmark Removed
 editBookmarkPanel.editBookmarkTitle=Edit This Bookmark
 
 # LOCALIZATION NOTE (editBookmark.removeBookmarks.label): Semicolon-separated list of plural forms.
 # See: http://developer.mozilla.org/en/docs/Localization_and_Plurals
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -29,17 +29,17 @@
   --toolbarbutton-active-bordercolor: rgb(154,154,154);
   --toolbarbutton-active-background: rgba(154,154,154,.5) linear-gradient(hsla(0,0%,100%,.7), hsla(0,0%,100%,.4));
 
   --toolbarbutton-checkedhover-backgroundcolor: rgba(90%,90%,90%,.4);
 
   --toolbarbutton-combined-boxshadow: 0 0 0 1px hsla(0,0%,100%,.2);
   --toolbarbutton-combined-backgroundimage: linear-gradient(hsla(210,54%,20%,.2) 0, hsla(210,54%,20%,.2) 18px);
 
-  --verified-identity-box-backgroundcolor: #fff;
+  --identity-box-verified-background-color: #fff;
 }
 
 #menubar-items {
   -moz-box-orient: vertical; /* for flex hack */
 }
 
 #main-menubar {
   -moz-box-flex: 1; /* make menu items expand to fill toolbar height */
@@ -981,17 +981,17 @@ toolbarbutton[constrain-size="true"][cui
 }
 
 #identity-box:-moz-locale-dir(rtl) {
   border-top-right-radius: 1.5px;
   border-bottom-right-radius: 1.5px;
 }
 
 #identity-box.verifiedIdentity:not(:-moz-lwtheme):not(:hover):not([open=true]) {
-  background-color: var(--verified-identity-box-backgroundcolor);
+  background-color: var(--identity-box-verified-background-color);
 }
 
 #identity-box:-moz-focusring {
   outline: 1px dotted #000;
   outline-offset: -3px;
 }
 
 %include ../shared/identity-block/identity-block.inc.css
--- a/browser/themes/shared/customizableui/panelUIOverlay.inc.css
+++ b/browser/themes/shared/customizableui/panelUIOverlay.inc.css
@@ -169,26 +169,16 @@ panelmultiview[nosubviews=true] > .panel
   -moz-box-pack: center;
 }
 
 #PanelUI-mainView {
   display: flex;
   flex-direction: column;
 }
 
-#app-extension-point-end > #PanelUI-menu-button {
-  padding: 2px 5px;
-}
-#app-extension-point-end > #PanelUI-menu-button .toolbarbutton-text {
-  display: none;
-}
-#app-extension-point-end > #PanelUI-menu-button .toolbarbutton-icon {
-  margin: 0;
-}
-
 #PanelUI-popup > arrowscrollbox > autorepeatbutton {
   display: none;
 }
 #PanelUI-popup > arrowscrollbox > scrollbox {
   overflow: visible;
 }
 
 #PanelUI-popup > .panel-arrowcontainer > .panel-arrowcontent {
--- a/browser/themes/shared/devedition.inc.css
+++ b/browser/themes/shared/devedition.inc.css
@@ -58,17 +58,17 @@
   --urlbar-dropmarker-2x-region: rect(0px, 11px, 14px, 0px);
   --urlbar-dropmarker-active-2x-region: rect(0px, 22px, 14px, 11px);
   --search-button-image: url("chrome://browser/skin/devedition/search.svg#search-icon-inverted");
 }
 
 :root[devtoolstheme="dark"] #identity-box {
   --identity-box-border-color: #5F6670;
   --identity-box-chrome-color: #46afe3;
-  --verified-identity-box-background-color: transparent;
+  --identity-box-verified-background-color: transparent;
   --identity-box-selected-background-color: rgba(231,230,230,.2);
 }
 
 :root[devtoolstheme="dark"] .searchbar-dropmarker-image {
   --searchbar-dropmarker-url: url("chrome://browser/skin/devtools/dropmarker.svg");
   --searchbar-dropmarker-2x-url: url("chrome://browser/skin/devtools/dropmarker.svg");
 }
 
--- a/browser/themes/shared/identity-block/identity-block.inc.css
+++ b/browser/themes/shared/identity-block/identity-block.inc.css
@@ -13,31 +13,32 @@
 %else
 %if MOZ_UPDATE_CHANNEL == aurora
   --identity-box-chrome-color: rgb(51,30,84);
 %else
   --identity-box-chrome-color: rgb(0,33,71);
 %endif
 %endif
 
-  border-inline-end: 1px solid;
+  border-inline-end: 1px solid var(--identity-box-border-color);
   border-image: linear-gradient(transparent 15%,
                                 var(--identity-box-border-color) 15%,
                                 var(--identity-box-border-color) 85%,
                                 transparent 85%);
   border-image-slice: 1;
   font-size: .9em;
   padding: 2px 5px;
   margin-inline-end: 4px;
   overflow: hidden;
 }
 
 #identity-box:hover,
 #identity-box[open=true] {
   background-color: var(--identity-box-selected-background-color);
+  border-image-source: none;
 }
 
 #urlbar[pageproxystate="valid"] > #identity-box.verifiedIdentity {
   color: var(--identity-box-verified-color);
 }
 
 #urlbar[pageproxystate="valid"] > #identity-box.chromeUI {
   color: var(--identity-box-chrome-color);
@@ -114,18 +115,17 @@
 
 #page-proxy-favicon {
   width: 16px;
   height: 16px;
   list-style-image: url(chrome://browser/skin/identity-not-secure.svg);
 }
 
 .chromeUI > #page-proxy-favicon[pageproxystate="valid"] {
-  list-style-image: url(chrome://branding/content/identity-icons-brand.png);
-  -moz-image-region: rect(0, 16px, 16px, 0);
+  list-style-image: url(chrome://branding/content/identity-icons-brand.svg);
 }
 
 .verifiedDomain > #page-proxy-favicon[pageproxystate="valid"],
 .verifiedIdentity > #page-proxy-favicon[pageproxystate="valid"] {
   list-style-image: url(chrome://browser/skin/identity-secure.svg);
 }
 
 .mixedActiveContent > #page-proxy-favicon[pageproxystate="valid"] {
@@ -141,22 +141,15 @@
 .mixedActiveBlocked > #page-proxy-favicon[pageproxystate="valid"] {
   list-style-image: url(chrome://browser/skin/identity-mixed-active-blocked.svg);
 }
 
 #page-proxy-favicon[pageproxystate="invalid"] {
   opacity: 0.3;
 }
 
-@media (min-resolution: 1.1dppx) {
-  .chromeUI > #page-proxy-favicon[pageproxystate="valid"] {
-    list-style-image: url(chrome://branding/content/identity-icons-brand@2x.png);
-    -moz-image-region: rect(0, 32px, 32px, 0);
-  }
-}
-
 #urlbar[actiontype="searchengine"] > #identity-box > #page-proxy-favicon {
   -moz-image-region: inherit;
   list-style-image: url(chrome://global/skin/icons/autocomplete-search.svg#search-icon);
   width: 16px;
   height: 16px;
   opacity: 1;
 }
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -33,17 +33,17 @@
   --toolbarbutton-active-bordercolor: hsla(210,4%,10%,.2) transparent transparent;
   --toolbarbutton-active-boxshadow: 0 1px 0 0 hsla(210,4%,10%,.1) inset;
 
   --toolbarbutton-checkedhover-backgroundcolor: hsla(210,4%,10%,.12);
 
   --toolbarbutton-combined-boxshadow: none;
   --toolbarbutton-combined-backgroundimage: linear-gradient(hsla(210,54%,20%,.2) 0, hsla(210,54%,20%,.2) 16px);
 
-  --verified-identity-box-backgroundcolor: #FFF;
+  --identity-box-verified-background-color: #fff;
 
   --urlbar-dropmarker-url: url("chrome://browser/skin/urlbar-history-dropmarker.png");
   --urlbar-dropmarker-region: rect(0px, 11px, 14px, 0px);
   --urlbar-dropmarker-hover-region: rect(0px, 22px, 14px, 11px);
   --urlbar-dropmarker-active-region: rect(0px, 33px, 14px, 22px);
   --urlbar-dropmarker-2x-url: url("chrome://browser/skin/urlbar-history-dropmarker@2x.png");
   --urlbar-dropmarker-2x-region: rect(0, 22px, 28px, 0);
   --urlbar-dropmarker-hover-2x-region: rect(0, 44px, 28px, 22px);
@@ -1256,16 +1256,18 @@ toolbarbutton[constrain-size="true"][cui
   }
 }
 
 @media (-moz-os-version: windows-win10) {
   #urlbar,
   .searchbar-textbox {
     font-size: 1.15em;
     min-height: 28px;
+    transition-property: border-color, box-shadow;
+    transition-duration: .1s;
   }
 
   :root {
     /* let toolbar buttons match the location and search bar's minimum height */
     --toolbarbutton-vertical-inner-padding: 4px;
     --toolbarbutton-vertical-outer-padding: 5px;
   }
 }
@@ -1430,17 +1432,17 @@ html|*.urlbar-input:-moz-lwtheme::-moz-p
 }
 
 #identity-box:-moz-locale-dir(rtl) {
   border-top-right-radius: 1.5px;
   border-bottom-right-radius: 1.5px;
 }
 
 #identity-box.verifiedIdentity:not(:-moz-lwtheme):not(:hover):not([open=true]) {
-  background-color: var(--verified-identity-box-backgroundcolor);
+  background-color: var(--identity-box-verified-background-color);
 }
 
 #identity-box:-moz-focusring {
   outline: 1px dotted #000;
   outline-offset: -3px;
 }
 
 /* Location bar dropmarker */
--- a/dom/bluetooth/bluedroid/BluetoothDaemonHelpers.cpp
+++ b/dom/bluetooth/bluedroid/BluetoothDaemonHelpers.cpp
@@ -948,20 +948,22 @@ Convert(BluetoothPropertyType aIn, uint8
   }
   aOut = sPropertyType[aIn];
   return NS_OK;
 }
 
 nsresult
 Convert(const BluetoothRemoteName& aIn, nsAString& aOut)
 {
+  const char* name = reinterpret_cast<const char*>(aIn.mName);
+
   // We construct an nsCString here because the string
   // returned from the PDU is not 0-terminated.
   aOut = NS_ConvertUTF8toUTF16(
-    nsCString(reinterpret_cast<const char*>(aIn.mName), sizeof(aIn.mName)));
+    nsCString(name, strnlen(name, sizeof(aIn.mName))));
   return NS_OK;
 }
 
 nsresult
 Convert(BluetoothScanMode aIn, int32_t& aOut)
 {
   static const int32_t sScanMode[] = {
     CONVERT(SCAN_MODE_NONE, 0x00),
--- a/dom/media/tests/mochitest/network.js
+++ b/dom/media/tests/mochitest/network.js
@@ -14,17 +14,18 @@ function isNetworkReady() {
   // for gonk platform
   if ("nsINetworkInterfaceListService" in SpecialPowers.Ci) {
     var listService = SpecialPowers.Cc["@mozilla.org/network/interface-list-service;1"]
                         .getService(SpecialPowers.Ci.nsINetworkInterfaceListService);
     var itfList = listService.getDataInterfaceList(
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_MMS_INTERFACES |
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_SUPL_INTERFACES |
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_IMS_INTERFACES |
-          SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_DUN_INTERFACES);
+          SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_DUN_INTERFACES |
+          SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_FOTA_INTERFACES);
     var num = itfList.getNumberOfInterface();
     for (var i = 0; i < num; i++) {
       var ips = {};
       var prefixLengths = {};
       var length = itfList.getInterface(i).getAddresses(ips, prefixLengths);
 
       for (var j = 0; j < length; j++) {
         var ip = ips.value[j];
--- a/dom/mobilemessage/MobileMessageCallback.cpp
+++ b/dom/mobilemessage/MobileMessageCallback.cpp
@@ -271,38 +271,48 @@ MobileMessageCallback::NotifySegmentInfo
 
 NS_IMETHODIMP
 MobileMessageCallback::NotifyGetSegmentInfoForTextFailed(int32_t aError)
 {
   return NotifyError(aError, nullptr, true);
 }
 
 NS_IMETHODIMP
-MobileMessageCallback::NotifyGetSmscAddress(const nsAString& aSmscAddress)
+MobileMessageCallback::NotifyGetSmscAddress(const nsAString& aSmscAddress,
+                                            uint32_t aTypeOfNumber,
+                                            uint32_t aNumberPlanIdentification)
 {
-  AutoJSAPI jsapi;
-  if (NS_WARN_IF(!jsapi.Init(mDOMRequest->GetOwner()))) {
-    return NotifyError(nsIMobileMessageCallback::INTERNAL_ERROR);
-  }
-  JSContext* cx = jsapi.cx();
-  JSString* smsc = JS_NewUCStringCopyN(cx, aSmscAddress.BeginReading(),
-                                       aSmscAddress.Length());
+  TypeOfAddress toa;
+
+  // Check the value is valid and set TON accordingly.
+  bool isTonValid = aTypeOfNumber < uint32_t(TypeOfNumber::EndGuard_);
+  toa.mTypeOfNumber = (isTonValid) ?
+    static_cast<TypeOfNumber>(aTypeOfNumber) : TypeOfNumber::Unknown;
 
-  if (!smsc) {
-    return NotifyError(nsIMobileMessageCallback::INTERNAL_ERROR);
-  }
+  // Check the value is valid and set NPI accordingly.
+  bool isNpiValid =
+    aNumberPlanIdentification < uint32_t(NumberPlanIdentification::EndGuard_);
+  toa.mNumberPlanIdentification = (isNpiValid) ?
+    static_cast<NumberPlanIdentification>(aNumberPlanIdentification) :
+    NumberPlanIdentification::Unknown;
 
-  JS::Rooted<JS::Value> val(cx, JS::StringValue(smsc));
-  return NotifySuccess(val);
+  SmscAddress smsc;
+  smsc.mTypeOfAddress = toa;
+  smsc.mAddress.Construct(nsString(aSmscAddress));
+
+  mPromise->MaybeResolve(smsc);
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 MobileMessageCallback::NotifyGetSmscAddressFailed(int32_t aError)
 {
-  return NotifyError(aError);
+  const nsAString& errorStr = ConvertErrorCodeToErrorString(aError);
+  mPromise->MaybeRejectBrokenly(errorStr);
+  return NS_OK;
 }
 
 NS_IMETHODIMP
 MobileMessageCallback::NotifySetSmscAddress()
 {
   mPromise->MaybeResolve(JS::UndefinedHandleValue);
   return NS_OK;
 }
--- a/dom/mobilemessage/MobileMessageManager.cpp
+++ b/dom/mobilemessage/MobileMessageManager.cpp
@@ -720,17 +720,17 @@ MobileMessageManager::Observe(nsISupport
 
   if (!strcmp(aTopic, kSmsDeletedObserverTopic)) {
     return DispatchTrustedDeletedEventToSelf(aSubject);
   }
 
   return NS_OK;
 }
 
-already_AddRefed<DOMRequest>
+already_AddRefed<Promise>
 MobileMessageManager::GetSmscAddress(const Optional<uint32_t>& aServiceId,
                                      ErrorResult& aRv)
 {
   nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
   if (!smsService) {
     aRv.Throw(NS_ERROR_FAILURE);
     return nullptr;
   }
@@ -749,25 +749,37 @@ MobileMessageManager::GetSmscAddress(con
   }
 
   nsCOMPtr<nsPIDOMWindow> window = GetOwner();
   if (!window) {
     aRv.Throw(NS_ERROR_FAILURE);
     return nullptr;
   }
 
-  nsRefPtr<DOMRequest> request = new DOMRequest(window);
-  nsCOMPtr<nsIMobileMessageCallback> msgCallback = new MobileMessageCallback(request);
-  rv = smsService->GetSmscAddress(serviceId, msgCallback);
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
+  nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(window);
+  if (!global) {
+    aRv.Throw(NS_ERROR_UNEXPECTED);
+    return nullptr;
+  }
+
+  nsRefPtr<Promise> promise = Promise::Create(global, aRv);
+  if (aRv.Failed()) {
     return nullptr;
   }
 
-  return request.forget();
+  nsCOMPtr<nsIMobileMessageCallback> msgCallback =
+    new MobileMessageCallback(promise);
+
+  rv = smsService->GetSmscAddress(serviceId, msgCallback);
+  if (NS_FAILED(rv)) {
+    promise->MaybeReject(rv);
+    return promise.forget();
+  }
+
+  return promise.forget();
 }
 
 already_AddRefed<Promise>
 MobileMessageManager::SetSmscAddress(const SmscAddress& aSmscAddress,
                                      const Optional<uint32_t>& aServiceId,
                                      ErrorResult& aRv)
 {
   nsCOMPtr<nsISmsService> smsService = do_GetService(SMS_SERVICE_CONTRACTID);
--- a/dom/mobilemessage/MobileMessageManager.h
+++ b/dom/mobilemessage/MobileMessageManager.h
@@ -109,17 +109,17 @@ public:
   already_AddRefed<DOMRequest>
   RetrieveMMS(int32_t aId,
               ErrorResult& aRv);
 
   already_AddRefed<DOMRequest>
   RetrieveMMS(nsIDOMMozMmsMessage* aMessage,
               ErrorResult& aRv);
 
-  already_AddRefed<DOMRequest>
+  already_AddRefed<Promise>
   GetSmscAddress(const Optional<uint32_t>& aServiceId,
                  ErrorResult& aRv);
 
   already_AddRefed<Promise>
   SetSmscAddress(const SmscAddress& aSmscAddress,
                  const Optional<uint32_t>& aServiceId,
                  ErrorResult& aRv);
 
--- a/dom/mobilemessage/gonk/SmsService.js
+++ b/dom/mobilemessage/gonk/SmsService.js
@@ -1026,17 +1026,19 @@ SmsService.prototype = {
     if (aServiceId > (gRadioInterfaces.length - 1)) {
       throw Cr.NS_ERROR_INVALID_ARG;
     }
 
     gRadioInterfaces[aServiceId].sendWorkerMessage("getSmscAddress",
                                                    null,
                                                    (aResponse) => {
       if (!aResponse.errorMsg) {
-        aRequest.notifyGetSmscAddress(aResponse.smscAddress);
+        aRequest.notifyGetSmscAddress(aResponse.smscAddress,
+                                      aResponse.typeOfNumber,
+                                      aResponse.numberPlanIdentification);
       } else {
         aRequest.notifyGetSmscAddressFailed(
           Ci.nsIMobileMessageCallback.NOT_FOUND_ERROR);
       }
     });
   },
 
   setSmscAddress: function(aServiceId, aNumber, aTypeOfNumber,
--- a/dom/mobilemessage/interfaces/nsIMobileMessageCallback.idl
+++ b/dom/mobilemessage/interfaces/nsIMobileMessageCallback.idl
@@ -1,15 +1,15 @@
 /* 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/. */
 
 #include "nsISupports.idl"
 
-[scriptable, uuid(b1367554-51c6-4153-b20a-effec50ca827)]
+[scriptable, uuid(609692b0-1fc7-404a-91c4-eb2ec4d16c20)]
 interface nsIMobileMessageCallback : nsISupports
 {
   /**
    * All SMS related errors.
    * Make sure to keep this list in sync with the list in:
    * embedding/android/GeckoSmsManager.java
    */
   const unsigned short SUCCESS_NO_ERROR          = 0;
@@ -47,13 +47,15 @@ interface nsIMobileMessageCallback : nsI
   void notifySegmentInfoForTextGot(in long segments,
                                    in long charsPerSegment,
                                    in long charsAvailableInLastSegment);
   void notifyGetSegmentInfoForTextFailed(in long error);
 
   /**
    *  SMSC Address get/set result
    */
-  void notifyGetSmscAddress(in DOMString aSmscAddress);
+  void notifyGetSmscAddress(in DOMString aSmscAddress,
+                            in unsigned long aTypeOfNumber,
+                            in unsigned long aNumberPlanIdentification);
   void notifyGetSmscAddressFailed(in long error);
   void notifySetSmscAddress();
   void notifySetSmscAddressFailed(in long error);
 };
--- a/dom/mobilemessage/interfaces/nsISmsService.idl
+++ b/dom/mobilemessage/interfaces/nsISmsService.idl
@@ -48,17 +48,20 @@ interface nsISmsService : nsISupports
   const unsigned short TYPE_OF_NUMBER_UNKNOWN                     = 0;
   const unsigned short TYPE_OF_NUMBER_INTERNATIONAL               = 1;
   const unsigned short TYPE_OF_NUMBER_NATIONAL                    = 2;
   const unsigned short TYPE_OF_NUMBER_NETWORK_SPECIFIC            = 3;
   const unsigned short TYPE_OF_NUMBER_DEDICATED_ACCESS_SHORT_CODE = 4;
 
   /**
    * Constant definitions of SM-RP number plan identification as defined in
-   * |Table 10.5.118: Called party BCD number| of 3GPP TS 24.008.
+   * |Table 10.5.118: Called party BCD number| of 3GPP TS 24.008. These values
+   * do not represent the actual protocol values defined in the 3GPP standard,
+   * but rather the corresponding enum values of NumberPlanIdentification in
+   * MozMobileMessageManager.
    */
   const unsigned short NUMBER_PLAN_IDENTIFICATION_UNKNOWN  = 0;
   const unsigned short NUMBER_PLAN_IDENTIFICATION_ISDN     = 1;
   const unsigned short NUMBER_PLAN_IDENTIFICATION_DATA     = 2;
   const unsigned short NUMBER_PLAN_IDENTIFICATION_TELEX    = 3;
   const unsigned short NUMBER_PLAN_IDENTIFICATION_NATIONAL = 4;
   const unsigned short NUMBER_PLAN_IDENTIFICATION_PRIVATE  = 5;
 
--- a/dom/mobilemessage/ipc/PSmsRequest.ipdl
+++ b/dom/mobilemessage/ipc/PSmsRequest.ipdl
@@ -82,16 +82,18 @@ struct ReplyGetSegmentInfoForText
 struct ReplyGetSegmentInfoForTextFail
 {
   int32_t error;
 };
 
 struct ReplyGetSmscAddress
 {
   nsString smscAddress;
+  uint32_t typeOfNumber;
+  uint32_t numberPlanIdentification;
 };
 
 struct ReplyGetSmscAddressFail
 {
   int32_t error;
 };
 
 struct ReplySetSmscAddress
--- a/dom/mobilemessage/ipc/SmsChild.cpp
+++ b/dom/mobilemessage/ipc/SmsChild.cpp
@@ -254,17 +254,19 @@ SmsRequestChild::Recv__delete__(const Me
                                                    reply.charsAvailableInLastSegment());
       }
       break;
     case MessageReply::TReplyGetSegmentInfoForTextFail:
       mReplyRequest->NotifyGetSegmentInfoForTextFailed(
         aReply.get_ReplyGetSegmentInfoForTextFail().error());
       break;
     case MessageReply::TReplyGetSmscAddress:
-      mReplyRequest->NotifyGetSmscAddress(aReply.get_ReplyGetSmscAddress().smscAddress());
+      mReplyRequest->NotifyGetSmscAddress(aReply.get_ReplyGetSmscAddress().smscAddress(),
+                                          aReply.get_ReplyGetSmscAddress().typeOfNumber(),
+                                          aReply.get_ReplyGetSmscAddress().numberPlanIdentification());
       break;
     case MessageReply::TReplyGetSmscAddressFail:
       mReplyRequest->NotifyGetSmscAddressFailed(aReply.get_ReplyGetSmscAddressFail().error());
       break;
     case MessageReply::TReplySetSmscAddress:
       mReplyRequest->NotifySetSmscAddress();
       break;
     case MessageReply::TReplySetSmscAddressFail:
--- a/dom/mobilemessage/ipc/SmsParent.cpp
+++ b/dom/mobilemessage/ipc/SmsParent.cpp
@@ -756,19 +756,23 @@ SmsRequestParent::NotifySegmentInfoForTe
 
 NS_IMETHODIMP
 SmsRequestParent::NotifyGetSegmentInfoForTextFailed(int32_t aError)
 {
   return SendReply(ReplyGetSegmentInfoForTextFail(aError));
 }
 
 NS_IMETHODIMP
-SmsRequestParent::NotifyGetSmscAddress(const nsAString& aSmscAddress)
+SmsRequestParent::NotifyGetSmscAddress(const nsAString& aSmscAddress,
+                                       uint32_t aTypeOfNumber,
+                                       uint32_t aNumberPlanIdentification)
 {
-  return SendReply(ReplyGetSmscAddress(nsString(aSmscAddress)));
+  return SendReply(ReplyGetSmscAddress(nsString(aSmscAddress),
+                                       aTypeOfNumber,
+                                       aNumberPlanIdentification));
 }
 
 NS_IMETHODIMP
 SmsRequestParent::NotifyGetSmscAddressFailed(int32_t aError)
 {
   return SendReply(ReplyGetSmscAddressFail(aError));
 }
 
--- a/dom/mobilemessage/tests/marionette/test_set_smsc_address.js
+++ b/dom/mobilemessage/tests/marionette/test_set_smsc_address.js
@@ -9,64 +9,58 @@ const SMSC_ATT_TYPO = '+++1312@@@314$$$9
 const SMSC_ATT_TEXT = '"+13123149810",145';
 const SMSC_O2 = '+447802000332';
 const SMSC_O2_TEXT = '"+447802000332",145';
 const SMSC_DEF = '+123456789';
 const SMSC_DEF_TEXT = '"+123456789",145';
 const SMSC_TON_UNKNOWN = '0407485455'
 const SMSC_TON_UNKNOWN_TEXT = '"0407485455",129';
 
-function getSmscAddress() {
-  return new Promise((resolve, reject) => {
-    let req = manager.getSmscAddress();
-    if (!req) {
-      reject("manager.getSmscAddress() returns null.");
-    }
+function verifySmscAddress(smsc, expectedAddr, expectedTon, expectedNpi) {
+  is(smsc.address, expectedAddr);
+  is(smsc.typeOfAddress.typeOfNumber, expectedTon);
+  is(smsc.typeOfAddress.numberPlanIdentification, expectedNpi);
+}
 
-    req.onsuccess = function() {
-      resolve(this.result);
-    };
+startTestCommon(function testCaseMain() {
+  return Promise.resolve()
 
-    req.onerror = function() {
-      reject(this.error);
-    };
-  });
-};
+    // Verify setting AT&T SMSC address.
+    .then(() => manager.setSmscAddress({ address:SMSC_ATT }))
+    .then(() => manager.getSmscAddress())
+    .then((result) =>
+      verifySmscAddress(result, SMSC_ATT, "international", "isdn"))
 
-startTestBase(function testCaseMain() {
-  return ensureMobileMessage()
-
-  // Verify setting AT&T SMSC address.
-  .then(() => manager.setSmscAddress({ address:SMSC_ATT }))
-  .then(() => getSmscAddress())
-  .then((result) => is(result, SMSC_ATT_TEXT))
+    // Verify setting O2 SMSC address.
+    .then(() => manager.setSmscAddress({ address:SMSC_O2 }))
+    .then(() => manager.getSmscAddress())
+    .then((result) =>
+      verifySmscAddress(result, SMSC_O2, "international", "isdn"))
 
-  // Verify setting O2 SMSC address.
-  .then(() => manager.setSmscAddress({ address:SMSC_O2 }))
-  .then(() => getSmscAddress())
-  .then((result) => is(result, SMSC_O2_TEXT))
+    // Verify setting AT&T SMSC address with extra illegal characters.
+    .then(() => manager.setSmscAddress({ address:SMSC_ATT_TYPO }))
+    .then(() => manager.getSmscAddress())
+    .then((result) =>
+      verifySmscAddress(result, SMSC_ATT, "international", "isdn"))
 
-  // Verify setting AT&T SMSC address with extra illegal characters.
-  .then(() => manager.setSmscAddress({ address:SMSC_ATT_TYPO }))
-  .then(() => getSmscAddress())
-  .then((result) => is(result, SMSC_ATT_TEXT))
-
-  // Verify setting a SMSC address with TON=unknown.
-  .then(() => manager.setSmscAddress({ address:SMSC_TON_UNKNOWN }))
-  .then(() => getSmscAddress())
-  .then((result) => is(result, SMSC_TON_UNKNOWN_TEXT))
+    // Verify setting a SMSC address with TON=unknown.
+    .then(() => manager.setSmscAddress({ address:SMSC_TON_UNKNOWN }))
+    .then(() => manager.getSmscAddress())
+    .then((result) =>
+      verifySmscAddress(result, SMSC_TON_UNKNOWN, "unknown", "isdn"))
 
-  // Verify setting invalid SMSC address.
-  .then(() => manager.setSmscAddress({}))
-  .then(() => Promise.reject("Expect for an error."),
-    (err) => log("Got expected error: " + err))
-  .then(() => manager.setSmscAddress({ address:"" }))
-  .then(() => Promise.reject("Expect for an error."),
-    (err) => log("Got expected error: " + err))
-  .then(() => manager.setSmscAddress({ address:"???" }))
-  .then(() => Promise.reject("Expect for an error."),
-    (err) => log("Got expected error: " + err))
+    // Verify setting invalid SMSC address.
+    .then(() => manager.setSmscAddress({}))
+    .then(() => Promise.reject("Expect for an error."),
+      (err) => log("Got expected error: " + err))
+    .then(() => manager.setSmscAddress({ address:"" }))
+    .then(() => Promise.reject("Expect for an error."),
+      (err) => log("Got expected error: " + err))
+    .then(() => manager.setSmscAddress({ address:"???" }))
+    .then(() => Promise.reject("Expect for an error."),
+      (err) => log("Got expected error: " + err))
 
-  // Restore to default emulator SMSC address.
-  .then(() => manager.setSmscAddress({ address:SMSC_DEF }))
-  .then(() => getSmscAddress())
-  .then((result) => is(result, SMSC_DEF_TEXT));
+    // Restore to default emulator SMSC address.
+    .then(() => manager.setSmscAddress({ address:SMSC_DEF }))
+    .then(() => manager.getSmscAddress())
+    .then((result) =>
+      verifySmscAddress(result, SMSC_DEF, "international", "isdn"));
 });
--- a/dom/mobilemessage/tests/marionette/test_smsc_address.js
+++ b/dom/mobilemessage/tests/marionette/test_smsc_address.js
@@ -1,78 +1,22 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 MARIONETTE_TIMEOUT = 60000;
-
-SpecialPowers.addPermission("sms", true, document);
+MARIONETTE_HEAD_JS = 'head.js';
 
 // Expected SMSC addresses of emulator
-const SMSC = "\"+123456789\",145";
-
-let manager = window.navigator.mozMobileMessage;
-
-let tasks = {
-  // List of test fuctions. Each of them should call |tasks.next()| when
-  // completed or |tasks.finish()| to jump to the last one.
-  _tasks: [],
-  _nextTaskIndex: 0,
-
-  push: function(func) {
-    this._tasks.push(func);
-  },
-
-  next: function() {
-    let index = this._nextTaskIndex++;
-    let task = this._tasks[index];
-    try {
-      task();
-    } catch (ex) {
-      ok(false, "test task[" + index + "] throws: " + ex);
-      // Run last task as clean up if possible.
-      if (index != this._tasks.length - 1) {
-        this.finish();
-      }
-    }
-  },
-
-  finish: function() {
-    this._tasks[this._tasks.length - 1]();
-  },
+const SMSC = "+123456789";
+const TON = "international";
+const NPI = "isdn";
 
-  run: function() {
-    this.next();
-  }
-};
-
-tasks.push(function init() {
-  log("Initialize test object.");
-  ok(manager instanceof MozMobileMessageManager,
-     "manager is instance of " + manager.constructor);
-  tasks.next();
-});
-
-tasks.push(function readSmscAddress() {
-  log("read SMSC address");
-
-  let req = manager.getSmscAddress();
-  ok(req, "DOMRequest object for getting smsc address");
+function verifySmscAddress(smsc, expectedAddr, expectedTon, expectedNpi) {
+  is(smsc.address, expectedAddr);
+  is(smsc.typeOfAddress.typeOfNumber, expectedTon);
+  is(smsc.typeOfAddress.numberPlanIdentification, expectedNpi);
+}
 
-  req.onsuccess = function(e) {
-    is(e.target.result, SMSC, "SMSC address");
-    tasks.next();
-  };
-
-  req.onerror = function(error) {
-    ok(false, "readSmscAddress(): Received 'onerror'");
-    tasks.finish();
-  };
+startTestCommon(function testCaseMain() {
+  return Promise.resolve()
+    .then(() => manager.getSmscAddress())
+    .then((result) => verifySmscAddress(result, SMSC, TON, NPI));
 });
-
-// WARNING: All tasks should be pushed before this!!!
-tasks.push(function cleanUp() {
-  manager.onreceived = null;
-  SpecialPowers.removePermission("sms", document);
-  finish();
-});
-
-// Start the test
-tasks.run();
--- a/dom/system/gonk/DataCallManager.js
+++ b/dom/system/gonk/DataCallManager.js
@@ -63,16 +63,17 @@ const PREF_RIL_DEBUG_ENABLED    = "ril.d
 
 const NETWORK_TYPE_UNKNOWN     = Ci.nsINetworkInterface.NETWORK_TYPE_UNKNOWN;
 const NETWORK_TYPE_WIFI        = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
 const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
 const NETWORK_TYPE_MOBILE_MMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS;
 const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL;
 const NETWORK_TYPE_MOBILE_IMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
 const NETWORK_TYPE_MOBILE_DUN  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
+const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA;
 
 const NETWORK_STATE_UNKNOWN       = Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN;
 const NETWORK_STATE_CONNECTING    = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTING;
 const NETWORK_STATE_CONNECTED     = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
 const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTING;
 const NETWORK_STATE_DISCONNECTED  = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
 
 const INT32_MAX = 2147483647;
@@ -439,16 +440,18 @@ DataCallHandler.prototype = {
       case "mms":
         return NETWORK_TYPE_MOBILE_MMS;
       case "supl":
         return NETWORK_TYPE_MOBILE_SUPL;
       case "ims":
         return NETWORK_TYPE_MOBILE_IMS;
       case "dun":
         return NETWORK_TYPE_MOBILE_DUN;
+      case "fota":
+        return NETWORK_TYPE_MOBILE_FOTA;
       default:
         return NETWORK_TYPE_UNKNOWN;
      }
   },
 
   _compareDataCallOptions: function(aDataCall, aNewDataCall) {
     return aDataCall.apnProfile.apn == aNewDataCall.apnProfile.apn &&
            aDataCall.apnProfile.user == aNewDataCall.apnProfile.user &&
@@ -683,17 +686,18 @@ DataCallHandler.prototype = {
     networkInterface.connect();
   },
 
   _isMobileNetworkType: function(aNetworkType) {
     if (aNetworkType === NETWORK_TYPE_MOBILE ||
         aNetworkType === NETWORK_TYPE_MOBILE_MMS ||
         aNetworkType === NETWORK_TYPE_MOBILE_SUPL ||
         aNetworkType === NETWORK_TYPE_MOBILE_IMS ||
-        aNetworkType === NETWORK_TYPE_MOBILE_DUN) {
+        aNetworkType === NETWORK_TYPE_MOBILE_DUN ||
+        aNetworkType === NETWORK_TYPE_MOBILE_FOTA) {
       return true;
     }
 
     return false;
   },
 
   getDataCallStateByType: function(aNetworkType) {
     if (!this._isMobileNetworkType(aNetworkType)) {
--- a/dom/system/gonk/NetworkInterfaceListService.js
+++ b/dom/system/gonk/NetworkInterfaceListService.js
@@ -36,17 +36,20 @@ NetworkInterfaceListService.prototype = 
           excludeMms: (aConditions &
                        Ci.nsINetworkInterfaceListService.
                        LIST_NOT_INCLUDE_MMS_INTERFACES) != 0,
           excludeIms: (aConditions &
                        Ci.nsINetworkInterfaceListService.
                        LIST_NOT_INCLUDE_IMS_INTERFACES) != 0,
           excludeDun: (aConditions &
                        Ci.nsINetworkInterfaceListService.
-                       LIST_NOT_INCLUDE_DUN_INTERFACES) != 0
+                       LIST_NOT_INCLUDE_DUN_INTERFACES) != 0,
+          excludeFota: (aConditions &
+                        Ci.nsINetworkInterfaceListService.
+                        LIST_NOT_INCLUDE_FOTA_INTERFACES) != 0
         }
       )[0]);
   }
 };
 
 function FakeNetworkInterface(aAttributes) {
   this.state = aAttributes.state;
   this.type = aAttributes.type;
--- a/dom/system/gonk/NetworkManager.js
+++ b/dom/system/gonk/NetworkManager.js
@@ -223,23 +223,25 @@ NetworkManager.prototype = {
 
   receiveMessage: function(aMsg) {
     switch (aMsg.name) {
       case "NetworkInterfaceList:ListInterface": {
         let excludeMms = aMsg.json.excludeMms;
         let excludeSupl = aMsg.json.excludeSupl;
         let excludeIms = aMsg.json.excludeIms;
         let excludeDun = aMsg.json.excludeDun;
+        let excludeFota = aMsg.json.excludeFota;
         let interfaces = [];
 
         for each (let i in this.networkInterfaces) {
           if ((i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS && excludeMms) ||
               (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL && excludeSupl) ||
               (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS && excludeIms) ||
-              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN && excludeDun)) {
+              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN && excludeDun) ||
+              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA && excludeFota)) {
             continue;
           }
 
           let ips = {};
           let prefixLengths = {};
           i.getAddresses(ips, prefixLengths);
 
           interfaces.push({
@@ -609,17 +611,18 @@ NetworkManager.prototype = {
         return Promise.all(promises);
       });
   },
 
   isNetworkTypeSecondaryMobile: function(type) {
     return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS ||
             type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL ||
             type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS ||
-            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN);
+            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN ||
+            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA);
   },
 
   isNetworkTypeMobile: function(type) {
     return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE ||
             this.isNetworkTypeSecondaryMobile(type));
   },
 
   _handleGateways: function(networkId, gateways) {
--- a/dom/system/gonk/RadioInterfaceLayer.js
+++ b/dom/system/gonk/RadioInterfaceLayer.js
@@ -55,23 +55,18 @@ const kSettingsTimezoneAutoUpdateAvailab
 const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
 
 const kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces";
 const kPrefRilDebuggingEnabled = "ril.debugging.enabled";
 
 const RADIO_POWER_OFF_TIMEOUT = 30000;
 const HW_DEFAULT_CLIENT_ID = 0;
 
-const NETWORK_TYPE_UNKNOWN     = Ci.nsINetworkInterface.NETWORK_TYPE_UNKNOWN;
 const NETWORK_TYPE_WIFI        = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
 const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
-const NETWORK_TYPE_MOBILE_MMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS;
-const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL;
-const NETWORK_TYPE_MOBILE_IMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
-const NETWORK_TYPE_MOBILE_DUN  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
 
 // TODO: Bug 815526, deprecate RILContentHelper.
 const RIL_IPC_ICCMANAGER_MSG_NAMES = [
   "RIL:ReadIccContacts",
   "RIL:UpdateIccContact",
 ];
 
 // set to true in ril_consts.js to see debug messages
--- a/dom/system/gonk/nsIDataCallManager.idl
+++ b/dom/system/gonk/nsIDataCallManager.idl
@@ -1,16 +1,16 @@
 /* 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/. */
 
 #include "nsISupports.idl"
 #include "nsINetworkManager.idl"
 
-[scriptable, uuid(e48d290b-ea3b-4987-9333-2e01f64c92ba)]
+[scriptable, uuid(b8ce8528-fce8-4b5e-9d0a-c3247296ccaf)]
 interface nsIRilNetworkInterface : nsINetworkInterface
 {
   readonly attribute unsigned long serviceId;
   readonly attribute DOMString iccId;
 
   /* The following attributes are for MMS proxy settings. */
   readonly attribute DOMString mmsc;     // Empty string if not set.
   readonly attribute DOMString mmsProxy; // Empty string if not set.
--- a/dom/system/gonk/nsINetworkInterfaceListService.idl
+++ b/dom/system/gonk/nsINetworkInterfaceListService.idl
@@ -15,23 +15,24 @@ interface nsINetworkInterfaceList : nsIS
 
   /**
    * Get the i-th interface from the list.
    * @param interfaceIndex index of interface, from 0 to number of interface - 1.
    */
   nsINetworkInterface getInterface(in long interfaceIndex);
 };
 
-[scriptable, uuid(ee0e7cd7-1baa-44fd-86cb-f70acb549163)]
+[scriptable, uuid(21d7fc8b-28c4-4a4f-a15e-1f9defbc2cec)]
 interface nsINetworkInterfaceListService : nsISupports
 {
   const long LIST_NOT_INCLUDE_MMS_INTERFACES  = (1 << 0);
   const long LIST_NOT_INCLUDE_SUPL_INTERFACES = (1 << 1);
   const long LIST_NOT_INCLUDE_IMS_INTERFACES  = (1 << 2);
   const long LIST_NOT_INCLUDE_DUN_INTERFACES  = (1 << 3);
+  const long LIST_NOT_INCLUDE_FOTA_INTERFACES = (1 << 4);
 
   /**
    * Obtain a list of network interfaces that satisfy the specified condition.
    * @param condition flags that specify the interfaces to be returned. This
    *        can be OR combination of LIST_* flags, or zero to make all available
    *        interfaces returned.
    */
   nsINetworkInterfaceList getDataInterfaceList(in long condition);
--- a/dom/system/gonk/nsINetworkManager.idl
+++ b/dom/system/gonk/nsINetworkManager.idl
@@ -2,17 +2,17 @@
  * 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/. */
 
 #include "nsISupports.idl"
 
 /**
  * Information about networks that is exposed to network manager API consumers.
  */
-[scriptable, uuid(cb62ae03-6bda-43ff-9560-916d60203d33)]
+[scriptable, uuid(12da2bfd-0801-40d9-9c2e-768868526065)]
 interface nsINetworkInterface : nsISupports
 {
   const long NETWORK_STATE_UNKNOWN = -1;
   const long NETWORK_STATE_CONNECTING = 0;
   const long NETWORK_STATE_CONNECTED = 1;
   const long NETWORK_STATE_DISCONNECTING = 2;
   const long NETWORK_STATE_DISCONNECTED = 3;
 
@@ -27,16 +27,17 @@ interface nsINetworkInterface : nsISuppo
   const long NETWORK_TYPE_UNKNOWN     = -1;
   const long NETWORK_TYPE_WIFI        = 0;
   const long NETWORK_TYPE_MOBILE      = 1;
   const long NETWORK_TYPE_MOBILE_MMS  = 2;
   const long NETWORK_TYPE_MOBILE_SUPL = 3;
   const long NETWORK_TYPE_WIFI_P2P    = 4;
   const long NETWORK_TYPE_MOBILE_IMS  = 5;
   const long NETWORK_TYPE_MOBILE_DUN  = 6;
+  const long NETWORK_TYPE_MOBILE_FOTA = 7;
 
   /**
    * Network type. One of the NETWORK_TYPE_* constants.
    */
   readonly attribute long type;
 
   /**
    * Name of the network interface. This identifier is unique.
--- a/dom/system/gonk/ril_consts.js
+++ b/dom/system/gonk/ril_consts.js
@@ -1406,17 +1406,18 @@ this.CALLED_PARTY_BCD_NPI_UNKNOWN  = 0;
 this.CALLED_PARTY_BCD_NPI_ISDN     = 1;
 this.CALLED_PARTY_BCD_NPI_DATA     = 3;
 this.CALLED_PARTY_BCD_NPI_TELEX    = 4;
 this.CALLED_PARTY_BCD_NPI_NATIONAL = 8;
 this.CALLED_PARTY_BCD_NPI_PRIVATE  = 9;
 
 /**
  * Array of number plan identification values which can be used to map an
- * enumeration to the corresponding value.
+ * enumeration to the corresponding value. The indices should be consistent
+ * with nsISmsService::NUMBER_PLAN_IDENTIFICATION_* constants.
  */
 this.CALLED_PARTY_BCD_NPI = [
   CALLED_PARTY_BCD_NPI_UNKNOWN,
   CALLED_PARTY_BCD_NPI_ISDN,
   CALLED_PARTY_BCD_NPI_DATA,
   CALLED_PARTY_BCD_NPI_TELEX,
   CALLED_PARTY_BCD_NPI_NATIONAL,
   CALLED_PARTY_BCD_NPI_PRIVATE
--- a/dom/system/gonk/ril_worker.js
+++ b/dom/system/gonk/ril_worker.js
@@ -165,17 +165,16 @@ RilObject.prototype = {
 
     /**
      * Strings
      */
     this.IMEI = null;
     this.IMEISV = null;
     this.ESN = null;
     this.MEID = null;
-    this.SMSC = null;
 
     /**
      * ICC information that is not exposed to Gaia.
      */
     this.iccInfoPrivate = {};
 
     /**
      * ICC information, such as MSISDN, MCC, MNC, SPN...etc.
@@ -1616,40 +1615,30 @@ RilObject.prototype = {
     Buf.writeString(options.dtmfChar);
     Buf.sendParcel();
   },
 
   /**
    * Get the Short Message Service Center address.
    */
   getSmscAddress: function(options) {
-    if (!this.SMSC) {
-      this.context.Buf.simpleRequest(REQUEST_GET_SMSC_ADDRESS, options);
-      return;
-    }
-
-    if (!options || options.rilMessageType !== "getSmscAddress") {
-      return;
-    }
-
-    options.smscAddress = this.SMSC;
-    this.sendChromeMessage(options);
+    this.context.Buf.simpleRequest(REQUEST_GET_SMSC_ADDRESS, options);
   },
 
   /**
    * Set the Short Message Service Center address.
    *
    * @param smscAddress
    *        Number part of the SMSC address.
    * @param typeOfNumber
    *        Type of number in integer, as defined in
    *        |Table 10.5.118: Called party BCD number| of 3GPP TS 24.008.
    * @param numberPlanIdentification
-   *        Number plan identification in integer, as defined in
-   *        |Table 10.5.118: Called party BCD number| of 3GPP TS 24.008.
+   *        The index of number plan identification value in
+   *        CALLED_PARTY_BCD_NPI array.
    */
   setSmscAddress: function(options) {
     let ton = options.typeOfNumber;
     let npi = CALLED_PARTY_BCD_NPI[options.numberPlanIdentification];
 
     // If any of the mandatory arguments is not available, return an error
     // immediately.
     if (ton === undefined || npi === undefined || !options.smscAddress) {
@@ -1668,17 +1657,16 @@ RilObject.prototype = {
     // If the filtered number is an empty string, return an error immediately.
     if (number.length === 0) {
       options.errorMsg = GECKO_ERROR_INVALID_PARAMETER;
       this.sendChromeMessage(options);
       return;
     }
 
     // Init parcel.
-    this.SMSC = null;
     let Buf = this.context.Buf;
     Buf.newParcel(REQUEST_SET_SMSC_ADDRESS, options);
 
     // +---+-----------+---------------+
     // | 1 |    TON    |      NPI      |
     // +---+-----------+---------------+
     let tosca = (0x1 << 7) + (ton << 4) + npi;
     if (RILQUIRKS_SMSC_ADDRESS_FORMAT === "pdu") {
@@ -4819,34 +4807,108 @@ RilObject.prototype[REQUEST_DEVICE_IDENT
 RilObject.prototype[REQUEST_EXIT_EMERGENCY_CALLBACK_MODE] = function REQUEST_EXIT_EMERGENCY_CALLBACK_MODE(length, options) {
   if (options.internal) {
     return;
   }
 
   this.sendChromeMessage(options);
 };
 RilObject.prototype[REQUEST_GET_SMSC_ADDRESS] = function REQUEST_GET_SMSC_ADDRESS(length, options) {
-  this.SMSC = options.errorMsg ? null : this.context.Buf.readString();
-
   if (!options.rilMessageType || options.rilMessageType !== "getSmscAddress") {
     return;
   }
 
-  options.smscAddress = this.SMSC;
+  if (options.errorMsg) {
+    this.sendChromeMessage(options);
+    return;
+  }
+
+  let tosca = TOA_UNKNOWN;
+  let smsc = "";
+  let Buf = this.context.Buf;
+  if (RILQUIRKS_SMSC_ADDRESS_FORMAT === "pdu") {
+    let pduHelper = this.context.GsmPDUHelper;
+    let strlen = Buf.readInt32();
+    let length = pduHelper.readHexOctet();
+
+    // As defined in |8.2.5.2 Destination address element| of 3GPP TS 24.011,
+    // the value of length field can not exceed 11. Since the content might be
+    // filled with 12 'F' when SMSC is cleared, we don't parse the TOA and
+    // address fields if reported length exceeds 11 here. Instead, keep the
+    // default value (TOA_UNKNOWN with an empty address) in this case.
+    const MAX_LENGTH = 11
+    if (length <= MAX_LENGTH) {
+      tosca = pduHelper.readHexOctet();
+
+      // Read and covert the decimal values back to special BCD digits defined in
+      // |Called party BCD number| of 3GPP TS 24.008 (refer the following table).
+      //
+      // +=========+=======+=====+
+      // |  value  | digit | hex |
+      // +========================
+      // | 1 0 1 0 |   *   | 0xA |
+      // | 1 0 1 1 |   #   | 0xB |
+      // | 1 1 0 0 |   a   | 0xC |
+      // | 1 1 0 1 |   b   | 0xD |
+      // | 1 1 1 0 |   c   | 0xE |
+      // +=========+=======+=====+
+      smsc = pduHelper.readSwappedNibbleBcdString(length - 1, true)
+                      .replace(/a/ig, "*")
+                      .replace(/b/ig, "#")
+                      .replace(/c/ig, "a")
+                      .replace(/d/ig, "b")
+                      .replace(/e/ig, "c");
+
+      Buf.readStringDelimiter(strlen);
+    }
+  } else /* RILQUIRKS_SMSC_ADDRESS_FORMAT === "text" */ {
+    let text = Buf.readString();
+    let segments = text.split(",", 2);
+    // Parse TOA only if it presents since some devices might omit the TOA
+    // segment in the reported SMSC address. If TOA does not present, keep the
+    // default value TOA_UNKNOWN.
+    if (segments.length === 2) {
+      tosca = this.parseInt(segments[1], TOA_UNKNOWN, 10);
+    }
+
+    smsc = segments[0].replace(/\"/g, "");
+  }
+
+  // Convert the NPI value to the corresponding index of CALLED_PARTY_BCD_NPI
+  // array. If the value does not present in the array, use
+  // CALLED_PARTY_BCD_NPI_ISDN.
+  let npi = CALLED_PARTY_BCD_NPI.indexOf(tosca & 0xf);
+  if (npi === -1) {
+    npi = CALLED_PARTY_BCD_NPI.indexOf(CALLED_PARTY_BCD_NPI_ISDN);
+  }
+
+  // Extract TON.
+  let ton = (tosca & 0x70) >> 4;
+
+  // Ensure + sign if TON is international, and vice versa.
+  const TON_INTERNATIONAL = (TOA_INTERNATIONAL & 0x70) >> 4;
+  if (ton ===  TON_INTERNATIONAL && smsc.charAt(0) !== "+") {
+    smsc = "+" + smsc;
+  } else if (smsc.charAt(0) === "+" && ton !== TON_INTERNATIONAL) {
+    if (DEBUG) {
+      this.context.debug("SMSC address number begins with '+' while the TON is not international. Change TON to international.");
+    }
+    ton = TON_INTERNATIONAL;
+  }
+
+  options.smscAddress = smsc;
+  options.typeOfNumber = ton;
+  options.numberPlanIdentification = npi;
   this.sendChromeMessage(options);
 };
 RilObject.prototype[REQUEST_SET_SMSC_ADDRESS] = function REQUEST_SET_SMSC_ADDRESS(length, options) {
   if (!options.rilMessageType || options.rilMessageType !== "setSmscAddress") {
     return;
   }
 
-  if (options.rilRequestError) {
-    optioins.errorMsg = RIL_ERROR_TO_GECKO_ERROR[options.rilRequestError];
-  }
-
   this.sendChromeMessage(options);
 };
 RilObject.prototype[REQUEST_REPORT_SMS_MEMORY_STATUS] = function REQUEST_REPORT_SMS_MEMORY_STATUS(length, options) {
   this.pendingToReportSmsMemoryStatus = !!options.errorMsg;
 };
 RilObject.prototype[REQUEST_REPORT_STK_SERVICE_IS_RUNNING] = null;
 RilObject.prototype[REQUEST_CDMA_GET_SUBSCRIPTION_SOURCE] = null;
 RilObject.prototype[REQUEST_ISIM_AUTHENTICATION] = null;
--- a/dom/system/gonk/tests/marionette/head.js
+++ b/dom/system/gonk/tests/marionette/head.js
@@ -15,23 +15,25 @@ const NETWORK_STATE_CONNECTED = Ci.nsINe
 const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTING;
 const NETWORK_STATE_DISCONNECTED = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
 
 const NETWORK_TYPE_MOBILE = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
 const NETWORK_TYPE_MOBILE_MMS = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS;
 const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL;
 const NETWORK_TYPE_MOBILE_IMS = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
 const NETWORK_TYPE_MOBILE_DUN = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
+const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA;
 
 const networkTypes = [
   NETWORK_TYPE_MOBILE,
   NETWORK_TYPE_MOBILE_MMS,
   NETWORK_TYPE_MOBILE_SUPL,
   NETWORK_TYPE_MOBILE_IMS,
-  NETWORK_TYPE_MOBILE_DUN
+  NETWORK_TYPE_MOBILE_DUN,
+  NETWORK_TYPE_MOBILE_FOTA
 ];
 
 let Promise = Cu.import("resource://gre/modules/Promise.jsm").Promise;
 
 let ril = Cc["@mozilla.org/ril;1"].getService(Ci.nsIRadioInterfaceLayer);
 ok(ril, "ril.constructor is " + ril.constructor);
 
 let radioInterface = ril.getRadioInterface(0);
--- a/dom/system/gonk/tests/marionette/test_data_connection.js
+++ b/dom/system/gonk/tests/marionette/test_data_connection.js
@@ -4,17 +4,17 @@
 MARIONETTE_TIMEOUT = 60000;
 MARIONETTE_HEAD_JS = "head.js";
 
 function setEmulatorAPN() {
   let apn = [
     [{"carrier":"T-Mobile US",
       "apn":"epc.tmobile.com",
       "mmsc":"http://mms.msg.eng.t-mobile.com/mms/wapenc",
-      "types":["default","supl","mms","ims","dun"]}]
+      "types":["default","supl","mms","ims","dun", "fota"]}]
   ];
 
   return setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, apn);
 }
 
 // Test initial State
 function testInitialState() {
   log("= testInitialState =");
@@ -52,16 +52,17 @@ function testNonDefaultDataConnection() 
     .then(value => {
       currentApn = value;
     })
     .then(setEmulatorAPN)
     .then(() => doTestNonDefaultDataConnection(NETWORK_TYPE_MOBILE_MMS))
     .then(() => doTestNonDefaultDataConnection(NETWORK_TYPE_MOBILE_SUPL))
     .then(() => doTestNonDefaultDataConnection(NETWORK_TYPE_MOBILE_IMS))
     .then(() => doTestNonDefaultDataConnection(NETWORK_TYPE_MOBILE_DUN))
+    .then(() => doTestNonDefaultDataConnection(NETWORK_TYPE_MOBILE_FOTA))
     // Restore APN settings
     .then(() => setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, currentApn));
 }
 
 // Start test
 startTestBase(function() {
   return testInitialState()
     .then(() => testDefaultDataConnection())
--- a/dom/system/gonk/tests/marionette/test_multiple_data_connection.js
+++ b/dom/system/gonk/tests/marionette/test_multiple_data_connection.js
@@ -19,17 +19,20 @@ function setEmulatorAPN() {
                { "carrier":"T-Mobile US",
                  "apn":"epc3.tmobile.com",
                  "types":["supl"] },
                { "carrier":"T-Mobile US",
                  "apn":"epc4.tmobile.com",
                  "types":["ims"] },
                { "carrier":"T-Mobile US",
                  "apn":"epc5.tmobile.com",
-                 "types":["dun"] }]];
+                 "types":["dun"] },
+               { "carrier":"T-Mobile US",
+                 "apn":"epc6.tmobile.com",
+                 "types":["fota"] }]];
 
   return setSettings(SETTINGS_KEY_DATA_APN_SETTINGS, apn);
 }
 
 // Test initial State
 function testInitialState() {
   log("= testInitialState =");
 
--- a/dom/system/gonk/tests/test_ril_worker_smsc_address.js
+++ b/dom/system/gonk/tests/test_ril_worker_smsc_address.js
@@ -1,40 +1,57 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this);
 
 const SMSC_ATT = '+13123149810';
 const SMSC_ATT_TYPO = '+++1312@@@314$$$9,8,1,0';
 const SMSC_ATT_TEXT = '"+13123149810",145';
+const SMSC_ATT_TEXT_INCORRECT_TOA = '"+13123149810",129';
 const SMSC_ATT_PDU = '07913121139418F0';
 const SMSC_O2 = '+447802000332';
 const SMSC_O2_TEXT = '"+447802000332",145';
 const SMSC_O2_PDU = '0791448720003023';
+const SMSC_EMPTY = '';
 const SMSC_TON_UNKNOWN = '0407485455'
 const SMSC_TON_UNKNOWN_TEXT = '"0407485455",129';
+const SMSC_TON_UNKNOWN_TEXT_NO_TOA = '"0407485455"';
+const SMSC_TON_UNKNOWN_TEXT_INVALID_TOA = '"0407485455",abc';
 const SMSC_TON_UNKNOWN_PDU = '06814070844555';
+const SMSC_EMPTY_PDU = 'FFFFFFFFFFFFFFFFFFFFFFFF';
+const SMSC_EMPTY_TEXT = '';
 
 function run_test() {
   run_next_test();
 }
 
 function setSmsc(context, smsc, ton, npi, expected) {
-  context.Buf.sendParcel = function() {
+  context.Buf.postRILMessage = function() {
     equal(this.readString(), expected);
   };
 
   context.RIL.setSmscAddress({
       smscAddress: smsc,
       typeOfNumber: ton,
       numberPlanIdentification: npi
   });
 }
 
+function getSmsc(worker, context, raw, smsc, ton, npi) {
+  worker.postMessage = function(message) {
+    equal(message.smscAddress, smsc);
+    equal(message.typeOfNumber, ton);
+    equal(message.numberPlanIdentification, npi);
+  }
+
+  context.Buf.writeString(raw);
+  context.RIL[REQUEST_GET_SMSC_ADDRESS](0, { rilMessageType: "getSmscAddress"});
+}
+
 add_test(function test_setSmscAddress() {
   let worker = newUint8Worker();
   let context = worker.ContextPool._contexts[0];
   let parcelTypes = [];
   context.Buf.newParcel = (type, options) => parcelTypes.push(type);
 
   // Test text mode.
   worker.RILQUIRKS_SMSC_ADDRESS_FORMAT = "text";
@@ -64,8 +81,32 @@ add_test(function test_setSmscAddress() 
   equal(parcelTypes.pop(), REQUEST_SET_SMSC_ADDRESS);
 
   setSmsc(context, SMSC_TON_UNKNOWN, 0, 1, SMSC_TON_UNKNOWN_PDU);
   equal(parcelTypes.pop(), REQUEST_SET_SMSC_ADDRESS);
 
   run_next_test();
 });
 
+add_test(function test_getSmscAddress() {
+  let worker = newUint8Worker();
+  let context = worker.ContextPool._contexts[0];
+
+  // Test text mode.
+  worker.RILQUIRKS_SMSC_ADDRESS_FORMAT = "text";
+  getSmsc(worker, context, SMSC_ATT_TEXT, SMSC_ATT, 1, 1);
+  getSmsc(worker, context, SMSC_ATT_TEXT_INCORRECT_TOA, SMSC_ATT, 1, 1);
+  getSmsc(worker, context, SMSC_O2_TEXT, SMSC_O2, 1, 1);
+  getSmsc(worker, context, SMSC_TON_UNKNOWN_TEXT, SMSC_TON_UNKNOWN, 0, 1);
+  getSmsc(worker, context, SMSC_TON_UNKNOWN_TEXT_NO_TOA, SMSC_TON_UNKNOWN, 0, 1);
+  getSmsc(worker, context, SMSC_TON_UNKNOWN_TEXT_INVALID_TOA, SMSC_TON_UNKNOWN,
+    0, 1);
+  getSmsc(worker, context, SMSC_EMPTY_TEXT, SMSC_EMPTY, 0, 1);
+
+  // Test pdu mode.
+  worker.RILQUIRKS_SMSC_ADDRESS_FORMAT = "pdu";
+  getSmsc(worker, context, SMSC_ATT_PDU, SMSC_ATT, 1, 1);
+  getSmsc(worker, context, SMSC_O2_PDU, SMSC_O2, 1, 1);
+  getSmsc(worker, context, SMSC_TON_UNKNOWN_PDU, SMSC_TON_UNKNOWN, 0, 1);
+  getSmsc(worker, context, SMSC_EMPTY_PDU, SMSC_EMPTY, 0, 1);
+
+  run_next_test();
+});
--- a/dom/webidl/MozMobileMessageManager.webidl
+++ b/dom/webidl/MozMobileMessageManager.webidl
@@ -189,17 +189,17 @@ interface MozMobileMessageManager : Even
   DOMCursor getThreads();
 
   [Throws]
   DOMRequest retrieveMMS(long id);
   [Throws]
   DOMRequest retrieveMMS(MozMmsMessage message);
 
   [Throws]
-  DOMRequest getSmscAddress(optional unsigned long serviceId);
+  Promise<SmscAddress> getSmscAddress(optional unsigned long serviceId);
 
   /**
    * Set the SMSC address.
    *
    * @param smscAddress
    *        SMSC address to use.
    *        Reject if smscAddress.address does not present.
    * @param serviceId (optional)
--- a/media/mtransport/gonk_addrs.cpp
+++ b/media/mtransport/gonk_addrs.cpp
@@ -39,17 +39,18 @@ GetInterfaces(std::vector<NetworkInterfa
   nsCOMPtr<nsINetworkInterfaceListService> listService =
     do_GetService("@mozilla.org/network/interface-list-service;1", &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   int32_t flags =
     nsINetworkInterfaceListService::LIST_NOT_INCLUDE_SUPL_INTERFACES |
     nsINetworkInterfaceListService::LIST_NOT_INCLUDE_MMS_INTERFACES |
     nsINetworkInterfaceListService::LIST_NOT_INCLUDE_IMS_INTERFACES |
-    nsINetworkInterfaceListService::LIST_NOT_INCLUDE_DUN_INTERFACES;
+    nsINetworkInterfaceListService::LIST_NOT_INCLUDE_DUN_INTERFACES |
+    nsINetworkInterfaceListService::LIST_NOT_INCLUDE_FOTA_INTERFACES;
   nsCOMPtr<nsINetworkInterfaceList> networkList;
   NS_ENSURE_SUCCESS(listService->GetDataInterfaceList(flags,
                                                       getter_AddRefs(networkList)),
                     NS_ERROR_FAILURE);
 
   // Translate nsINetworkInterfaceList to NetworkInterface.
   int32_t listLength;
   NS_ENSURE_SUCCESS(networkList->GetNumberOfInterface(&listLength),
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -648,20 +648,16 @@ just addresses the organization to follo
 
 <!-- These are only used for accessibility for the done and overflow-menu buttons in the actionbar.
      They are never shown to users -->
 <!ENTITY actionbar_menu "Menu">
 <!ENTITY actionbar_done "Done">
 
 <!-- Voice search in the awesome bar -->
 <!ENTITY voicesearch_prompt "Speak now">
-<!ENTITY voicesearch_failed_title "&brandShortName; Voice Search">
-<!ENTITY voicesearch_failed_message "There is a problem with voice search right now. Please try later.">
-<!ENTITY voicesearch_failed_message_recoverable "Sorry! We could not recognize your words. Please try again.">
-<!ENTITY voicesearch_failed_retry "Try again">
 
 <!-- Localization note (remote_tabs_last_synced): the variable is replaced by a
      "relative time span string" produced by Android.  This string describes the
      time the tabs were last synced relative to the current time; examples
      include "42 minutes ago", "4 days ago", "last week", etc. The subject of
      "Last synced" is one of the user's other Sync clients, typically Firefox on
      their desktop or laptop.-->
 <!ENTITY remote_tabs_last_synced "Last synced: &formatS;">
--- a/mobile/android/base/preferences/GeckoPreferences.java
+++ b/mobile/android/base/preferences/GeckoPreferences.java
@@ -684,18 +684,18 @@ OnSharedPreferenceChangeListener
                 } else if (pref instanceof PanelsPreferenceCategory) {
                     mPanelsPreferenceCategory = (PanelsPreferenceCategory) pref;
                 }
                 if((AppConstants.MOZ_ANDROID_TAB_QUEUE && AppConstants.NIGHTLY_BUILD) && (PREFS_CUSTOMIZE_SCREEN.equals(key))) {
                     // Only change the customize pref screen summary on nightly builds with the tab queue build flag.
                     pref.setSummary(getString(R.string.pref_category_customize_alt_summary));
                 }
                 if (getResources().getString(R.string.pref_category_input_options).equals(key)) {
-                    if (!AppConstants.NIGHTLY_BUILD || (!InputOptionsUtils.supportsVoiceRecognizer(getApplicationContext(), getResources().getString(R.string.voicesearch_prompt)) &&
-                            !InputOptionsUtils.supportsQrCodeReader(getApplicationContext()))) {
+                    if (!InputOptionsUtils.supportsVoiceRecognizer(getApplicationContext(), getResources().getString(R.string.voicesearch_prompt)) &&
+                            !InputOptionsUtils.supportsQrCodeReader(getApplicationContext())) {
                         preferences.removePreference(pref);
                         i--;
                         continue;
                     }
                 }
                 if (PREFS_DEVTOOLS.equals(key) &&
                     RestrictedProfiles.isUserRestricted(this)) {
                     preferences.removePreference(pref);
@@ -819,17 +819,17 @@ OnSharedPreferenceChangeListener
                 } else if (PREFS_TAB_QUEUE.equals(key)) {
                     // Only show tab queue pref on nightly builds with the tab queue build flag.
                     if (!(AppConstants.MOZ_ANDROID_TAB_QUEUE && AppConstants.NIGHTLY_BUILD)) {
                         preferences.removePreference(pref);
                         i--;
                         continue;
                     }
                 } else if (PREFS_VOICE_INPUT_ENABLED.equals(key)) {
-                    if (!AppConstants.NIGHTLY_BUILD || !InputOptionsUtils.supportsVoiceRecognizer(getApplicationContext(), getResources().getString(R.string.voicesearch_prompt))) {
+                    if (!InputOptionsUtils.supportsVoiceRecognizer(getApplicationContext(), getResources().getString(R.string.voicesearch_prompt))) {
                         // Remove UI for voice input on non nightly builds.
                         preferences.removePreference(pref);
                         i--;
                         continue;
                     }
                 } else if (PREFS_QRCODE_ENABLED.equals(key)) {
                     if (!AppConstants.NIGHTLY_BUILD || !InputOptionsUtils.supportsQrCodeReader(getApplicationContext())) {
                         // Remove UI for qr code input on non nightly builds
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -535,20 +535,16 @@
   <string name="exit_guest_session_title">&exit_guest_session_title;</string>
   <string name="exit_guest_session_text">&exit_guest_session_text;</string>
 
   <string name="actionbar_menu">&actionbar_menu;</string>
   <string name="actionbar_done">&actionbar_done;</string>
 
   <!-- Voice search from the Awesome Bar -->
   <string name="voicesearch_prompt">&voicesearch_prompt;</string>
-  <string name="voicesearch_failed_title">&voicesearch_failed_title;</string>
-  <string name="voicesearch_failed_message">&voicesearch_failed_message;</string>
-  <string name="voicesearch_failed_message_recoverable">&voicesearch_failed_message_recoverable;</string>
-  <string name="voicesearch_failed_retry">&voicesearch_failed_retry;</string>
 
   <!-- Miscellaneous -->
   <string name="ellipsis">&ellipsis;</string>
 
   <string name="colon">&colon;</string>
 
   <string name="percent">&percent;</string>
 
--- a/mobile/android/base/toolbar/ToolbarEditLayout.java
+++ b/mobile/android/base/toolbar/ToolbarEditLayout.java
@@ -213,51 +213,31 @@ public class ToolbarEditLayout extends T
    }
 
     protected void restoreTabEditingState(final TabEditingState editingState) {
         mEditText.setText(editingState.lastEditingText);
         mEditText.setSelection(editingState.selectionStart, editingState.selectionEnd);
     }
 
     private boolean voiceIsEnabled(Context context, String prompt) {
-        // Voice input is enabled for nightly only
-        if(!AppConstants.NIGHTLY_BUILD) {
-            return false;
-        }
         final boolean voiceIsSupported = InputOptionsUtils.supportsVoiceRecognizer(context, prompt);
         if (!voiceIsSupported) {
             return false;
         }
         return GeckoSharedPrefs.forApp(context)
                 .getBoolean(GeckoPreferences.PREFS_VOICE_INPUT_ENABLED, true);
     }
 
     private void launchVoiceRecognizer() {
         final Intent intent = InputOptionsUtils.createVoiceRecognizerIntent(getResources().getString(R.string.voicesearch_prompt));
 
         Activity activity = GeckoAppShell.getGeckoInterface().getActivity();
         ActivityHandlerHelper.startIntentForActivity(activity, intent, new ActivityResultHandler() {
             @Override
             public void onActivityResult(int resultCode, Intent data) {
-                switch (resultCode) {
-                    case RecognizerIntent.RESULT_CLIENT_ERROR:
-                    case RecognizerIntent.RESULT_NETWORK_ERROR:
-                    case RecognizerIntent.RESULT_SERVER_ERROR:
-                        // We have an temporarily unrecoverable error.
-                        handleVoiceSearchError(false);
-                        break;
-                    case RecognizerIntent.RESULT_AUDIO_ERROR:
-                    case RecognizerIntent.RESULT_NO_MATCH:
-                        // Maybe the user can say it differently?
-                        handleVoiceSearchError(true);
-                        break;
-                    case Activity.RESULT_CANCELED:
-                        break;
-                }
-
                 if (resultCode != Activity.RESULT_OK) {
                     return;
                 }
 
                 // We have RESULT_OK, not RESULT_NO_MATCH so it should be safe to assume that
                 // we have at least one match. We only need one: this will be
                 // used for showing the user search engines with this search term in it.
                 List<String> voiceStrings = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
@@ -267,43 +247,16 @@ public class ToolbarEditLayout extends T
 
                 final InputMethodManager imm =
                         (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
                 imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT);
             }
         });
     }
 
-    private void handleVoiceSearchError(boolean offerRetry) {
-        AlertDialog.Builder builder = new AlertDialog.Builder(getContext())
-                .setTitle(R.string.voicesearch_failed_title)
-                .setIcon(R.drawable.icon).setNeutralButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
-                    @Override
-                    public void onClick(DialogInterface dialog, int which) {
-                        dialog.dismiss();
-                    }
-                });
-
-        if (offerRetry) {
-            builder.setMessage(R.string.voicesearch_failed_message_recoverable)
-                    .setNegativeButton(R.string.voicesearch_failed_retry, new DialogInterface.OnClickListener() {
-                        @Override
-                        public void onClick(DialogInterface dialog, int which) {
-                            launchVoiceRecognizer();
-                        }
-                    });
-        } else {
-            builder.setMessage(R.string.voicesearch_failed_message);
-        }
-
-        AlertDialog dialog = builder.create();
-
-        dialog.show();
-    }
-
     private boolean qrCodeIsEnabled(Context context) {
         // QR code is enabled for nightly only
         if(!AppConstants.NIGHTLY_BUILD) {
             return false;
         }
         final boolean qrCodeIsSupported = InputOptionsUtils.supportsQrCodeReader(context);
         if (!qrCodeIsSupported) {
             return false;
--- a/mobile/android/tests/browser/robocop/testSettingsMenuItems.java
+++ b/mobile/android/tests/browser/robocop/testSettingsMenuItems.java
@@ -224,17 +224,17 @@ public class testSettingsMenuItems exten
         }
 
         // Tablet: we don't allow a page title option.
         if (HardwareUtils.isTablet()) {
             settingsMap.get(PATH_DISPLAY).remove(TITLE_BAR_LABEL_ARR);
         }
 
         // Voice input
-        if (AppConstants.NIGHTLY_BUILD && InputOptionsUtils.supportsVoiceRecognizer(this.getActivity().getApplicationContext(), this.getActivity().getResources().getString(R.string.voicesearch_prompt))) {
+        if (InputOptionsUtils.supportsVoiceRecognizer(this.getActivity().getApplicationContext(), this.getActivity().getResources().getString(R.string.voicesearch_prompt))) {
             String[] voiceInputUi = { mStringHelper.VOICE_INPUT_TITLE_LABEL, mStringHelper.VOICE_INPUT_SUMMARY_LABEL };
             settingsMap.get(PATH_DISPLAY).add(voiceInputUi);
         }
     }
 
     public void checkMenuHierarchy(Map<String[], List<String[]>> settingsMap) {
         // Check the items within each category.
         String section = null;
--- a/toolkit/components/telemetry/TelemetryController.jsm
+++ b/toolkit/components/telemetry/TelemetryController.jsm
@@ -82,16 +82,18 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 XPCOMUtils.defineLazyModuleGetter(this, "UpdateChannel",
                                   "resource://gre/modules/UpdateChannel.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetryArchive",
                                   "resource://gre/modules/TelemetryArchive.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetrySession",
                                   "resource://gre/modules/TelemetrySession.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetrySend",
                                   "resource://gre/modules/TelemetrySend.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetryReportingPolicy",
+                                  "resource://gre/modules/TelemetryReportingPolicy.jsm");
 
 /**
  * Setup Telemetry logging. This function also gets called when loggin related
  * preferences change.
  */
 let gLogger = null;
 let gLogAppenderDump = null;
 function configureLogging() {
@@ -646,16 +648,19 @@ let Impl = {
     // TODO: move this after the |enableTelemetryRecording| block and drop the
     // PREF_FHR_ENABLED check once we permanently switch over to unified Telemetry.
     if (!this._sessionRecorder &&
         (Preferences.get(PREF_FHR_ENABLED, true) || IS_UNIFIED_TELEMETRY)) {
       this._sessionRecorder = new SessionRecorder(PREF_SESSIONS_BRANCH);
       this._sessionRecorder.onStartup();
     }
 
+    // This will trigger displaying the datachoices infobar.
+    TelemetryReportingPolicy.setup();
+
     if (!this.enableTelemetryRecording()) {
       this._log.config("setupChromeProcess - Telemetry recording is disabled, skipping Chrome process setup.");
       return Promise.resolve();
     }
 
     this._attachObservers();
 
     // For very short session durations, we may never load the client
@@ -721,16 +726,19 @@ let Impl = {
       return;
     }
 
     Preferences.ignore(PREF_BRANCH_LOG, configureLogging);
     this._detachObservers();
 
     // Now do an orderly shutdown.
     try {
+      // Stop the datachoices infobar display.
+      TelemetryReportingPolicy.shutdown();
+
       // Stop any ping sending.
       yield TelemetrySend.shutdown();
 
       // First wait for clients processing shutdown.
       yield this._shutdownBarrier.wait();
 
       // ... and wait for any outstanding async ping activity.
       yield this._connectionsBarrier.wait();
new file mode 100644
--- /dev/null
+++ b/toolkit/components/telemetry/TelemetryReportingPolicy.jsm
@@ -0,0 +1,419 @@
+/* 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";
+
+this.EXPORTED_SYMBOLS = [
+  "TelemetryReportingPolicy"
+];
+
+const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu} = Components;
+
+Cu.import("resource://gre/modules/Log.jsm", this);
+Cu.import("resource://gre/modules/Preferences.jsm", this);
+Cu.import("resource://gre/modules/Services.jsm", this);
+Cu.import("resource://gre/modules/Timer.jsm", this);
+Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
+Cu.import("resource://services-common/observers.js", this);
+
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetrySend",
+                                  "resource://gre/modules/TelemetrySend.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "UpdateChannel",
+                                  "resource://gre/modules/UpdateChannel.jsm");
+
+const LOGGER_NAME = "Toolkit.Telemetry";
+const LOGGER_PREFIX = "TelemetryReportingPolicy::";
+
+// Oldest year to allow in date preferences. The FHR infobar was implemented in
+// 2012 and no dates older than that should be encountered.
+const OLDEST_ALLOWED_ACCEPTANCE_YEAR = 2012;
+
+const PREF_BRANCH = "datareporting.policy.";
+// Indicates whether this is the first run or not. This is used to decide when to display
+// the policy.
+const PREF_FIRST_RUN = "toolkit.telemetry.reportingpolicy.firstRun";
+// Allows to skip the datachoices infobar. This should only be used in tests.
+const PREF_BYPASS_NOTIFICATION = PREF_BRANCH + "dataSubmissionPolicyBypassNotification";
+// The submission kill switch: if this preference is disable, no submission will ever take place.
+const PREF_DATA_SUBMISSION_ENABLED = PREF_BRANCH + "dataSubmissionEnabled";
+// This preference holds the current policy version, which overrides
+// DEFAULT_DATAREPORTING_POLICY_VERSION
+const PREF_CURRENT_POLICY_VERSION = PREF_BRANCH + "currentPolicyVersion";
+// This indicates the minimum required policy version. If the accepted policy version
+// is lower than this, the notification bar must be showed again.
+const PREF_MINIMUM_POLICY_VERSION = PREF_BRANCH + "minimumPolicyVersion";
+// The version of the accepted policy.
+const PREF_ACCEPTED_POLICY_VERSION = PREF_BRANCH + "dataSubmissionPolicyAcceptedVersion";
+// The date user accepted the policy.
+const PREF_ACCEPTED_POLICY_DATE = PREF_BRANCH + "dataSubmissionPolicyNotifiedTime";
+// The following preferences are deprecated and will be purged during the preferences
+// migration process.
+const DEPRECATED_FHR_PREFS = [
+  PREF_BRANCH + "dataSubmissionPolicyAccepted",
+  PREF_BRANCH + "dataSubmissionPolicyBypassAcceptance",
+  PREF_BRANCH + "dataSubmissionPolicyResponseType",
+  PREF_BRANCH + "dataSubmissionPolicyResponseTime"
+];
+
+// How much time until we display the data choices notification bar, on the first run.
+const NOTIFICATION_DELAY_FIRST_RUN_MSEC = 60 * 1000; // 60s
+// Same as above, for the next runs.
+const NOTIFICATION_DELAY_NEXT_RUNS_MSEC = 10 * 1000; // 10s
+
+/**
+ * This is a policy object used to override behavior within this module.
+ * Tests override properties on this object to allow for control of behavior
+ * that would otherwise be very hard to cover.
+ */
+let Policy = {
+  now: () => new Date(),
+  setShowInfobarTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
+  clearShowInfobarTimeout: (id) => clearTimeout(id),
+};
+
+/**
+ * Represents a request to display data policy.
+ *
+ * Receivers of these instances are expected to call one or more of the on*
+ * functions when events occur.
+ *
+ * When one of these requests is received, the first thing a callee should do
+ * is present notification to the user of the data policy. When the notice
+ * is displayed to the user, the callee should call `onUserNotifyComplete`.
+ *
+ * If for whatever reason the callee could not display a notice,
+ * it should call `onUserNotifyFailed`.
+ *
+ * @param {Object} aLog The log object used to log the error in case of failures.
+ */
+function NotifyPolicyRequest(aLog) {
+  this._log = aLog;
+}
+
+NotifyPolicyRequest.prototype = Object.freeze({
+  /**
+   * Called when the user is notified of the policy.
+   */
+  onUserNotifyComplete: function () {
+    return TelemetryReportingPolicyImpl._infobarShownCallback();
+   },
+
+  /**
+   * Called when there was an error notifying the user about the policy.
+   *
+   * @param error
+   *        (Error) Explains what went wrong.
+   */
+  onUserNotifyFailed: function (error) {
+    this._log.error("onUserNotifyFailed - " + error);
+  },
+});
+
+this.TelemetryReportingPolicy = {
+  // The current policy version number. If the version number stored in the prefs
+  // is smaller than this, data upload will be disabled until the user is re-notified
+  // about the policy changes.
+  DEFAULT_DATAREPORTING_POLICY_VERSION: 1,
+
+  /**
+   * Setup the policy.
+   */
+  setup: function() {
+    return TelemetryReportingPolicyImpl.setup();
+  },
+
+  /**
+   * Shutdown and clear the policy.
+   */
+  shutdown: function() {
+    return TelemetryReportingPolicyImpl.shutdown();
+  },
+
+  /**
+   * Check if we are allowed to upload data. In order to submit data both these conditions
+   * should be true:
+   * - The data submission preference should be true.
+   * - The datachoices infobar should have been displayed.
+   *
+   * @return {Boolean} True if we are allowed to upload data, false otherwise.
+   */
+  canUpload: function() {
+    return TelemetryReportingPolicyImpl.canUpload();
+  },
+
+  /**
+   * Test only method, restarts the policy.
+   */
+  reset: function() {
+    return TelemetryReportingPolicyImpl.reset();
+  },
+
+  /**
+   * Test only method, used to check if user is notified of the policy in tests.
+   */
+  testIsUserNotified: function() {
+    return TelemetryReportingPolicyImpl.isUserNotifiedOfCurrentPolicy;
+  },
+
+  /**
+   * Test only method, used to simulate the infobar being shown in xpcshell tests.
+   */
+  testInfobarShown: function() {
+    return TelemetryReportingPolicyImpl._infobarShownCallback();
+  },
+};
+
+let TelemetryReportingPolicyImpl = {
+  _logger: null,
+  // Keep track of the notification status if user wasn't notified already.
+  _notificationInProgress: false,
+  // The timer used to show the datachoices notification at startup.
+  _startupNotificationTimerId: null,
+
+  get _log() {
+    if (!this._logger) {
+      this._logger = Log.repository.getLoggerWithMessagePrefix(LOGGER_NAME, LOGGER_PREFIX);
+    }
+
+    return this._logger;
+  },
+
+  /**
+   * Get the date the policy was notified.
+   * @return {Object} A date object or null on errors.
+   */
+  get dataSubmissionPolicyNotifiedDate() {
+    let prefString = Preferences.get(PREF_ACCEPTED_POLICY_DATE, 0);
+    let valueInteger = parseInt(prefString, 10);
+
+    // If nothing or an invalid value is saved in the prefs, bail out.
+    if (Number.isNaN(valueInteger) || valueInteger == 0) {
+      this._log.error("get dataSubmissionPolicyNotifiedDate - Invalid date stored.");
+      return null;
+    }
+
+    // Make sure the notification date is newer then the oldest allowed date.
+    let date = new Date(valueInteger);
+    if (date.getFullYear() < OLDEST_ALLOWED_ACCEPTANCE_YEAR) {
+      this._log.error("get dataSubmissionPolicyNotifiedDate - The stored date is too old.");
+      return null;
+    }
+
+    return date;
+  },
+
+  /**
+   * Set the date the policy was notified.
+   * @param {Object} aDate A valid date object.
+   */
+  set dataSubmissionPolicyNotifiedDate(aDate) {
+    this._log.trace("set dataSubmissionPolicyNotifiedDate - aDate: " + aDate);
+
+    if (!aDate || aDate.getFullYear() < OLDEST_ALLOWED_ACCEPTANCE_YEAR) {
+      this._log.error("set dataSubmissionPolicyNotifiedDate - Invalid notification date.");
+      return;
+    }
+
+    Preferences.set(PREF_ACCEPTED_POLICY_DATE, aDate.getTime().toString());
+  },
+
+  /**
+   * Whether submission of data is allowed.
+   *
+   * This is the master switch for remote server communication. If it is
+   * false, we never request upload or deletion.
+   */
+  get dataSubmissionEnabled() {
+    // Default is true because we are opt-out.
+    return Preferences.get(PREF_DATA_SUBMISSION_ENABLED, true);
+  },
+
+  get currentPolicyVersion() {
+    return Preferences.get(PREF_CURRENT_POLICY_VERSION,
+                           TelemetryReportingPolicy.DEFAULT_DATAREPORTING_POLICY_VERSION);
+  },
+
+  /**
+   * The minimum policy version which for dataSubmissionPolicyAccepted to
+   * to be valid.
+   */
+  get minimumPolicyVersion() {
+    const minPolicyVersion = Preferences.get(PREF_MINIMUM_POLICY_VERSION, 1);
+
+    // First check if the current channel has a specific minimum policy version. If not,
+    // use the general minimum policy version.
+    let channel = "";
+    try {
+      channel = UpdateChannel.get(false);
+    } catch(e) {
+      this._log.error("minimumPolicyVersion - Unable to retrieve the current channel.");
+      return minPolicyVersion;
+    }
+    const channelPref = PREF_MINIMUM_POLICY_VERSION + ".channel-" + channel;
+    return Preferences.get(channelPref, minPolicyVersion);
+  },
+
+  get dataSubmissionPolicyAcceptedVersion() {
+    return Preferences.get(PREF_ACCEPTED_POLICY_VERSION, 0);
+  },
+
+  set dataSubmissionPolicyAcceptedVersion(value) {
+    Preferences.set(PREF_ACCEPTED_POLICY_VERSION, value);
+  },
+
+  /**
+   * Checks to see if the user has been notified about data submission
+   * @return {Bool} True if user has been notified and the notification is still valid,
+   *         false otherwise.
+   */
+  get isUserNotifiedOfCurrentPolicy() {
+    // If we don't have a sane notification date, the user was not notified yet.
+    if (!this.dataSubmissionPolicyNotifiedDate ||
+        this.dataSubmissionPolicyNotifiedDate.getTime() <= 0) {
+      return false;
+    }
+
+    // The accepted policy version should not be less than the minimum policy version.
+    if (this.dataSubmissionPolicyAcceptedVersion < this.minimumPolicyVersion) {
+      return false;
+    }
+
+    // Otherwise the user was already notified.
+    return true;
+  },
+
+  /**
+   * Test only method, restarts the policy.
+   */
+  reset: function() {
+    this.shutdown();
+    return this.setup();
+  },
+
+  /**
+   * Setup the policy.
+   */
+  setup: function() {
+    this._log.trace("setup");
+
+    // Migrate the data choices infobar, if needed.
+    this._migratePreferences();
+
+    // Add the event observers.
+    Services.obs.addObserver(this, "sessionstore-windows-restored", false);
+  },
+
+  /**
+   * Clean up the reporting policy.
+   */
+  shutdown: function() {
+    this._log.trace("shutdown");
+
+    this._detachObservers();
+
+    Policy.clearShowInfobarTimeout(this._startupNotificationTimerId);
+  },
+
+  /**
+   * Detach the observers that were attached during setup.
+   */
+  _detachObservers: function() {
+    Services.obs.removeObserver(this, "sessionstore-windows-restored");
+  },
+
+  /**
+   * Check if we are allowed to upload data. In order to submit data both these conditions
+   * should be true:
+   * - The data submission preference should be true.
+   * - The datachoices infobar should have been displayed.
+   *
+   * @return {Boolean} True if we are allowed to upload data, false otherwise.
+   */
+  canUpload: function() {
+    // If data submission is disabled, there's no point in showing the infobar. Just
+    // forbid to upload.
+    if (!this.dataSubmissionEnabled) {
+      return false;
+    }
+
+    // Make sure the user is notified of the current policy. If he isn't, don't try
+    // to upload anything.
+    if (!this._ensureUserNotified()) {
+      return false;
+    }
+
+    // Submission is enabled and user is notified: upload is allowed.
+    return true;
+  },
+
+  /**
+   * Migrate the data policy preferences, if needed.
+   */
+  _migratePreferences: function() {
+    // Current prefs are mostly the same than the old ones, except for some deprecated ones.
+    for (let pref of DEPRECATED_FHR_PREFS) {
+      Preferences.reset(pref);
+    }
+  },
+
+  /**
+   * Make sure the user is notified about the policy before allowing upload.
+   * @return {Boolean} True if the user was notified, false otherwise.
+   */
+  _ensureUserNotified: function() {
+    const BYPASS_NOTIFICATION = Preferences.get(PREF_BYPASS_NOTIFICATION, false);
+    if (this.isUserNotifiedOfCurrentPolicy || BYPASS_NOTIFICATION) {
+      return true;
+    }
+
+    this._log.trace("ensureUserNotified - User not notified, notifying now.");
+    if (this._notificationInProgress) {
+      this._log.trace("ensureUserNotified - User not notified, notification in progress.");
+      return false;
+    }
+
+    this._notificationInProgress = true;
+    let request = new NotifyPolicyRequest(this._log);
+    Observers.notify("datareporting:notify-data-policy:request", request);
+
+    return false;
+  },
+
+  /**
+   * Called when the user is notified with the infobar.
+   */
+  _infobarShownCallback: function() {
+    this._log.trace("_infobarShownCallback");
+    this._recordNotificationData();
+    TelemetrySend.notifyCanUpload();
+  },
+
+  /**
+   * Record date and the version of the accepted policy.
+   */
+  _recordNotificationData: function() {
+    this._log.trace("_recordNotificationData");
+    this.dataSubmissionPolicyNotifiedDate = Policy.now();
+    this.dataSubmissionPolicyAcceptedVersion = this.currentPolicyVersion;
+    // The user was notified and the notification data saved: the notification
+    // is no longer in progress.
+    this._notificationInProgress = false;
+  },
+
+  observe: function(aSubject, aTopic, aData) {
+    if (aTopic != "sessionstore-windows-restored") {
+      return;
+    }
+
+    const isFirstRun = Preferences.get(PREF_FIRST_RUN, true);
+    const delay =
+      isFirstRun ? NOTIFICATION_DELAY_FIRST_RUN_MSEC: NOTIFICATION_DELAY_NEXT_RUNS_MSEC;
+
+    this._startupNotificationTimerId = Policy.setShowInfobarTimeout(
+        // Calling |canUpload| eventually shows the infobar, if needed.
+        () => this.canUpload(), delay);
+    // We performed at least a run, flip the firstRun preference.
+    Preferences.set(PREF_FIRST_RUN, false);
+  },
+};
--- a/toolkit/components/telemetry/TelemetrySend.jsm
+++ b/toolkit/components/telemetry/TelemetrySend.jsm
@@ -25,16 +25,18 @@ Cu.import("resource://gre/modules/Promis
 Cu.import("resource://gre/modules/Services.jsm", this);
 Cu.import("resource://gre/modules/TelemetryUtils.jsm", this);
 Cu.import("resource://gre/modules/Timer.jsm", this);
 
 XPCOMUtils.defineLazyModuleGetter(this, "AsyncShutdown",
                                   "resource://gre/modules/AsyncShutdown.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "TelemetryStorage",
                                   "resource://gre/modules/TelemetryStorage.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "TelemetryReportingPolicy",
+                                  "resource://gre/modules/TelemetryReportingPolicy.jsm");
 XPCOMUtils.defineLazyServiceGetter(this, "Telemetry",
                                    "@mozilla.org/base/telemetry;1",
                                    "nsITelemetry");
 
 const Utils = TelemetryUtils;
 
 const LOGGER_NAME = "Toolkit.Telemetry";
 const LOGGER_PREFIX = "TelemetrySend::";
@@ -194,16 +196,23 @@ this.TelemetrySend = {
   /**
    * Count of pending pings that were found to be overdue at startup.
    */
   get overduePingsCount() {
     return TelemetrySendImpl.overduePingsCount;
   },
 
   /**
+   * Notify that we can start submitting data to the servers.
+   */
+  notifyCanUpload: function() {
+    return TelemetrySendImpl.notifyCanUpload();
+  },
+
+  /**
    * Only used in tests. Used to reset the module data to emulate a restart.
    */
   reset: function() {
     return TelemetrySendImpl.reset();
   },
 
   /**
    * Only used in tests.
@@ -377,18 +386,18 @@ let SendScheduler = {
       }
 
       // Get a list of pending pings, sorted by last modified, descending.
       // Filter out all the pings we can't send now. This addresses scenarios like "deletion" pings
       // which can be send even when upload is disabled.
       let pending = TelemetryStorage.getPendingPingList();
       let current = TelemetrySendImpl.getUnpersistedPings();
       this._log.trace("_doSendTask - pending: " + pending.length + ", current: " + current.length);
-      pending = pending.filter(p => TelemetrySendImpl.canSend(p));
-      current = current.filter(p => TelemetrySendImpl.canSend(p));
+      pending = pending.filter(p => TelemetrySendImpl.sendingEnabled(p));
+      current = current.filter(p => TelemetrySendImpl.sendingEnabled(p));
       this._log.trace("_doSendTask - can send - pending: " + pending.length + ", current: " + current.length);
 
       // Bail out if there is nothing to send.
       if ((pending.length == 0) && (current.length == 0)) {
         this._log.trace("_doSendTask - no pending pings, bailing out");
         this._sendTaskState = "bail out - no pings to send";
         return;
       }
@@ -627,36 +636,45 @@ let TelemetrySendImpl = {
       "TELEMETRY_PING",
     ];
 
     histograms.forEach(h => Telemetry.getHistogramById(h).clear());
 
     return SendScheduler.reset();
   },
 
+  /**
+   * Notify that we can start submitting data to the servers.
+   */
+  notifyCanUpload: function() {
+    // Let the scheduler trigger sending pings if possible.
+    SendScheduler.triggerSendingPings(true);
+    return this.promisePendingPingActivity();
+  },
+
   observe: function(subject, topic, data) {
     switch(topic) {
     case TOPIC_IDLE_DAILY:
       SendScheduler.triggerSendingPings(true);
       break;
     }
   },
 
   submitPing: function(ping) {
     this._log.trace("submitPing - ping id: " + ping.id);
 
-    if (!this.canSend(ping)) {
+    if (!this.sendingEnabled(ping)) {
       this._log.trace("submitPing - Telemetry is not allowed to send pings.");
       return Promise.resolve();
     }
 
-    if (!this._sendingEnabled) {
+    if (!this.canSendNow) {
       // Sending is disabled or throttled, add this to the persisted pending pings.
       this._log.trace("submitPing - can't send ping now, persisting to disk - " +
-                      "sendingEnabled: " + this._sendingEnabled);
+                      "canSendNow: " + this.canSendNow);
       return TelemetryStorage.savePendingPing(ping);
     }
 
     // Let the scheduler trigger sending pings if possible.
     // As a safety mechanism, this resets any currently active throttling.
     this._log.trace("submitPing - can send pings, trying to send now");
     this._currentPings.set(ping.id, ping);
     SendScheduler.triggerSendingPings(true);
@@ -801,17 +819,17 @@ let TelemetrySendImpl = {
       }
     }
 
     let slug = pathComponents.join("/");
     return "/submit/telemetry/" + slug;
   },
 
   _doPing: function(ping, id, isPersisted) {
-    if (!this.canSend(ping)) {
+    if (!this.sendingEnabled(ping)) {
       // We can't send the pings to the server, so don't try to.
       this._log.trace("_doPing - Can't send ping " + ping.id);
       return Promise.resolve();
     }
 
     this._log.trace("_doPing - server: " + this._server + ", persisted: " + isPersisted +
                     ", id: " + id);
 
@@ -905,25 +923,39 @@ let TelemetrySendImpl = {
     Telemetry.getHistogramById("TELEMETRY_COMPRESS").add(new Date() - startTime);
     startTime = new Date();
     request.send(payloadStream);
 
     return deferred.promise;
   },
 
   /**
-   * Check if pings can be sent to the server. If FHR is not allowed to upload,
+   * Check if sending is temporarily disabled.
+   * @return {Boolean} True if we can send pings to the server right now, false if
+   *         sending is temporarily disabled.
+   */
+  get canSendNow() {
+    // If the reporting policy was not accepted yet, don't send pings.
+    if (!TelemetryReportingPolicy.canUpload()) {
+      return false;
+    }
+
+    return this._sendingEnabled;
+  },
+
+  /**
+   * Check if sending is disabled. If FHR is not allowed to upload,
    * pings are not sent to the server (Telemetry is a sub-feature of FHR). If trying
    * to send a deletion ping, don't block it.
    * If unified telemetry is off, don't send pings if Telemetry is disabled.
    *
    * @param {Object} [ping=null] A ping to be checked.
    * @return {Boolean} True if pings can be send to the servers, false otherwise.
    */
-  canSend: function(ping = null) {
+  sendingEnabled: function(ping = null) {
     // We only send pings from official builds, but allow overriding this for tests.
     if (!Telemetry.isOfficialTelemetry && !this._testMode) {
       return false;
     }
 
     // With unified Telemetry, the FHR upload setting controls whether we can send pings.
     // The Telemetry pref enables sending extended data sets instead.
     if (IS_UNIFIED_TELEMETRY) {
--- a/toolkit/components/telemetry/TelemetrySession.jsm
+++ b/toolkit/components/telemetry/TelemetrySession.jsm
@@ -1609,50 +1609,52 @@ let Impl = {
     let payload = this.getSessionPayload(reason, isSubsession);
     payload.childUUID = this._processUUID;
     cpmm.sendAsyncMessage(MESSAGE_TELEMETRY_PAYLOAD, payload);
   },
 
    /**
     * Save both the "saved-session" and the "shutdown" pings to disk.
     */
-  saveShutdownPings: Task.async(function*() {
+  saveShutdownPings: function() {
     this._log.trace("saveShutdownPings");
 
+    // We don't wait for "shutdown" pings to be written to disk before gathering the
+    // "saved-session" payload. Instead we append the promises to this list and wait
+    // on both to be saved after kicking off their collection.
+    let p = [];
+
     if (IS_UNIFIED_TELEMETRY) {
-      try {
-        let shutdownPayload = this.getSessionPayload(REASON_SHUTDOWN, false);
+      let shutdownPayload = this.getSessionPayload(REASON_SHUTDOWN, false);
 
-        let options = {
-          addClientId: true,
-          addEnvironment: true,
-          overwrite: true,
-        };
-        yield TelemetryController.addPendingPing(getPingType(shutdownPayload), shutdownPayload, options);
-      } catch (ex) {
-        this._log.error("saveShutdownPings - failed to submit shutdown ping", ex);
-      }
+      let options = {
+        addClientId: true,
+        addEnvironment: true,
+        overwrite: true,
+      };
+      p.push(TelemetryController.addPendingPing(getPingType(shutdownPayload), shutdownPayload, options)
+                                .catch(e => this._log.error("saveShutdownPings - failed to submit shutdown ping", e)));
      }
 
     // As a temporary measure, we want to submit saved-session too if extended Telemetry is enabled
     // to keep existing performance analysis working.
     if (Telemetry.canRecordExtended) {
-      try {
-        let payload = this.getSessionPayload(REASON_SAVED_SESSION, false);
+      let payload = this.getSessionPayload(REASON_SAVED_SESSION, false);
 
-        let options = {
-          addClientId: true,
-          addEnvironment: true,
-        };
-        yield TelemetryController.addPendingPing(getPingType(payload), payload, options);
-      } catch (ex) {
-        this._log.error("saveShutdownPings - failed to submit saved-session ping", ex);
-      }
+      let options = {
+        addClientId: true,
+        addEnvironment: true,
+      };
+      p.push(TelemetryController.addPendingPing(getPingType(payload), payload, options)
+                                .catch (e => this._log.error("saveShutdownPings - failed to submit saved-session ping", e)));
     }
-  }),
+
+    // Wait on pings to be saved.
+    return Promise.all(p);
+  },
 
 
   testSavePendingPing: function testSaveHistograms() {
     this._log.trace("testSaveHistograms");
     let payload = this.getSessionPayload(REASON_SAVED_SESSION, false);
     let options = {
       addClientId: true,
       addEnvironment: true,
--- a/toolkit/components/telemetry/docs/preferences.rst
+++ b/toolkit/components/telemetry/docs/preferences.rst
@@ -39,8 +39,43 @@ Sending only happens on official builds 
 ``toolkit.telemetry.log.level``
 
   This sets the Telemetry logging verbosity per ``Log.jsm``, with ``Trace`` or ``0`` being the most verbose and the default being ``Warn``.
   By default logging goes only the console service.
 
 ``toolkit.telemetry.log.dump``
 
   Sets whether to dump Telemetry log messages to ``stdout`` too.
+
+Data-choices notification
+-------------------------
+
+``toolkit.telemetry.reportingpolicy.firstRun``
+
+  This preference is not present until the first run. After, its value is set to false. This is used to show the infobar with a more aggressive timeout if it wasn't shown yet.
+
+``datareporting.policy.dataSubmissionEnabled``
+
+  This is the data submission master kill switch. If disabled, no policy is shown or upload takes place, ever.
+
+``datareporting.policy.dataSubmissionPolicyNotifiedTime``
+
+  Records the date user was shown the policy. This preference is also used on Android.
+
+``datareporting.policy.dataSubmissionPolicyAcceptedVersion``
+
+  Records the version of the policy notified to the user. This preference is also used on Android.
+
+``datareporting.policy.dataSubmissionPolicyBypassNotification``
+
+  Used in tests, it allows to skip the notification check.
+
+``datareporting.policy.currentPolicyVersion``
+
+  Stores the current policy version, overrides the default value defined in TelemetryReportingPolicy.jsm.
+
+``datareporting.policy.minimumPolicyVersion``
+
+  The minimum policy version that is accepted for the current policy. This can be set per channel.
+
+``datareporting.policy.minimumPolicyVersion.channel-NAME``
+
+  This is the only channel-specific version that we currently use for the minimum policy version.
--- a/toolkit/components/telemetry/moz.build
+++ b/toolkit/components/telemetry/moz.build
@@ -27,16 +27,17 @@ SOURCES += [
 EXTRA_COMPONENTS += [
     'TelemetryStartup.js',
     'TelemetryStartup.manifest'
 ]
 
 EXTRA_JS_MODULES += [
     'TelemetryArchive.jsm',
     'TelemetryLog.jsm',
+    'TelemetryReportingPolicy.jsm',
     'TelemetrySend.jsm',
     'TelemetryStopwatch.jsm',
     'TelemetryStorage.jsm',
     'TelemetryUtils.jsm',
     'ThirdPartyCookieProbe.jsm',
     'UITelemetry.jsm',
 ]
 
--- a/toolkit/components/telemetry/tests/unit/head.js
+++ b/toolkit/components/telemetry/tests/unit/head.js
@@ -233,16 +233,17 @@ function fakeSchedulerTimer(set, clear) 
 function fakeNow(...args) {
   const date = new Date(...args);
   const modules = [
     Cu.import("resource://gre/modules/TelemetrySession.jsm"),
     Cu.import("resource://gre/modules/TelemetryEnvironment.jsm"),
     Cu.import("resource://gre/modules/TelemetryController.jsm"),
     Cu.import("resource://gre/modules/TelemetryStorage.jsm"),
     Cu.import("resource://gre/modules/TelemetrySend.jsm"),
+    Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm"),
   ];
 
   for (let m of modules) {
     m.Policy.now = () => date;
   }
 
   return new Date(date);
 }
@@ -280,16 +281,18 @@ function promiseRejects(promise) {
   return promise.then(() => false, () => true);
 }
 
 if (runningInParent) {
   // Set logging preferences for all the tests.
   Services.prefs.setCharPref("toolkit.telemetry.log.level", "Trace");
   // Telemetry archiving should be on.
   Services.prefs.setBoolPref("toolkit.telemetry.archive.enabled", true);
+  // Telemetry xpcshell tests cannot show the infobar.
+  Services.prefs.setBoolPref("datareporting.policy.dataSubmissionPolicyBypassNotification", true);
 
   fakePingSendTimer((callback, timeout) => {
     Services.tm.mainThread.dispatch(() => callback(), Ci.nsIThread.DISPATCH_NORMAL);
   },
   () => {});
 
   do_register_cleanup(() => TelemetrySend.shutdown());
 }
new file mode 100644
--- /dev/null
+++ b/toolkit/components/telemetry/tests/unit/test_TelemetryReportingPolicy.js
@@ -0,0 +1,255 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test that TelemetryController sends close to shutdown don't lead
+// to AsyncShutdown timeouts.
+
+"use strict";
+
+Cu.import("resource://gre/modules/Preferences.jsm", this);
+Cu.import("resource://gre/modules/Services.jsm", this);
+Cu.import("resource://gre/modules/TelemetryController.jsm", this);
+Cu.import("resource://gre/modules/TelemetrySend.jsm", this);
+Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm", this);
+Cu.import("resource://gre/modules/TelemetryUtils.jsm", this);
+Cu.import("resource://gre/modules/Timer.jsm", this);
+Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
+
+const PREF_BRANCH = "toolkit.telemetry.";
+const PREF_ENABLED = PREF_BRANCH + "enabled";
+const PREF_SERVER = PREF_BRANCH + "server";
+const PREF_DRS_ENABLED = "datareporting.healthreport.service.enabled";
+
+const TEST_CHANNEL = "TestChannelABC";
+
+const PREF_POLICY_BRANCH = "datareporting.policy.";
+const PREF_BYPASS_NOTIFICATION = PREF_POLICY_BRANCH + "dataSubmissionPolicyBypassNotification";
+const PREF_DATA_SUBMISSION_ENABLED = PREF_POLICY_BRANCH + "dataSubmissionEnabled";
+const PREF_CURRENT_POLICY_VERSION = PREF_POLICY_BRANCH + "currentPolicyVersion";
+const PREF_MINIMUM_POLICY_VERSION = PREF_POLICY_BRANCH + "minimumPolicyVersion";
+const PREF_MINIMUM_CHANNEL_POLICY_VERSION = PREF_MINIMUM_POLICY_VERSION + ".channel-" + TEST_CHANNEL;
+const PREF_ACCEPTED_POLICY_VERSION = PREF_POLICY_BRANCH + "dataSubmissionPolicyAcceptedVersion";
+const PREF_ACCEPTED_POLICY_DATE = PREF_POLICY_BRANCH + "dataSubmissionPolicyNotifiedTime";
+
+function fakeShowPolicyTimeout(set, clear) {
+  let reportingPolicy = Cu.import("resource://gre/modules/TelemetryReportingPolicy.jsm");
+  reportingPolicy.Policy.setShowInfobarTimeout = set;
+  reportingPolicy.Policy.clearShowInfobarTimeout = clear;
+}
+
+function fakeResetAcceptedPolicy() {
+  Preferences.reset(PREF_ACCEPTED_POLICY_DATE);
+  Preferences.reset(PREF_ACCEPTED_POLICY_VERSION);
+}
+
+function run_test() {
+  // Addon manager needs a profile directory
+  do_get_profile(true);
+  loadAddonManager("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
+
+  Services.prefs.setBoolPref(PREF_ENABLED, true);
+  // We need to disable FHR in order to use the policy from telemetry.
+  Services.prefs.setBoolPref(PREF_DRS_ENABLED, false);
+  // Don't bypass the notifications in this test, we'll fake it.
+  Services.prefs.setBoolPref(PREF_BYPASS_NOTIFICATION, false);
+
+  TelemetryReportingPolicy.setup();
+
+  run_next_test();
+}
+
+add_task(function* test_firstRun() {
+  const PREF_FIRST_RUN = "toolkit.telemetry.reportingpolicy.firstRun";
+  const FIRST_RUN_TIMEOUT_MSEC = 60 * 1000; // 60s
+  const OTHER_RUNS_TIMEOUT_MSEC = 10 * 1000; // 10s
+
+  Preferences.reset(PREF_FIRST_RUN);
+
+  let startupTimeout = 0;
+  fakeShowPolicyTimeout((callback, timeout) => startupTimeout = timeout, () => {});
+  TelemetryReportingPolicy.reset();
+
+  Services.obs.notifyObservers(null, "sessionstore-windows-restored", null);
+  Assert.equal(startupTimeout, FIRST_RUN_TIMEOUT_MSEC,
+               "The infobar display timeout should be 60s on the first run.");
+
+  // Run again, and check that we actually wait only 10 seconds.
+  TelemetryReportingPolicy.reset();
+  Services.obs.notifyObservers(null, "sessionstore-windows-restored", null);
+  Assert.equal(startupTimeout, OTHER_RUNS_TIMEOUT_MSEC,
+               "The infobar display timeout should be 10s on other runs.");
+});
+
+add_task(function* test_prefs() {
+  TelemetryReportingPolicy.reset();
+
+  let now = fakeNow(2009, 11, 18);
+
+  // If the date is not valid (earlier than 2012), we don't regard the policy as accepted.
+  TelemetryReportingPolicy.testInfobarShown();
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified());
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), 0,
+               "Invalid dates should not make the policy accepted.");
+
+  // Check that the notification date and version are correctly saved to the prefs.
+  now = fakeNow(2012, 11, 18);
+  TelemetryReportingPolicy.testInfobarShown();
+  Assert.equal(Preferences.get(PREF_ACCEPTED_POLICY_DATE, null), now.getTime(),
+               "A valid date must correctly be saved.");
+
+  // Now that user is notified, check if we are allowed to upload.
+  Assert.ok(TelemetryReportingPolicy.canUpload(),
+            "We must be able to upload after the policy is accepted.");
+
+  // Disable submission and check that we're no longer allowed to upload.
+  Preferences.set(PREF_DATA_SUBMISSION_ENABLED, false);
+  Assert.ok(!TelemetryReportingPolicy.canUpload(),
+            "We must not be able to upload if data submission is disabled.");
+
+  // Turn the submission back on.
+  Preferences.set(PREF_DATA_SUBMISSION_ENABLED, true);
+  Assert.ok(TelemetryReportingPolicy.canUpload(),
+            "We must be able to upload if data submission is enabled and the policy was accepted.");
+
+  // Set a new minimum policy version and check that user is no longer notified.
+  let newMinimum = Preferences.get(PREF_CURRENT_POLICY_VERSION, 1) + 1;
+  Preferences.set(PREF_MINIMUM_POLICY_VERSION, newMinimum);
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "A greater minimum policy version must invalidate the policy and disable upload.");
+
+  // Eventually accept the policy and make sure user is notified.
+  Preferences.set(PREF_CURRENT_POLICY_VERSION, newMinimum);
+  TelemetryReportingPolicy.testInfobarShown();
+  Assert.ok(TelemetryReportingPolicy.testIsUserNotified(),
+            "Accepting the policy again should show the user as notified.");
+  Assert.ok(TelemetryReportingPolicy.canUpload(),
+            "Accepting the policy again should let us upload data.");
+
+  // Set a new, per channel, minimum policy version. Start by setting a test current channel.
+  let defaultPrefs = new Preferences({ defaultBranch: true });
+  defaultPrefs.set("app.update.channel", TEST_CHANNEL);
+
+  // Increase and set the new minimum version, then check that we're not notified anymore.
+  newMinimum++;
+  Preferences.set(PREF_MINIMUM_CHANNEL_POLICY_VERSION, newMinimum);
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "Increasing the minimum policy version should invalidate the policy.");
+
+  // Eventually accept the policy and make sure user is notified.
+  Preferences.set(PREF_CURRENT_POLICY_VERSION, newMinimum);
+  TelemetryReportingPolicy.testInfobarShown();
+  Assert.ok(TelemetryReportingPolicy.testIsUserNotified(),
+            "Accepting the policy again should show the user as notified.");
+  Assert.ok(TelemetryReportingPolicy.canUpload(),
+            "Accepting the policy again should let us upload data.");
+});
+
+add_task(function* test_migratePrefs() {
+  const DEPRECATED_FHR_PREFS = {
+    "datareporting.policy.dataSubmissionPolicyAccepted": true,
+    "datareporting.policy.dataSubmissionPolicyBypassAcceptance": true,
+    "datareporting.policy.dataSubmissionPolicyResponseType": "foxyeah",
+    "datareporting.policy.dataSubmissionPolicyResponseTime": Date.now().toString(),
+  };
+
+  // Make sure the preferences are set before setting up the policy.
+  for (let name in DEPRECATED_FHR_PREFS) {
+    Preferences.set(name, DEPRECATED_FHR_PREFS[name]);
+  }
+  // Set up the policy.
+  TelemetryReportingPolicy.reset();
+  // They should have been removed by now.
+  for (let name in DEPRECATED_FHR_PREFS) {
+    Assert.ok(!Preferences.has(name), name + " should have been removed.");
+  }
+});
+
+add_task(function* test_userNotifiedOfCurrentPolicy() {
+  fakeResetAcceptedPolicy();
+  TelemetryReportingPolicy.reset();
+
+  // User should be reported as not notified by default.
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "The initial state should be unnotified.");
+
+  // Forcing a policy version should not automatically make the user notified.
+  Preferences.set(PREF_ACCEPTED_POLICY_VERSION,
+                  TelemetryReportingPolicy.DEFAULT_DATAREPORTING_POLICY_VERSION);
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+                 "The default state of the date should have a time of 0 and it should therefore fail");
+
+  // Showing the notification bar should make the user notified.
+  let now = fakeNow(2012, 11, 11);
+  TelemetryReportingPolicy.testInfobarShown();
+  Assert.ok(TelemetryReportingPolicy.testIsUserNotified(),
+            "Using the proper API causes user notification to report as true.");
+
+  // It is assumed that later versions of the policy will incorporate previous
+  // ones, therefore this should also return true.
+  let newVersion =
+    Preferences.get(PREF_CURRENT_POLICY_VERSION, 1) + 1;
+  Preferences.set(PREF_ACCEPTED_POLICY_VERSION, newVersion);
+  Assert.ok(TelemetryReportingPolicy.testIsUserNotified(),
+            "A future version of the policy should pass.");
+
+  newVersion =
+    Preferences.get(PREF_CURRENT_POLICY_VERSION, 1) - 1;
+  Preferences.set(PREF_ACCEPTED_POLICY_VERSION, newVersion);
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "A previous version of the policy should fail.");
+});
+
+add_task(function* test_canSend() {
+  const TEST_PING_TYPE = "test-ping";
+
+  PingServer.start();
+  Preferences.set(PREF_SERVER, "http://localhost:" + PingServer.port);
+
+  yield TelemetryController.reset();
+  TelemetryReportingPolicy.reset();
+
+  // User should be reported as not notified by default.
+  Assert.ok(!TelemetryReportingPolicy.testIsUserNotified(),
+            "The initial state should be unnotified.");
+
+  // Assert if we receive any ping before the policy is accepted.
+  PingServer.registerPingHandler(() => Assert.ok(false, "Should not have received any pings now"));
+  yield TelemetryController.submitExternalPing(TEST_PING_TYPE, {});
+
+  // Reset the ping handler.
+  PingServer.resetPingHandler();
+
+  // Fake the infobar: this should also trigger the ping send task.
+  TelemetryReportingPolicy.testInfobarShown();
+  let ping = yield PingServer.promiseNextPings(1);
+  Assert.equal(ping.length, 1, "We should have received one ping.");
+  Assert.equal(ping[0].type, TEST_PING_TYPE,
+               "We should have received the previous ping.");
+
+  // Submit another ping, to make sure it gets sent.
+  yield TelemetryController.submitExternalPing(TEST_PING_TYPE, {});
+
+  // Get the ping and check its type.
+  ping = yield PingServer.promiseNextPings(1);
+  Assert.equal(ping.length, 1, "We should have received one ping.");
+  Assert.equal(ping[0].type, TEST_PING_TYPE, "We should have received the new ping.");
+
+  // Fake a restart with a pending ping.
+  yield TelemetryController.addPendingPing(TEST_PING_TYPE, {});
+  yield TelemetryController.reset();
+
+  // We should be immediately sending the ping out.
+  ping = yield PingServer.promiseNextPings(1);
+  Assert.equal(ping.length, 1, "We should have received one ping.");
+  Assert.equal(ping[0].type, TEST_PING_TYPE, "We should have received the pending ping.");
+
+  // Submit another ping, to make sure it gets sent.
+  yield TelemetryController.submitExternalPing(TEST_PING_TYPE, {});
+
+  // Get the ping and check its type.
+  ping = yield PingServer.promiseNextPings(1);
+  Assert.equal(ping.length, 1, "We should have received one ping.");
+  Assert.equal(ping[0].type, TEST_PING_TYPE, "We should have received the new ping.");
+
+  yield PingServer.stop();
+});
--- a/toolkit/components/telemetry/tests/unit/xpcshell.ini
+++ b/toolkit/components/telemetry/tests/unit/xpcshell.ini
@@ -48,8 +48,9 @@ skip-if = os == "android" # Disabled due
 [test_TelemetrySession.js]
 # Bug 1144395: crash on Android 4.3
 skip-if = android_version == "18"
 [test_ThreadHangStats.js]
 run-sequentially = Bug 1046307, test can fail intermittently when CPU load is high
 [test_TelemetrySend.js]
 [test_ChildHistograms.js]
 skip-if = os == "android"
+[test_TelemetryReportingPolicy.js]