Merge m-c to fx-team a=merge CLOSED TREE

This commit is contained in:
Wes Kocher 2015-03-30 19:42:25 -07:00
commit 73800cd3df
75 changed files with 2454 additions and 201 deletions

View File

@ -116,3 +116,4 @@ b297a6727acfd21e757ddd38cd61894812666265 FIREFOX_AURORA_36_BASE
0000000000000000000000000000000000000000 FIREFOX_AURORA_37_BASE
2c951493eef5b50b8085ef78ffe0d7902ff3d593 FIREFOX_AURORA_37_BASE
98086da94ccdc88f6de86774ce3d1fa258dc7c44 FIREFOX_AURORA_38_BASE
1b6bf6612c0f4d4fee81d18bf18016e692f874e1 FIREFOX_AURORA_39_BASE

View File

@ -22,4 +22,4 @@
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
# don't change CLOBBER for WebIDL changes any more.
Bug 1137470 NSS update required a clobber to fully rebuild
Merge day clobber

View File

@ -58,7 +58,7 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk':
'cutils',
]
OS_LIBS += CONFIG['MOZ_ZLIB_LIBS']
if CONFIG['ANDROID_VERSION'] in ('17', '18', '19', '21'):
if CONFIG['ANDROID_VERSION'] in ('17', '18', '19', '21', '22'):
OS_LIBS += [
'gui',
'suspend',

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -23,7 +23,7 @@
<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="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>

View File

@ -19,7 +19,7 @@
<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="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

View File

@ -17,10 +17,10 @@
</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="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -23,7 +23,7 @@
<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="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="f92a936f2aa97526d4593386754bdbf02db07a12"/>
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="6e47ff2790f5656b5b074407829ceecf3e6188c4"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -23,7 +23,7 @@
<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="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<!-- Stock Android things -->
<project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="50d1ca4ab8add54523b7bc692860d57e8ee4c0d1"/>
<project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="fb3845864573857677f9b500040a8f011eaf5078"/>

View File

@ -19,7 +19,7 @@
<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="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia.git" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
<project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="93f9ba577f68d772093987c2f1c0a4ae293e1802"/>

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="ef937d1aca7c4cf89ecb5cc43ae8c21c2000a9db">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -23,7 +23,7 @@
<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="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<!-- Stock Android things -->
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" revision="95bb5b66b3ec5769c3de8d3f25d681787418e7d2"/>
<project groups="linux" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" revision="ebdad82e61c16772f6cd47e9f11936bf6ebe9aa0"/>

View File

@ -17,10 +17,10 @@
</project>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

View File

@ -1,9 +1,9 @@
{
"git": {
"git_revision": "be25b16efa19bab8d54be08f8fe45dcc93bf93d0",
"git_revision": "a249df8f4c84fe0a139741f05a534d36996ea7b8",
"remote": "https://git.mozilla.org/releases/gaia.git",
"branch": ""
},
"revision": "1b729ede1a2a5333b6dd65bb15ba75e4a2d25282",
"revision": "12cf6177ae0c2f63c267fc816d6c18c337b24a61",
"repo_path": "integration/gaia-central"
}

View File

@ -17,10 +17,10 @@
</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="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="moztt" path="external/moztt" remote="b2g" revision="ed2cf97a6c37a4bbd0bbbbffe06ec7136d8c79ff"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
<project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
<!-- Stock Android things -->

View File

@ -15,7 +15,7 @@
<project name="platform_build" path="build" remote="b2g" revision="52775e03a2d8532429dff579cb2cd56718e488c3">
<copyfile dest="Makefile" src="core/root.mk"/>
</project>
<project name="gaia" path="gaia" remote="mozillaorg" revision="be25b16efa19bab8d54be08f8fe45dcc93bf93d0"/>
<project name="gaia" path="gaia" remote="mozillaorg" revision="a249df8f4c84fe0a139741f05a534d36996ea7b8"/>
<project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
<project name="gonk-misc" path="gonk-misc" remote="b2g" revision="2aa4a75c63cd6e93870a8bddbba45f863cbfd9a3"/>
<project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
@ -23,7 +23,7 @@
<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="47503b5ec80f00630548023efb5ea4f830e1527d"/>
<project name="apitrace" path="external/apitrace" remote="apitrace" revision="d99ab92d0b829a6c78b5284481d5b236d3901f11"/>
<!-- Stock Android things -->
<project groups="pdk,linux" name="platform/prebuilts/clang/linux-x86/host/3.5" path="prebuilts/clang/linux-x86/host/3.5" revision="50d1ca4ab8add54523b7bc692860d57e8ee4c0d1"/>
<project groups="pdk,linux,arm" name="platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" path="prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.8" revision="fb3845864573857677f9b500040a8f011eaf5078"/>

View File

@ -5,7 +5,7 @@
MOZ_APP_BASENAME=B2G
MOZ_APP_VENDOR=Mozilla
MOZ_APP_VERSION=39.0a1
MOZ_APP_VERSION=40.0a1
MOZ_APP_UA_NAME=Firefox
MOZ_UA_OS_AGNOSTIC=1

View File

@ -1328,8 +1328,11 @@ pref("services.sync.prefs.sync.xpinstall.whitelist.required", true);
// Developer edition preferences
#ifdef MOZ_DEV_EDITION
pref("lightweightThemes.selectedThemeID", "firefox-devedition@mozilla.org");
pref("browser.devedition.theme.enabled", true);
pref("browser.devedition.theme.showCustomizeButton", true);
#else
pref("browser.devedition.theme.enabled", false);
pref("browser.devedition.theme.showCustomizeButton", false);
#endif
// Developer edition promo preferences

View File

@ -7,37 +7,46 @@
* to browser.xul if a pref is set and no other themes are applied.
*/
let DevEdition = {
_prefName: "browser.devedition.theme.enabled",
_themePrefName: "general.skins.selectedSkin",
_lwThemePrefName: "lightweightThemes.selectedThemeID",
_devtoolsThemePrefName: "devtools.theme",
styleSheetLocation: "chrome://browser/skin/devedition.css",
styleSheet: null,
get isThemeCurrentlyApplied() {
let theme = LightweightThemeManager.currentTheme;
return theme && theme.id == "firefox-devedition@mozilla.org";
},
init: function () {
this._updateDevtoolsThemeAttribute();
this._updateStyleSheetFromPrefs();
// Listen for changes to all prefs except for complete themes.
// No need for this since changing a complete theme requires a
// restart.
Services.prefs.addObserver(this._lwThemePrefName, this, false);
Services.prefs.addObserver(this._prefName, this, false);
Services.prefs.addObserver(this._devtoolsThemePrefName, this, false);
Services.obs.addObserver(this, "lightweight-theme-styling-update", false);
this._updateDevtoolsThemeAttribute();
if (this.isThemeCurrentlyApplied) {
this._toggleStyleSheet(true);
}
},
observe: function (subject, topic, data) {
if (topic == "lightweight-theme-styling-update") {
let newTheme = JSON.parse(data);
if (newTheme && newTheme.id == "firefox-devedition@mozilla.org") {
this._toggleStyleSheet(true);
if (!newTheme) {
// A lightweight theme has been unapplied, so just re-read prefs.
this._updateStyleSheetFromPrefs();
} else {
// A lightweight theme has been applied, but the pref may not be
// set yet if this happened from customize menu or addons page.
this._toggleStyleSheet(false);
}
}
if (topic == "nsPref:changed" && data == this._devtoolsThemePrefName) {
this._updateDevtoolsThemeAttribute();
if (topic == "nsPref:changed") {
if (data == this._devtoolsThemePrefName) {
this._updateDevtoolsThemeAttribute();
} else {
this._updateStyleSheetFromPrefs();
}
}
},
@ -61,6 +70,24 @@ let DevEdition = {
}
document.documentElement.setAttribute("devtoolstheme", devtoolsTheme);
this._inferBrightness();
this._updateStyleSheetFromPrefs();
},
_updateStyleSheetFromPrefs: function() {
let lightweightThemeSelected = false;
try {
lightweightThemeSelected = !!Services.prefs.getCharPref(this._lwThemePrefName);
} catch(e) {}
let defaultThemeSelected = false;
try {
defaultThemeSelected = Services.prefs.getCharPref(this._themePrefName) == "classic/1.0";
} catch(e) {}
let deveditionThemeEnabled = Services.prefs.getBoolPref(this._prefName) &&
!lightweightThemeSelected && defaultThemeSelected;
this._toggleStyleSheet(deveditionThemeEnabled);
},
handleEvent: function(e) {
@ -68,6 +95,7 @@ let DevEdition = {
this.styleSheet.removeEventListener("load", this);
gBrowser.tabContainer._positionPinnedTabs();
this._inferBrightness();
Services.obs.notifyObservers(window, "devedition-theme-state-changed", true);
}
},
@ -86,10 +114,13 @@ let DevEdition = {
this.styleSheet = null;
gBrowser.tabContainer._positionPinnedTabs();
this._inferBrightness();
Services.obs.notifyObservers(window, "devedition-theme-state-changed", false);
}
},
uninit: function () {
Services.prefs.removeObserver(this._lwThemePrefName, this);
Services.prefs.removeObserver(this._prefName, this);
Services.prefs.removeObserver(this._devtoolsThemePrefName, this);
Services.obs.removeObserver(this, "lightweight-theme-styling-update", false);
if (this.styleSheet) {

View File

@ -45,8 +45,6 @@ XPCOMUtils.defineLazyServiceGetter(this, "Favicons",
XPCOMUtils.defineLazyServiceGetter(this, "gDNSService",
"@mozilla.org/network/dns-service;1",
"nsIDNSService");
XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
"resource://gre/modules/LightweightThemeManager.jsm");
const nsIWebNavigation = Ci.nsIWebNavigation;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -5,56 +5,63 @@
* are applied.
*/
const PREF_DEVEDITION_THEME = "browser.devedition.theme.enabled";
const PREF_LWTHEME = "lightweightThemes.selectedThemeID";
const PREF_LWTHEME_USED_THEMES = "lightweightThemes.usedThemes";
const PREF_DEVTOOLS_THEME = "devtools.theme";
const {LightweightThemeManager} = Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", {});
LightweightThemeManager.clearBuiltInThemes();
LightweightThemeManager.addBuiltInTheme(dummyLightweightTheme("firefox-devedition@mozilla.org"));
registerCleanupFunction(() => {
// Set preferences back to their original values
LightweightThemeManager.currentTheme = null;
Services.prefs.clearUserPref(PREF_DEVEDITION_THEME);
Services.prefs.clearUserPref(PREF_LWTHEME);
Services.prefs.clearUserPref(PREF_DEVTOOLS_THEME);
Services.prefs.clearUserPref(PREF_LWTHEME_USED_THEMES);
LightweightThemeManager.currentTheme = null;
LightweightThemeManager.clearBuiltInThemes();
});
add_task(function* startTests() {
Services.prefs.setCharPref(PREF_DEVTOOLS_THEME, "dark");
info ("Setting the current theme to null");
LightweightThemeManager.currentTheme = null;
ok (!DevEdition.styleSheet, "There is no devedition style sheet when no lw theme is applied.");
info ("Setting browser.devedition.theme.enabled to false.");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, false);
ok (!DevEdition.styleSheet, "There is no devedition style sheet when the pref is false.");
info ("Setting browser.devedition.theme.enabled to true.");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, true);
ok (DevEdition.styleSheet, "There is a devedition stylesheet when no themes are applied and pref is set.");
info ("Adding a lightweight theme.");
LightweightThemeManager.currentTheme = dummyLightweightTheme("preview0");
ok (!DevEdition.styleSheet, "The devedition stylesheet has been removed when a lightweight theme is applied.");
info ("Applying the devedition lightweight theme.");
info ("Removing a lightweight theme.");
let onAttributeAdded = waitForBrightTitlebarAttribute();
LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme("firefox-devedition@mozilla.org");
ok (DevEdition.styleSheet, "The devedition stylesheet has been added when the devedition lightweight theme is applied");
LightweightThemeManager.currentTheme = null;
ok (DevEdition.styleSheet, "The devedition stylesheet has been added when a lightweight theme is removed.");
yield onAttributeAdded;
is (document.documentElement.getAttribute("brighttitlebarforeground"), "true",
"The brighttitlebarforeground attribute is set on the window.");
info ("Unapplying all themes.");
LightweightThemeManager.currentTheme = null;
ok (!DevEdition.styleSheet, "There is no devedition style sheet when no lw theme is applied.");
info ("Setting browser.devedition.theme.enabled to false.");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, false);
ok (!DevEdition.styleSheet, "The devedition stylesheet has been removed.");
info ("Applying the devedition lightweight theme.");
onAttributeAdded = waitForBrightTitlebarAttribute();
LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme("firefox-devedition@mozilla.org");
ok (DevEdition.styleSheet, "The devedition stylesheet has been added when the devedition lightweight theme is applied");
yield onAttributeAdded;
ok (document.documentElement.hasAttribute("brighttitlebarforeground"),
"The brighttitlebarforeground attribute is set on the window with dark devtools theme.");
ok (!document.documentElement.hasAttribute("brighttitlebarforeground"),
"The brighttitlebarforeground attribute is not set on the window after devedition.theme is false.");
});
add_task(function* testDevtoolsTheme() {
info ("Checking that Australis is shown when the light devtools theme is applied.");
let onAttributeAdded = waitForBrightTitlebarAttribute();
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, true);
ok (DevEdition.styleSheet, "The devedition stylesheet exists.");
yield onAttributeAdded;
ok (document.documentElement.hasAttribute("brighttitlebarforeground"),
"The brighttitlebarforeground attribute is set on the window with dark devtools theme.");
info ("Checking stylesheet and :root attributes based on devtools theme.");
Services.prefs.setCharPref(PREF_DEVTOOLS_THEME, "light");
is (document.documentElement.getAttribute("devtoolstheme"), "light",
@ -82,16 +89,16 @@ function dummyLightweightTheme(id) {
return {
id: id,
name: id,
headerURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.header.png",
iconURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.icon.png",
headerURL: "resource:///chrome/browser/content/browser/defaultthemes/1.header.jpg",
iconURL: "resource:///chrome/browser/content/browser/defaultthemes/1.icon.jpg",
textcolor: "red",
accentcolor: "blue"
};
}
add_task(function* testLightweightThemePreview() {
info ("Setting devedition to current and the previewing others");
LightweightThemeManager.currentTheme = LightweightThemeManager.getUsedTheme("firefox-devedition@mozilla.org");
info ("Turning the pref on, then previewing lightweight themes");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, true);
ok (DevEdition.styleSheet, "The devedition stylesheet is enabled.");
LightweightThemeManager.previewTheme(dummyLightweightTheme("preview0"));
ok (!DevEdition.styleSheet, "The devedition stylesheet is not enabled after a lightweight theme preview.");
@ -100,15 +107,24 @@ add_task(function* testLightweightThemePreview() {
ok (!DevEdition.styleSheet, "The devedition stylesheet is not enabled after a second lightweight theme preview.");
LightweightThemeManager.resetPreview();
ok (DevEdition.styleSheet, "The devedition stylesheet is enabled again after resetting the preview.");
LightweightThemeManager.currentTheme = null;
ok (!DevEdition.styleSheet, "The devedition stylesheet is gone after removing the current theme.");
info ("Previewing the devedition theme");
LightweightThemeManager.previewTheme(LightweightThemeManager.getUsedTheme("firefox-devedition@mozilla.org"));
info ("Turning the pref on, then previewing a theme, turning it off and resetting the preview");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, true);
ok (DevEdition.styleSheet, "The devedition stylesheet is enabled.");
LightweightThemeManager.previewTheme(dummyLightweightTheme("preview2"));
ok (!DevEdition.styleSheet, "The devedition stylesheet is not enabled after a lightweight theme preview.");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, false);
ok (!DevEdition.styleSheet, "The devedition stylesheet is not enabled after pref is turned off.");
LightweightThemeManager.resetPreview();
ok (!DevEdition.styleSheet, "The devedition stylesheet is now disabled after resetting the preview.");
ok (!DevEdition.styleSheet, "The devedition stylesheet is still disabled after resetting the preview.");
info ("Turning the pref on, then previewing the default theme, turning it off and resetting the preview");
Services.prefs.setBoolPref(PREF_DEVEDITION_THEME, true);
ok (DevEdition.styleSheet, "The devedition stylesheet is enabled.");
LightweightThemeManager.previewTheme(null);
ok (DevEdition.styleSheet, "The devedition stylesheet is still enabled after the default theme is applied.");
LightweightThemeManager.resetPreview();
ok (DevEdition.styleSheet, "The devedition stylesheet is still enabled after resetting the preview.");
});
// Use a mutation observer to wait for the brighttitlebarforeground

View File

@ -98,8 +98,6 @@ browser.jar:
content/browser/defaultthemes/5.header.png (content/defaultthemes/5.header.png)
content/browser/defaultthemes/5.icon.jpg (content/defaultthemes/5.icon.jpg)
content/browser/defaultthemes/5.preview.jpg (content/defaultthemes/5.preview.jpg)
content/browser/defaultthemes/devedition.header.png (content/defaultthemes/devedition.header.png)
content/browser/defaultthemes/devedition.icon.png (content/defaultthemes/devedition.icon.png)
content/browser/newtab/newTab.xul (content/newtab/newTab.xul)
* content/browser/newtab/newTab.js (content/newtab/newTab.js)
content/browser/newtab/newTab.css (content/newtab/newTab.css)

View File

@ -37,6 +37,7 @@ const kPrefCustomizationState = "browser.uiCustomization.state";
const kPrefCustomizationAutoAdd = "browser.uiCustomization.autoAdd";
const kPrefCustomizationDebug = "browser.uiCustomization.debug";
const kPrefDrawInTitlebar = "browser.tabs.drawInTitlebar";
const kPrefDeveditionTheme = "browser.devedition.theme.enabled";
const kPrefWebIDEInNavbar = "devtools.webide.widget.inNavbarByDefault";
/**
@ -2331,6 +2332,7 @@ let CustomizableUIInternal = {
_resetUIState: function() {
try {
gUIStateBeforeReset.drawInTitlebar = Services.prefs.getBoolPref(kPrefDrawInTitlebar);
gUIStateBeforeReset.deveditionTheme = Services.prefs.getBoolPref(kPrefDeveditionTheme);
gUIStateBeforeReset.uiCustomizationState = Services.prefs.getCharPref(kPrefCustomizationState);
} catch(e) { }
@ -2338,6 +2340,7 @@ let CustomizableUIInternal = {
Services.prefs.clearUserPref(kPrefCustomizationState);
Services.prefs.clearUserPref(kPrefDrawInTitlebar);
Services.prefs.clearUserPref(kPrefDeveditionTheme);
LOG("State reset");
// Reset placements to make restoring default placements possible.
@ -2399,13 +2402,15 @@ let CustomizableUIInternal = {
*/
undoReset: function() {
if (gUIStateBeforeReset.uiCustomizationState == null ||
gUIStateBeforeReset.drawInTitlebar == null) {
gUIStateBeforeReset.drawInTitlebar == null ||
gUIStateBeforeReset.deveditionTheme == null) {
return;
}
gUndoResetting = true;
let uiCustomizationState = gUIStateBeforeReset.uiCustomizationState;
let drawInTitlebar = gUIStateBeforeReset.drawInTitlebar;
let deveditionTheme = gUIStateBeforeReset.deveditionTheme;
// Need to clear the previous state before setting the prefs
// because pref observers may check if there is a previous UI state.
@ -2413,6 +2418,7 @@ let CustomizableUIInternal = {
Services.prefs.setCharPref(kPrefCustomizationState, uiCustomizationState);
Services.prefs.setBoolPref(kPrefDrawInTitlebar, drawInTitlebar);
Services.prefs.setBoolPref(kPrefDeveditionTheme, deveditionTheme);
this.loadSavedState();
// If the user just customizes toolbar/titlebar visibility, gSavedState will be null
// and we don't need to do anything else here:
@ -2590,6 +2596,10 @@ let CustomizableUIInternal = {
LOG(kPrefDrawInTitlebar + " pref is non-default");
return false;
}
if (Services.prefs.prefHasUserValue(kPrefDeveditionTheme)) {
LOG(kPrefDeveditionTheme + " pref is non-default");
return false;
}
return true;
},
@ -3290,7 +3300,8 @@ this.CustomizableUI = {
*/
get canUndoReset() {
return gUIStateBeforeReset.uiCustomizationState != null ||
gUIStateBeforeReset.drawInTitlebar != null;
gUIStateBeforeReset.drawInTitlebar != null ||
gUIStateBeforeReset.deveditionTheme != null;
},
/**

View File

@ -17,6 +17,9 @@ const kPlaceholderClass = "panel-customization-placeholder";
const kSkipSourceNodePref = "browser.uiCustomization.skipSourceNodeCheck";
const kToolbarVisibilityBtn = "customization-toolbar-visibility-button";
const kDrawInTitlebarPref = "browser.tabs.drawInTitlebar";
const kDeveditionThemePref = "browser.devedition.theme.enabled";
const kDeveditionButtonPref = "browser.devedition.theme.showCustomizeButton";
const kDeveditionChangedNotification = "devedition-theme-state-changed";
const kMaxTransitionDurationMs = 2000;
const kPanelItemContextMenu = "customizationPanelItemContextMenu";
@ -64,12 +67,17 @@ function CustomizeMode(aWindow) {
this.tipPanel = this.document.getElementById("customization-tipPanel");
if (Services.prefs.getCharPref("general.skins.selectedSkin") != "classic/1.0") {
let lwthemeButton = this.document.getElementById("customization-lwtheme-button");
let deveditionButton = this.document.getElementById("customization-devedition-theme-button");
lwthemeButton.setAttribute("hidden", "true");
deveditionButton.setAttribute("hidden", "true");
}
#ifdef CAN_DRAW_IN_TITLEBAR
this._updateTitlebarButton();
Services.prefs.addObserver(kDrawInTitlebarPref, this, false);
#endif
this._updateDevEditionThemeButton();
Services.prefs.addObserver(kDeveditionButtonPref, this, false);
Services.obs.addObserver(this, kDeveditionChangedNotification, false);
this.window.addEventListener("unload", this);
};
@ -105,6 +113,8 @@ CustomizeMode.prototype = {
#ifdef CAN_DRAW_IN_TITLEBAR
Services.prefs.removeObserver(kDrawInTitlebarPref, this);
#endif
Services.prefs.removeObserver(kDeveditionButtonPref, this);
Services.obs.removeObserver(this, kDeveditionChangedNotification);
},
toggle: function() {
@ -1497,6 +1507,13 @@ CustomizeMode.prototype = {
}
}
break;
case kDeveditionChangedNotification:
if (aSubject == this.window) {
this._updateDevEditionThemeButton();
this._updateResetButton();
this._updateUndoResetButton();
}
break;
}
},
@ -1521,6 +1538,44 @@ CustomizeMode.prototype = {
},
#endif
_updateDevEditionThemeButton: function() {
let button = this.document.getElementById("customization-devedition-theme-button");
let themeEnabled = !!this.window.DevEdition.styleSheet;
if (themeEnabled) {
button.setAttribute("checked", "true");
} else {
button.removeAttribute("checked");
}
let buttonVisible = Services.prefs.getBoolPref(kDeveditionButtonPref);
if (buttonVisible) {
button.removeAttribute("hidden");
} else {
button.setAttribute("hidden", "true");
}
},
toggleDevEditionTheme: function(shouldEnable) {
const DEFAULT_THEME_ID = "{972ce4c6-7e08-4474-a285-3208198ce6fd}";
Services.prefs.setBoolPref(kDeveditionThemePref, shouldEnable);
let currentLWT = LightweightThemeManager.currentTheme;
if (currentLWT && shouldEnable) {
this._lastLightweightTheme = currentLWT;
AddonManager.getAddonByID(DEFAULT_THEME_ID, function(aDefaultTheme) {
// Theoretically, this could race if people are /very/ quick in switching
// something else here, so doublecheck:
if (Services.prefs.getBoolPref(kDeveditionThemePref)) {
aDefaultTheme.userDisabled = false;
}
});
} else if (!currentLWT && !shouldEnable && this._lastLightweightTheme) {
LightweightThemeManager.currentTheme = this._lastLightweightTheme;
}
},
_onDragStart: function(aEvent) {
__dumpDragData(aEvent);
let item = aEvent.target;

View File

@ -53,6 +53,13 @@
</panel>
</button>
<button id="customization-devedition-theme-button"
class="customizationmode-button"
hidden="true"
label="&customizeMode.deveditionTheme.label2;"
oncommand="gCustomizeMode.toggleDevEditionTheme(this.hasAttribute('checked'))"
type="checkbox" />
<spacer id="customization-footer-spacer"/>
<button id="customization-undo-reset-button"
class="customizationmode-button"

View File

@ -5,12 +5,10 @@
"use strict";
const DEFAULT_THEME_ID = "{972ce4c6-7e08-4474-a285-3208198ce6fd}";
const {LightweightThemeManager} = Components.utils.import("resource://gre/modules/LightweightThemeManager.jsm", {});
add_task(function () {
Services.prefs.clearUserPref("lightweightThemes.usedThemes");
Services.prefs.clearUserPref("lightweightThemes.recommendedThemes");
LightweightThemeManager.clearBuiltInThemes();
yield startCustomizing();

View File

@ -101,6 +101,48 @@ add_task(function() {
is(undoResetButton.hidden, true, "Undo reset button should be hidden at end of test");
});
// Bug 1082108 - Restore Defaults should clear user pref for devedition theme
add_task(function() {
let prefName = "browser.devedition.theme.enabled";
Services.prefs.setBoolPref("browser.devedition.theme.showCustomizeButton", true);
let defaultValue = Services.prefs.getBoolPref(prefName);
let restoreDefaultsButton = document.getElementById("customization-reset-button");
let deveditionThemeButton = document.getElementById("customization-devedition-theme-button");
let undoResetButton = document.getElementById("customization-undo-reset-button");
ok(CustomizableUI.inDefaultState, "Should be in default state at start of test");
ok(restoreDefaultsButton.disabled, "Restore defaults button should be disabled when in default state");
is(deveditionThemeButton.hasAttribute("checked"), defaultValue, "Devedition theme button should reflect pref value");
is(undoResetButton.hidden, true, "Undo reset button should be hidden at start of test");
Services.prefs.setBoolPref(prefName, !defaultValue);
yield waitForCondition(() => !restoreDefaultsButton.disabled);
ok(!restoreDefaultsButton.disabled, "Restore defaults button should be enabled when pref changed");
is(deveditionThemeButton.hasAttribute("checked"), !defaultValue, "Devedition theme button should reflect changed pref value");
ok(!CustomizableUI.inDefaultState, "With devedition theme flipped, no longer default");
is(undoResetButton.hidden, true, "Undo reset button should be hidden after pref change");
yield gCustomizeMode.reset();
ok(restoreDefaultsButton.disabled, "Restore defaults button should be disabled after reset");
is(deveditionThemeButton.hasAttribute("checked"), defaultValue, "devedition theme button should reflect default value after reset");
is(Services.prefs.getBoolPref(prefName), defaultValue, "Reset should reset devedition.theme.enabled");
ok(CustomizableUI.inDefaultState, "In default state after devedition theme reset");
is(undoResetButton.hidden, false, "Undo reset button should be visible after reset");
ok(!undoResetButton.disabled, "Undo reset button should be enabled after reset");
yield gCustomizeMode.undoReset();
ok(!restoreDefaultsButton.disabled, "Restore defaults button should be enabled after undo-reset");
is(deveditionThemeButton.hasAttribute("checked"), !defaultValue, "devedition theme button should reflect undo-reset value");
ok(!CustomizableUI.inDefaultState, "No longer in default state after undo");
is(Services.prefs.getBoolPref(prefName), !defaultValue, "Undo-reset goes back to previous pref value");
is(undoResetButton.hidden, true, "Undo reset button should be hidden after undo-reset clicked");
//XXXgijs this line should be removed once bug 1094509 lands
Services.prefs.clearUserPref("devtools.theme");
Services.prefs.clearUserPref(prefName);
ok(CustomizableUI.inDefaultState, "In default state after pref cleared");
is(undoResetButton.hidden, true, "Undo reset button should be hidden at end of test");
});
add_task(function asyncCleanup() {
yield gCustomizeMode.reset();
yield endCustomizing();

View File

@ -151,9 +151,6 @@ XPCOMUtils.defineLazyModuleGetter(this, "ReaderParent",
XPCOMUtils.defineLazyModuleGetter(this, "AddonWatcher",
"resource://gre/modules/AddonWatcher.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "LightweightThemeManager",
"resource://gre/modules/LightweightThemeManager.jsm");
const PREF_PLUGINS_NOTIFYUSER = "plugins.update.notifyUser";
const PREF_PLUGINS_UPDATEURL = "plugins.update.url";
@ -718,21 +715,6 @@ BrowserGlue.prototype = {
DebugUserAgent.init();
#endif
#ifndef RELEASE_BUILD
let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
let brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
let themeName = browserBundle.GetStringFromName("deveditionTheme.name");
let vendorShortName = brandBundle.GetStringFromName("vendorShortName");
LightweightThemeManager.addBuiltInTheme({
id: "firefox-devedition@mozilla.org",
name: themeName,
headerURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.header.png",
iconURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.icon.png",
author: vendorShortName,
});
#endif
Services.obs.notifyObservers(null, "browser-ui-startup-complete", "");
AddonWatcher.init(this._notifySlowAddon);
@ -1980,42 +1962,6 @@ BrowserGlue.prototype = {
}
}
if (currentUIVersion < 28) {
// Convert old devedition theme pref to lightweight theme storage
let lightweightThemeSelected = false;
let selectedThemeID = null;
try {
lightweightThemeSelected = Services.prefs.prefHasUserValue("lightweightThemes.selectedThemeID");
selectedThemeID = Services.prefs.getCharPref("lightweightThemes.selectedThemeID");
} catch(e) {}
let defaultThemeSelected = false;
try {
defaultThemeSelected = Services.prefs.getCharPref("general.skins.selectedSkin") == "classic/1.0";
} catch(e) {}
let deveditionThemeEnabled = false;
try {
deveditionThemeEnabled = Services.prefs.getBoolPref("browser.devedition.theme.enabled");
} catch(e) {}
// If we are on the devedition channel, the devedition theme is on by
// default. But we need to handle the case where they didn't want it
// applied, and unapply the theme.
let userChoseToNotUseDeveditionTheme =
!deveditionThemeEnabled ||
!defaultThemeSelected ||
(lightweightThemeSelected && selectedThemeID != "firefox-devedition@mozilla.org");
if (userChoseToNotUseDeveditionTheme && selectedThemeID == "firefox-devedition@mozilla.org") {
Services.prefs.setCharPref("lightweightThemes.selectedThemeID", "");
}
// Not clearing browser.devedition.theme.enabled, to preserve user's pref
// if for some reason this function runs again (even though it shouldn't)
Services.prefs.clearUserPref("browser.devedition.showCustomizeButton");
}
if (currentUIVersion < 29) {
let group = null;
try {

View File

@ -1 +1 @@
39.0a1
40.0a1

View File

@ -26,6 +26,7 @@ support-files =
[browser_toolbox_hosts.js]
[browser_toolbox_hosts_size.js]
[browser_toolbox_options.js]
[browser_toolbox_options_devedition.js]
[browser_toolbox_options_disable_buttons.js]
[browser_toolbox_options_disable_cache-01.js]
skip-if = e10s # Bug 1030318

View File

@ -0,0 +1,59 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that changing preferences in the options panel updates the prefs
// and toggles appropriate things in the toolbox.
let doc = null, toolbox = null, panelWin = null;
const PREF_ENABLED = "browser.devedition.theme.enabled";
const PREF_SHOW = "browser.devedition.theme.showCustomizeButton";
const URL = "data:text/html;charset=utf8,test for toggling dev edition browser theme toggling";
add_task(function*() {
// Set preference to false by default so this could
// run in Developer Edition which has it on by default.
Services.prefs.setBoolPref(PREF_ENABLED, false);
Services.prefs.setBoolPref(PREF_SHOW, true);
let tab = yield addTab(URL);
let target = TargetFactory.forTab(tab);
toolbox = yield gDevTools.showToolbox(target);
let tool = yield toolbox.selectTool("options");
panelWin = tool.panelWin;
let checkbox = tool.panelDoc.getElementById("devtools-browser-theme");
ise(Services.prefs.getBoolPref(PREF_ENABLED), false, "Dev Theme pref off on start");
let themeStatus = yield clickAndWaitForThemeChange(checkbox, panelWin);
ise(themeStatus, true, "Theme has been toggled on.");
themeStatus = yield clickAndWaitForThemeChange(checkbox, panelWin);
ise(themeStatus, false, "Theme has been toggled off.");
yield cleanup();
});
function clickAndWaitForThemeChange (el, win) {
let deferred = promise.defer();
gDevTools.on("pref-changed", function handler (event, {pref}) {
if (pref === PREF_ENABLED) {
gDevTools.off("pref-changed", handler);
deferred.resolve(Services.prefs.getBoolPref(PREF_ENABLED));
}
});
EventUtils.synthesizeMouseAtCenter(el, {}, win);
return deferred.promise;
}
function* cleanup() {
yield toolbox.destroy();
gBrowser.removeCurrentTab();
Services.prefs.clearUserPref(PREF_ENABLED);
Services.prefs.clearUserPref(PREF_SHOW);
toolbox = doc = panelWin = null;
}

View File

@ -9,6 +9,9 @@ const Services = require("Services");
const promise = require("promise");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "gDevTools", "resource:///modules/devtools/gDevTools.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "CustomizeMode", "resource:///modules/CustomizeMode.jsm");
const kDeveditionChangedNotification = "devedition-theme-state-changed";
const DEVEDITION_THEME_PREF = "browser.devedition.theme.enabled";
exports.OptionsPanel = OptionsPanel;
@ -84,6 +87,7 @@ function OptionsPanel(iframeWindow, toolbox) {
this._addListeners();
Services.obs.addObserver(this, kDeveditionChangedNotification, false);
const EventEmitter = require("devtools/toolkit/event-emitter");
EventEmitter.decorate(this);
}
@ -108,6 +112,7 @@ OptionsPanel.prototype = {
this.setupToolsList();
this.setupToolbarButtonsList();
this.setupThemeList();
this.setupBrowserThemeButton();
this.populatePreferences();
this.updateDefaultTheme();
}).then(() => {
@ -141,6 +146,8 @@ OptionsPanel.prototype = {
}
else if (data.pref === "devtools.theme") {
this.updateCurrentTheme();
} else if (data.pref === "browser.devedition.theme.enabled") {
this.updateBrowserTheme();
}
},
@ -276,6 +283,52 @@ OptionsPanel.prototype = {
this.updateCurrentTheme();
},
/**
* Similar to `populatePrefs`, except we want more
* special rules for the browser theme button.
*/
setupBrowserThemeButton: function() {
let checkbox = this.panelDoc.getElementById("devtools-browser-theme");
checkbox.addEventListener("command", function() {
setPrefAndEmit(DEVEDITION_THEME_PREF, this.checked);
}.bind(checkbox));
this.updateBrowserThemeButton();
},
/**
* Called on theme changed via observer of "devedition-theme-state-changed".
*/
updateBrowserThemeButton: function() {
let checkbox = this.panelDoc.getElementById("devtools-browser-theme");
// Check if the dev edition style sheet is applied -- will not
// be applied when dev edition theme is disabled, or when there's
// a LWT applied.
if (this._isDevEditionThemeOn()) {
checkbox.setAttribute("checked", "true");
} else {
checkbox.removeAttribute("checked");
}
// Should the button be shown
if (GetPref("browser.devedition.theme.showCustomizeButton")) {
checkbox.removeAttribute("hidden");
} else {
checkbox.setAttribute("hidden", "true");
}
},
/**
* Called when clicking the browser theme button to enable/disable
* the dev edition browser theme.
*/
updateBrowserTheme: function() {
let enabled = GetPref("browser.devedition.theme.enabled");
CustomizeMode.prototype.toggleDevEditionTheme.call(this, enabled);
},
populatePreferences: function() {
let prefCheckboxes = this.panelDoc.querySelectorAll("checkbox[data-pref]");
for (let checkbox of prefCheckboxes) {
@ -364,6 +417,25 @@ OptionsPanel.prototype = {
this.target.activeTab.reconfigure(options);
},
/**
* Returns a boolean indicating whether or not the dev edition
* browser theme is applied.
*/
_isDevEditionThemeOn: function() {
let win = Services.wm.getMostRecentWindow("navigator:browser");
return !!(win && win.DevEdition.styleSheet);
},
/**
* Called on observer notification for "devedition-theme-state-changed"
* to possibly change the state of the dev edition button
*/
observe: function(aSubject, aTopic, aData) {
if (aTopic === kDeveditionChangedNotification) {
this.updateBrowserThemeButton();
}
},
destroy: function() {
if (this.destroyPromise) {
return this.destroyPromise;
@ -388,6 +460,8 @@ OptionsPanel.prototype = {
this.panelWin = this.panelDoc = this.disableJSNode = null;
Services.obs.removeObserver(this, kDeveditionChangedNotification);
return deferred.promise;
}
};

View File

@ -35,6 +35,9 @@
data-pref="devtools.theme"
orient="horizontal">
</radiogroup>
<checkbox id="devtools-browser-theme"
label="&options.usedeveditiontheme.label;"
tooltiptext="&options.usedeveditiontheme.tooltip;"/>
</vbox>
<label>&options.commonPrefs.label;</label>
<vbox id="commonprefs-options" class="options-groupbox">

View File

@ -52,6 +52,7 @@ let connect = Task.async(function*() {
function setPrefDefaults() {
Services.prefs.setBoolPref("devtools.inspector.showUserAgentStyles", true);
Services.prefs.setBoolPref("devtools.profiler.ui.show-platform-data", true);
Services.prefs.setBoolPref("browser.devedition.theme.showCustomizeButton", false);
Services.prefs.setBoolPref("devtools.inspector.showAllAnonymousContent", true);
Services.prefs.setBoolPref("browser.dom.window.dump.enabled", true);
Services.prefs.setBoolPref("devtools.command-button-frames.enabled", true);

View File

@ -742,6 +742,7 @@ just addresses the organization to follow, e.g. "This site is run by " -->
<!ENTITY customizeMode.lwthemes.menuManage.accessKey "M">
<!ENTITY customizeMode.lwthemes.menuGetMore "Get More Themes">
<!ENTITY customizeMode.lwthemes.menuGetMore.accessKey "G">
<!ENTITY customizeMode.deveditionTheme.label2 "Use Developer Edition Theme">
<!ENTITY social.chatBar.commandkey "c">
<!ENTITY social.chatBar.label "Focus chats">

View File

@ -141,6 +141,7 @@ let ReaderParent = {
button.setAttribute("tooltiptext", closeText);
command.setAttribute("label", closeText);
command.setAttribute("hidden", false);
command.setAttribute("accesskey", gStringBundle.GetStringFromName("readerView.close.accesskey"));
} else {
button.removeAttribute("readeractive");
button.hidden = !browser.isArticle;
@ -148,8 +149,8 @@ let ReaderParent = {
button.setAttribute("tooltiptext", enterText);
command.setAttribute("label", enterText);
command.setAttribute("hidden", !browser.isArticle);
command.setAttribute("accesskey", gStringBundle.GetStringFromName("readerView.enter.accesskey"));
}
command.setAttribute("accesskey", gStringBundle.GetStringFromName("readerView.accesskey"));
},
toggleReaderMode: function(event) {

View File

@ -10,4 +10,4 @@
# hardcoded milestones in the tree from these two files.
#--------------------------------------------------------
39.0a1
40.0a1

View File

@ -288,7 +288,7 @@ if test -n "$gonkdir" ; then
AC_DEFINE(MOZ_AUDIO_OFFLOAD)
MOZ_FMP4=1
;;
21)
21|22)
GONK_INCLUDES="-I$gonkdir/frameworks/native/include -I$gonkdir/frameworks/av/include -I$gonkdir/frameworks/av/include/media -I$gonkdir/frameworks/av/include/camera -I$gonkdir/frameworks/native/include/media/openmax -I$gonkdir/frameworks/av/media/libstagefright/include"
MOZ_AUDIO_OFFLOAD=1
MOZ_OMX_DECODER=1

View File

@ -334,6 +334,8 @@ private:
bool mIsWatchingFile;
bool mAllowedToWatchFile;
bool mIsDefaultLocation;
void DispatchDefaultChangeEvent();
nsresult Notify(const char* aReason, class DeviceStorageFile* aFile);

View File

@ -76,6 +76,7 @@
#define DEFAULT_THREAD_TIMEOUT_MS 30000
#define PREF_STORAGE_WRITABLE_NAME \
"device.storage.writable.name"
#define STORAGE_CHANGE_EVENT "change"
using namespace mozilla;
using namespace mozilla::dom;
@ -3366,6 +3367,8 @@ nsDOMDeviceStorage::Init(nsPIDOMWindow* aWindow, const nsAString &aType,
return NS_ERROR_NOT_AVAILABLE;
}
if (!mStorageName.IsEmpty()) {
Preferences::AddStrongObserver(this, PREF_STORAGE_WRITABLE_NAME);
mIsDefaultLocation = Default();
RegisterForSDCardChanges(this);
#ifdef MOZ_WIDGET_GONK
@ -3439,6 +3442,7 @@ nsDOMDeviceStorage::Shutdown()
}
if (!mStorageName.IsEmpty()) {
Preferences::RemoveObserver(this, PREF_STORAGE_WRITABLE_NAME);
UnregisterForSDCardChanges(this);
}
@ -4330,6 +4334,34 @@ nsDOMDeviceStorage::EnumerateInternal(const nsAString& aPath,
return cursor.forget();
}
void
nsDOMDeviceStorage::DispatchDefaultChangeEvent()
{
nsAdoptingString DefaultLocation;
GetDefaultStorageName(mStorageType, DefaultLocation);
DeviceStorageChangeEventInit init;
init.mBubbles = true;
init.mCancelable = false;
init.mPath = DefaultLocation;
if (mIsDefaultLocation) {
init.mReason.AssignLiteral("default-location-changed");
} else {
init.mReason.AssignLiteral("became-default-location");
}
nsRefPtr<DeviceStorageChangeEvent> event =
DeviceStorageChangeEvent::Constructor(this,
NS_LITERAL_STRING(STORAGE_CHANGE_EVENT),
init);
event->SetTrusted(true);
bool ignore;
DispatchEvent(event, &ignore);
mIsDefaultLocation = Default();
}
#ifdef MOZ_WIDGET_GONK
void
nsDOMDeviceStorage::DispatchStatusChangeEvent(nsAString& aStatus)
@ -4347,7 +4379,8 @@ nsDOMDeviceStorage::DispatchStatusChangeEvent(nsAString& aStatus)
init.mReason = aStatus;
nsRefPtr<DeviceStorageChangeEvent> event =
DeviceStorageChangeEvent::Constructor(this, NS_LITERAL_STRING("change"),
DeviceStorageChangeEvent::Constructor(this,
NS_LITERAL_STRING(STORAGE_CHANGE_EVENT),
init);
event->SetTrusted(true);
@ -4408,6 +4441,14 @@ nsDOMDeviceStorage::Observe(nsISupports *aSubject,
return NS_OK;
}
if (!strcmp(aTopic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID) &&
aData &&
nsDependentString(aData).Equals(NS_LITERAL_STRING(PREF_STORAGE_WRITABLE_NAME)))
{
DispatchDefaultChangeEvent();
return NS_OK;
}
#ifdef MOZ_WIDGET_GONK
else if (!strcmp(aTopic, NS_VOLUME_STATE_CHANGED)) {
// We invalidate the used space cache for the volume that actually changed
@ -4465,7 +4506,8 @@ nsDOMDeviceStorage::Notify(const char* aReason, DeviceStorageFile* aFile)
init.mReason.AssignWithConversion(aReason);
nsRefPtr<DeviceStorageChangeEvent> event =
DeviceStorageChangeEvent::Constructor(this, NS_LITERAL_STRING("change"),
DeviceStorageChangeEvent::Constructor(this,
NS_LITERAL_STRING(STORAGE_CHANGE_EVENT),
init);
event->SetTrusted(true);

View File

@ -31,8 +31,10 @@ this.WifiNetUtil = function(controlMessage) {
var util = {};
util.runDhcp = function (ifname, callback) {
gNetworkService.dhcpRequest(ifname, function(success, dhcpInfo) {
util.runIpConfig(ifname, dhcpInfo, callback);
util.stopDhcp(ifname, function() {
gNetworkService.dhcpRequest(ifname, function(success, dhcpInfo) {
util.runIpConfig(ifname, dhcpInfo, callback);
});
});
};
@ -44,7 +46,16 @@ this.WifiNetUtil = function(controlMessage) {
let dhcpService = DHCP_PROP + "_" + ifname;
let suffix = (ifname.substr(0, 3) === "p2p") ? "p2p" : ifname;
let processName = DHCP + "_" + suffix;
stopProcess(dhcpService, processName, callback);
// The implementation of |dhcp_do_request| would wait until the
// |result_prop_name| (e.g. dhcp.wlan0.result) to be non-null
// or 30 second timeout. So we manually change the result property
// to 'ko' to avoid timeout.
//
// http://androidxref.com/4.4.4_r1/xref/system/core/libnetutils/dhcp_utils.c#234
setProperty('dhcp.' + suffix + '.result', 'ko', function() {
stopProcess(dhcpService, processName, callback);
});
};
util.startDhcpServer = function (config, callback) {

View File

@ -3279,23 +3279,7 @@ WifiWorker.prototype = {
WifiManager.reconnect(function (ok) {
self._sendMessage(message, ok, ok, msg);
});
} else if (WifiManager.state == "INACTIVE") {
// If AP info didn't clear, then call associate function.
// That maybe occurs wpa supplicant that suppose already associated.
// To avoid this case, need to clear AP info and call reassoiate
// in INACTIVE state.
let networkKey = getNetworkKey(network);
if (!(networkKey in this.configuredNetworks)) {
self._sendMessage(message, false, "Trying to forget an unknown network", msg);
return;
}
let configured = this.configuredNetworks[networkKey];
WifiManager.removeNetwork(configured.netId, function() {
WifiManager.reassociate(function() {
self._sendMessage(message, ok, ok, msg);
});
});
}else {
} else {
self._sendMessage(message, ok, ok, msg);
}
});

View File

@ -835,10 +835,21 @@ let gTestSuite = (function() {
* @return A deferred promise.
*/
function writeFile(aFilePath, aContent) {
if (-1 === aContent.indexOf(' ')) {
aContent = '"' + aContent + '"';
const CONTENT_MAX_LENGTH = 900;
var commands = [];
for (var i = 0; i < aContent.length; i += CONTENT_MAX_LENGTH) {
var content = aContent.substr(i, CONTENT_MAX_LENGTH);
if (-1 === content.indexOf(' ')) {
content = '"' + content + '"';
}
commands.push(['echo', '-n', content, i === 0 ? '>' : '>>', aFilePath]);
}
return runEmulatorShellSafe(['echo', aContent, '>', aFilePath]);
let chain = Promise.resolve();
commands.forEach(function (command) {
chain = chain.then(() => runEmulatorShellSafe(command));
});
return chain;
}
/**
@ -1242,6 +1253,7 @@ let gTestSuite = (function() {
suite.importCert = importCert;
suite.getImportedCerts = getImportedCerts;
suite.deleteCert = deleteCert;
suite.writeFile = writeFile;
/**
* Common test routine.
@ -1364,7 +1376,7 @@ let gTestSuite = (function() {
* @return A deferred promise.
*/
suite.doTestWithCertificate = function(certBlob, password, nickname, usage, aTestCaseChain) {
return suite.doTest(function() {
return suite.doTestWithoutStockAp(function() {
return ensureWifiEnabled(true)
// Import test certificate.
.then(() => importCert(certBlob, password, nickname))

View File

@ -14,4 +14,7 @@ qemu = true
[test_wifi_manage_server_certificate.js]
[test_wifi_manage_user_certificate.js]
[test_wifi_manage_pkcs12_certificate.js]
[test_wifi_associate_WPA_EAP_PEAP.js]
[test_wifi_associate_WPA_EAP_TTLS.js]
[test_wifi_associate_WPA_EAP_TLS.js]
[test_wifi_enable_api.js]

View File

@ -0,0 +1,623 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
const SCAN_RETRY_CNT = 5;
const EAP_USERNAME = 'username';
const EAP_PASSWORD = 'password';
const SERVER_EAP_USER_CONF = {
path: HOSTAPD_CONFIG_PATH + 'hostapd.eap_user',
content: '* PEAP,TTLS,TLS\n' +
'"' + EAP_USERNAME + '" MSCHAPV2,TTLS-MSCHAPV2 "' + EAP_PASSWORD + '" [2]\n'
};
const CA_CERT = {
path: HOSTAPD_CONFIG_PATH + 'ca.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIIDsTCCApmgAwIBAgIJAKxTf+8X8qngMA0GCSqGSIb3DQEBCwUAMG4xCzAJBgNV\n' +
'BAYTAlRXMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTER\n' +
'MA8GA1UEAwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdt\n' +
'YWlsLmNvbTAgFw0xNDEyMjQxMTI4NTBaGA8yMjg4MTAwNzExMjg1MFowbjELMAkG\n' +
'A1UEBhMCVFcxEzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCGNodWNrbGVl\n' +
'MREwDwYDVQQDDAhjaHVja2xlZTEkMCIGCSqGSIb3DQEJARYVY2h1Y2tsaTA3MDZA\n' +
'Z21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo3c2yFxY\n' +
'o6gGg0I83jy00ME+MAfzCd+4ShL45ZLqysQP93jRBfPzU9ZuZ29ysVwgWIdqkZao\n' +
'XTuV/NAW2GMGd8W1jQJ3J81fjb9wvhlny3rrACwvUn1N1S1BnM+BAAiDLGxEmvAQ\n' +
'onp2aaa6HsHsYS8ONX+d2Qh4LEA4vupeSGAqJychCZv/l+aq/ErFZhFYB3CPUQEt\n' +
'cClO24ucsIYP95lA0zhscnmAj06qplFD4Bv6IVrdDqujy1zNwCQwsJq/8OQdaTN/\n' +
'h3y9pWvNKMBMM2niOUAjtuNpqsSK/lTS1WAT3PdtVECX9fYBi0Bg+HM92xs/6gt6\n' +
'kh9jPV8keXHvSwIDAQABo1AwTjAdBgNVHQ4EFgQU7hBqhuG04xeCzrQ3ngx18ZJ3\n' +
'lUswHwYDVR0jBBgwFoAU7hBqhuG04xeCzrQ3ngx18ZJ3lUswDAYDVR0TBAUwAwEB\n' +
'/zANBgkqhkiG9w0BAQsFAAOCAQEAFYX2iy680GAnBTttk0gyX6gk+8pYr3D22k/G\n' +
'6rvcjefzS7ELQPRKr6mfmwXq3mMf/4jiS2zI5zmXsestPYzHYxf2viQ6t7vr9XiJ\n' +
'3WfFjNw4ERlRisAvg0aqqTNNQq5v2VME4sdFZagy217f73C7azwCHl0bqOLH05rl\n' +
'8RubOxiHEj7ZybJqnRciK/bht4D+rZkwf4bBBmoloqH7xT0+rFQclpYXDGGjNUQB\n' +
'LcHLF10xcr7g3ZVVu82fe6+d85gIGOIMR9+TKhdw6gO3CNcnDAj6gxksghgtcxmh\n' +
'OzOggCn7nlIwImtsg2sZkpWB4lEi9hdv4lkNuyFjOL3bnuc+NA==\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_CERT = {
path: HOSTAPD_CONFIG_PATH + 'server.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIID1DCCArygAwIBAgIBADANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJUVzET\n' +
'MBEGA1UECAwKU29tZS1TdGF0ZTERMA8GA1UECgwIY2h1Y2tsZWUxETAPBgNVBAMM\n' +
'CGNodWNrbGVlMSQwIgYJKoZIhvcNAQkBFhVjaHVja2xpMDcwNkBnbWFpbC5jb20w\n' +
'IBcNMTQxMjI0MTEyOTQ5WhgPMjI4ODEwMDcxMTI5NDlaMG4xCzAJBgNVBAYTAlRX\n' +
'MRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTERMA8GA1UE\n' +
'AwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdtYWlsLmNv\n' +
'bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdhQmKilTJbWZRxTiSV\n' +
'rqIU+LYW1RKghx5o+0JpNRJVLuz5kBMaNskbbfUSNuHbEq0QA9BDKAZWIc4LSotk\n' +
'lCo8TbcO9CJvJPQGGjGdHcohWX5vy6BE/OVE46CUteMFyZF6F8R2fNUww08iR/u1\n' +
'YZebL5pWO1j43sPpAzEy6Tij2ACPt6EZcFaZG3SF2mVJWkCQnBqrojP65WUvZQqp\n' +
'seUhW2YAS8Nu0Yrohgxz6VYk+cNDuDZVGs6qWRStZzJfYrfc76DtkHof5B14M+xp\n' +
'XJaBLxN+whvnYkDTfinaCxnW1O7eXUltr87fLc5zmeBkgwaiaQuIdcfZm7vDUiz8\n' +
'vnUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH\n' +
'ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFKK4f9/YavTHOfEiAB83Deac\n' +
'6gT5MB8GA1UdIwQYMBaAFO4QaobhtOMXgs60N54MdfGSd5VLMA0GCSqGSIb3DQEB\n' +
'CwUAA4IBAQBWnO9o9KSJIqjoz5Nwll63ULOdcvgGdOeJIw1fcKQ817Rsp+TVcjcH\n' +
'IrIADsT/QZGXRO/l6p1750e2iFtJEo1hsRaxtA1wWn2I9HO3+av2spQhr3jpYGPf\n' +
'zpsMTp4RNYV7Q8+q1kZIz9PY4V1T0p6lveK8+fUj2hSLnxSj0QiGSJJtnEC3w4Rv\n' +
'C9T6oUwIeToULmi+8FXQFdEqwKRU98DPq3eLzN28ZxUgoPE1C8+42D2UW8uyp/Gm\n' +
'tGOa/k7nzkCdVqZI7lX7f0AjEvQgjtAMQ/k7Mhxx7TzW2HO+1YPMoKji6Z4WkNwt\n' +
'JEj9ZUBSNt8B26UksJMBDkcvSegF3a7o\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_KEY = {
path: HOSTAPD_CONFIG_PATH + 'server.key',
content: '-----BEGIN RSA PRIVATE KEY-----\n' +
'MIIEpAIBAAKCAQEAx2FCYqKVMltZlHFOJJWuohT4thbVEqCHHmj7Qmk1ElUu7PmQ\n' +
'Exo2yRtt9RI24dsSrRAD0EMoBlYhzgtKi2SUKjxNtw70Im8k9AYaMZ0dyiFZfm/L\n' +
'oET85UTjoJS14wXJkXoXxHZ81TDDTyJH+7Vhl5svmlY7WPjew+kDMTLpOKPYAI+3\n' +
'oRlwVpkbdIXaZUlaQJCcGquiM/rlZS9lCqmx5SFbZgBLw27RiuiGDHPpViT5w0O4\n' +
'NlUazqpZFK1nMl9it9zvoO2Qeh/kHXgz7GlcloEvE37CG+diQNN+KdoLGdbU7t5d\n' +
'SW2vzt8tznOZ4GSDBqJpC4h1x9mbu8NSLPy+dQIDAQABAoIBAASG4Mr8hgaurEoC\n' +
'iJOsElr7vunjetMBcg/uskW/vcS8ymP3Bp5oafYG+WgnEbfvEW18f5mq7K24JuxW\n' +
'tUqU7ghHdjxByqk9fMlNmiqmNpbwSufkAeuRpWxPNBvhRH/zEbCL5R5A0nTEtqqF\n' +
'TL0aUSzwCRSoAJD0lZo9ICVt0n3GsDyM9rqQg/uZmh1qsRdwPsRuYORND9g48rKq\n' +
'6WN9leskSxhhsYE2D9ocOFd9bNt8Zxejh9ppVSnG/KsIdt18iBzcabatgAQ046fb\n' +
'Z3vprcZJLg93Sg2gSuVqlSTs3M2W8VQnm22/EBMb1y0M48MSRCgnbPLG/CcCLLfF\n' +
'LwxCOgECgYEA/eYt67xyJ6JeAdxdwOZuT1WWGbFpLiG9+2OgiHumyRQ5969XMTWo\n' +
'fIhMKchDdjoy9RR236\/\/EFCs7UEyB7+a7ODRzNiK2zCD8Smjp+21fUPSthEeQesk\n' +
'eiMYICIu5Ay35x9sxIX+XOUVvRhPOGcD29GVeRnKh1inTHOz2dje8LkCgYEAyQeY\n' +
'STi9jjCEcHkM1E/UeDiLfHHepLXi8wS41JNRHl5Jacp7XB5djAjKu/jf367/VpFy\n' +
'GDDMetE7n8eWkrnAvovxOwZ000YDMtL1sUYSjL+XtBS5s6VY1p4qaSAY9nUUGrJh\n' +
'JvtvsuI7SKTtL+60vjBOH7zDnvOdBgAp0utLhZ0CgYEAuLzzqrPKB8afShFSchn4\n' +
'J2dpuLYahsNsXW7HDqeR2nsKFosRETAusLXnXPtnAq4kB6jlOarwFqnsuRCX24Vx\n' +
'r2uBm9/vYL7zMdUPTA+s30ErHuhjsKjsOKYyVqcooSwT32pBFNk+E89nutfmRG7I\n' +
'IvhjHuNCNqqtx/Xj5d1jkZkCgYBQicppC2Jl5OoqZVTOem0U/RJk+PnJ41TZJ7sk\n' +
'7yBAmmWvDH\/\/l+rCf4M5a6vFYcbKV9rt9h711X2dtciNX/3oWQh8LUoAmrwNUJc+\n' +
'PmSQHvIYI3WCk2vUD+nN1B4sHxu+1lg11eYaNKiroeeknG2tBI1ICcgVlmQCU25u\n' +
'IfZPwQKBgQCdO6QHhPLtcHUDNFA6FQ1jKL1iEd7G0JLVRz4Xkpkn1Vrr5MD6JFDa\n' +
'5ccabADyl0lpFqDIVJQIzLku2hOD2i9aBNCY0pL391HeOS7CkZX+TdOY1tquoBq5\n' +
'MnmixZjDCVd2VcrVyTA6ntOBoharKFW0rH1PqU+qu7dZF7CBPbAdEw==\n' +
'-----END RSA PRIVATE KEY-----\n'
};
const WPA_EAP_AP_LIST = [
{
ssid: 'WPA-EAP-PEAP',
ieee8021x: 1,
eapol_version: 1,
eap_server: 1,
eapol_key_index_workaround: 0,
eap_user_file: SERVER_EAP_USER_CONF.path,
ca_cert: CA_CERT.path,
server_cert: SERVER_CERT.path,
private_key: SERVER_KEY.path,
wpa: 3,
wpa_key_mgmt: 'WPA-EAP'
}
];
const CLIENT_PKCS12_CERT = {
nickname: 'client',
password: 'password',
usage: ['UserCert', 'ServerCert'],
content: [0x30, 0x82, 0x0E, 0x01, 0x02, 0x01, 0x03, 0x30,
0x82, 0x0D, 0xC7, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82,
0x0D, 0xB8, 0x04, 0x82, 0x0D, 0xB4, 0x30, 0x82,
0x0D, 0xB0, 0x30, 0x82, 0x08, 0x67, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
0x06, 0xA0, 0x82, 0x08, 0x58, 0x30, 0x82, 0x08,
0x54, 0x02, 0x01, 0x00, 0x30, 0x82, 0x08, 0x4D,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x0A, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01,
0x06, 0x30, 0x0E, 0x04, 0x08, 0x67, 0x7A, 0xF3,
0x61, 0xBE, 0xE0, 0x51, 0xC1, 0x02, 0x02, 0x08,
0x00, 0x80, 0x82, 0x08, 0x20, 0xFC, 0x6A, 0x79,
0xA1, 0x6C, 0xAF, 0xBE, 0xEE, 0x62, 0x45, 0x33,
0xB8, 0x48, 0xE1, 0x68, 0xA1, 0x15, 0x11, 0x4B,
0x95, 0xCB, 0x77, 0xC0, 0x5D, 0xA2, 0xCB, 0xDB,
0xD1, 0x83, 0x74, 0x60, 0xD7, 0xEC, 0x42, 0xA6,
0x3A, 0x23, 0xF7, 0x85, 0xEB, 0xC1, 0xFE, 0x6A,
0x57, 0x8E, 0xC1, 0x44, 0xF3, 0x1F, 0xFE, 0xB8,
0x2D, 0x8C, 0x4D, 0xC9, 0x5B, 0xAE, 0x21, 0x2E,
0x4C, 0x1A, 0xEB, 0x84, 0x09, 0xF3, 0x40, 0x92,
0x39, 0x7F, 0x56, 0x02, 0x46, 0x61, 0x16, 0xDE,
0x5C, 0x48, 0xB6, 0x0C, 0x1D, 0xD3, 0x5F, 0x10,
0x9A, 0x39, 0xB8, 0x66, 0x31, 0xFC, 0x39, 0x71,
0x87, 0x23, 0x46, 0x9D, 0xE8, 0x3C, 0x2B, 0xA1,
0x39, 0x8A, 0xD3, 0xFF, 0xD9, 0x43, 0xB6, 0x61,
0xC6, 0x67, 0x70, 0x40, 0xBD, 0xFE, 0xD3, 0xC1,
0x68, 0xF5, 0xF7, 0xC8, 0x89, 0xD8, 0x17, 0xC5,
0xE8, 0x3D, 0x29, 0xD5, 0x91, 0xDF, 0x1F, 0x56,
0x74, 0x5A, 0xC4, 0xA8, 0x14, 0xBA, 0xD4, 0xFA,
0x13, 0x49, 0x2A, 0x9F, 0x63, 0xF1, 0xB2, 0x45,
0xF1, 0xF0, 0x2A, 0xDD, 0x75, 0x66, 0x8A, 0xF7,
0xAB, 0x73, 0x86, 0x26, 0x9D, 0x1F, 0x07, 0xAD,
0xD3, 0xFE, 0xE0, 0xA3, 0xED, 0xA0, 0x96, 0x3E,
0x1E, 0x89, 0x86, 0x02, 0x4C, 0x28, 0xFD, 0x57,
0xA1, 0x67, 0x55, 0xF0, 0x82, 0x3B, 0x7F, 0xCC,
0x2A, 0x32, 0x01, 0x93, 0x1D, 0x8B, 0x66, 0x8A,
0x20, 0x52, 0x84, 0xDD, 0x2C, 0xFD, 0xEE, 0x72,
0xF3, 0x8C, 0x58, 0xB9, 0x99, 0xE5, 0xC1, 0x22,
0x63, 0x59, 0x00, 0xE2, 0x76, 0xC5, 0x3A, 0x17,
0x7F, 0x93, 0xE9, 0x67, 0x61, 0xAA, 0x10, 0xC3,
0xD9, 0xC8, 0x24, 0x46, 0x5B, 0xBE, 0x8C, 0x1F,
0x2D, 0x66, 0x48, 0xD2, 0x02, 0x11, 0xFB, 0x74,
0x14, 0x76, 0x76, 0x5A, 0x98, 0x54, 0x35, 0xA7,
0x85, 0x66, 0x20, 0x26, 0x8B, 0x13, 0x6F, 0x68,
0xE3, 0xC9, 0x58, 0x7D, 0x1C, 0x3E, 0x01, 0x8D,
0xF8, 0xD6, 0x7F, 0xCF, 0xA2, 0x07, 0xB7, 0x95,
0xFD, 0xF0, 0x02, 0x34, 0x32, 0x30, 0xE8, 0xD4,
0x57, 0x5E, 0x53, 0xFB, 0x54, 0xE2, 0x03, 0x32,
0xCC, 0x52, 0x2E, 0xD2, 0x35, 0xD9, 0x58, 0x85,
0x2D, 0xEC, 0x2D, 0x71, 0xD1, 0x8A, 0x29, 0xD0,
0xB0, 0x24, 0xBD, 0x24, 0xDC, 0x1A, 0x28, 0x3F,
0xA0, 0x12, 0x81, 0x15, 0x24, 0xC9, 0xB5, 0x4A,
0x23, 0xB6, 0xA3, 0x45, 0x50, 0x2D, 0x73, 0x99,
0x6B, 0x1C, 0xFB, 0xA4, 0x53, 0xD7, 0x5C, 0xF4,
0x6C, 0xB0, 0xE5, 0x74, 0xB3, 0x76, 0xF8, 0xB1,
0x0D, 0x59, 0x70, 0x9F, 0xCA, 0xDE, 0xF2, 0xAA,
0x4C, 0x7D, 0x11, 0x54, 0xC4, 0x19, 0x0F, 0x36,
0x4A, 0x62, 0xFF, 0x8B, 0x10, 0xCB, 0x93, 0x50,
0xDA, 0x79, 0x5E, 0x4E, 0x09, 0x1F, 0x22, 0xC8,
0x19, 0x85, 0xE9, 0xEE, 0xB7, 0x71, 0x65, 0xB9,
0x10, 0xD2, 0x0A, 0x73, 0x5B, 0xA6, 0xDA, 0x37,
0x46, 0x02, 0x00, 0x98, 0x9E, 0x20, 0x6C, 0x7D,
0xC7, 0x69, 0xBB, 0xC2, 0x00, 0x40, 0x9C, 0x57,
0x00, 0xC2, 0x36, 0x76, 0xE8, 0x2A, 0x8D, 0xAD,
0x62, 0x57, 0xC8, 0xD0, 0x9D, 0x66, 0x27, 0x5A,
0xD8, 0x0D, 0x35, 0x60, 0x28, 0x38, 0x62, 0x94,
0x78, 0x36, 0x25, 0x58, 0xFD, 0xF8, 0x66, 0x1F,
0x68, 0x04, 0x0F, 0xD8, 0x00, 0xDF, 0xA0, 0x6C,
0x25, 0x42, 0x9A, 0x4C, 0xEB, 0x80, 0x13, 0x51,
0x7D, 0x2D, 0xA8, 0x89, 0xD6, 0x1B, 0x67, 0x72,
0x01, 0xF3, 0x2D, 0x16, 0x77, 0xFE, 0x22, 0xBC,
0x8A, 0x45, 0x09, 0x1F, 0x9C, 0x2F, 0x2A, 0xA9,
0x61, 0x5B, 0x4A, 0xE6, 0x64, 0x2C, 0x62, 0x1A,
0x3A, 0x96, 0xE6, 0x0A, 0xAE, 0x05, 0x1A, 0xC8,
0xCB, 0xD6, 0x8F, 0x3A, 0x4B, 0xE0, 0x7F, 0x82,
0xB4, 0x98, 0xF1, 0x9D, 0xD7, 0x14, 0x76, 0x5E,
0x77, 0x85, 0x87, 0xEC, 0x13, 0xDA, 0xFD, 0xAF,
0xCB, 0xA3, 0x1C, 0x99, 0xC1, 0xFE, 0x17, 0x0C,
0x40, 0x4D, 0x3C, 0x8F, 0x70, 0x86, 0x63, 0x64,
0xB7, 0x75, 0xA8, 0x71, 0x36, 0xDC, 0x54, 0x10,
0x57, 0x0C, 0xA8, 0xF2, 0xA1, 0xBB, 0xED, 0x03,
0x41, 0x57, 0x34, 0x2C, 0x8F, 0x7C, 0xA0, 0x09,
0xF3, 0x9E, 0x41, 0xB7, 0xA8, 0xD4, 0x66, 0x0D,
0x0D, 0xC0, 0x6A, 0xFC, 0x6A, 0xA2, 0xAC, 0xE2,
0x60, 0x00, 0xE3, 0xF7, 0x75, 0x43, 0x23, 0xEB,
0xC8, 0x61, 0xFA, 0xB3, 0xB8, 0x28, 0xCE, 0xCA,
0xF4, 0x47, 0x7F, 0x30, 0x6D, 0x61, 0x89, 0x47,
0xA1, 0x4A, 0xFE, 0xD1, 0x21, 0x0B, 0x6D, 0xF4,
0x3F, 0x00, 0x86, 0x30, 0x8E, 0x33, 0x21, 0x6F,
0xDA, 0x15, 0xFD, 0x5F, 0xEC, 0x8E, 0xF1, 0x12,
0x3F, 0xC9, 0x83, 0x0C, 0xCA, 0x22, 0x01, 0xF1,
0x70, 0x5F, 0x1F, 0x66, 0xB5, 0xF8, 0x3E, 0x7A,
0x6F, 0xDE, 0xDB, 0xA7, 0x8D, 0x18, 0x9E, 0xBE,
0xDB, 0xAD, 0x3D, 0x66, 0x30, 0xC1, 0x6C, 0x0C,
0x87, 0xB4, 0x65, 0x75, 0xE0, 0x9D, 0xEA, 0x16,
0x0D, 0x07, 0x37, 0x33, 0xC5, 0xEC, 0x97, 0x93,
0x37, 0xEB, 0x8E, 0x65, 0x9C, 0x40, 0x63, 0x6C,
0x43, 0x60, 0xB0, 0x40, 0x4D, 0x85, 0xEF, 0xC2,
0x47, 0x5F, 0xE7, 0x6B, 0xCB, 0x40, 0xE8, 0xEA,
0xD8, 0xAB, 0xB1, 0x9A, 0x72, 0xDC, 0x4C, 0x14,
0xFA, 0x43, 0x61, 0x5F, 0xA6, 0x5C, 0x3A, 0x05,
0x17, 0x2E, 0x74, 0xF3, 0x5E, 0x45, 0xD9, 0x47,
0xAA, 0x59, 0xB6, 0x8F, 0x42, 0x66, 0x42, 0x29,
0x90, 0x95, 0x48, 0x46, 0x91, 0x88, 0x3C, 0x8C,
0xDE, 0xCC, 0xED, 0xB3, 0xAA, 0x62, 0xEA, 0xBC,
0xB4, 0x0C, 0x48, 0x4C, 0x53, 0x23, 0x5E, 0x24,
0x85, 0xBF, 0x92, 0xDA, 0x14, 0xDB, 0x1A, 0x3D,
0xEF, 0x30, 0xD9, 0x49, 0x64, 0x4D, 0xE5, 0x01,
0xFC, 0xA4, 0x4B, 0xD1, 0x9F, 0xDE, 0x96, 0x7F,
0x50, 0xBC, 0x4D, 0x38, 0x44, 0xE9, 0x23, 0x5F,
0x37, 0x57, 0x1A, 0xA6, 0x52, 0x5A, 0x0F, 0x4F,
0x87, 0x33, 0x4A, 0x7B, 0x66, 0xEE, 0x3D, 0x66,
0x0A, 0x63, 0x39, 0x1F, 0x23, 0x38, 0x35, 0x73,
0x60, 0x5E, 0x47, 0x20, 0x4F, 0xC0, 0xC8, 0x3C,
0x09, 0xF9, 0x29, 0x4F, 0x5E, 0x55, 0x69, 0xC4,
0x6B, 0xE8, 0xF8, 0x91, 0xC0, 0x22, 0x65, 0x15,
0x1E, 0xFB, 0xB9, 0x61, 0xCE, 0x45, 0xBE, 0x2B,
0xEE, 0xB9, 0x04, 0x2B, 0xFD, 0xAE, 0x61, 0x1C,
0x3D, 0x3D, 0x7C, 0xBF, 0xC1, 0xF7, 0x3C, 0x4E,
0x9E, 0x0E, 0x54, 0xC8, 0xAD, 0xA9, 0xDF, 0x43,
0x49, 0xB9, 0x41, 0x05, 0xE5, 0xF1, 0x49, 0xAA,
0x77, 0x6C, 0x34, 0x5B, 0x93, 0x24, 0x24, 0x23,
0x74, 0x68, 0x11, 0xCE, 0x15, 0x80, 0xA1, 0xA4,
0x1F, 0x8D, 0x81, 0xCD, 0xB2, 0x98, 0xCA, 0x14,
0x0B, 0x0C, 0x61, 0x50, 0x69, 0x72, 0xAE, 0xFA,
0x8B, 0xC0, 0x3F, 0x0D, 0xE7, 0xF2, 0x0F, 0xEB,
0xC1, 0x11, 0xB9, 0x10, 0x03, 0x6A, 0xF5, 0x97,
0x3C, 0x53, 0x2F, 0x67, 0x86, 0x09, 0x6A, 0xE3,
0x28, 0xC0, 0x78, 0xC8, 0xB4, 0x39, 0x8E, 0xD1,
0xCE, 0x25, 0xE8, 0x66, 0xF7, 0x09, 0x40, 0x7D,
0x81, 0xFB, 0xAF, 0xFA, 0x59, 0xC4, 0x9B, 0x2B,
0x83, 0x45, 0x5B, 0xA8, 0x66, 0x9E, 0x38, 0xC8,
0xFD, 0xAC, 0xF2, 0x2D, 0x21, 0xDE, 0x50, 0x4C,
0x03, 0xCB, 0x88, 0x42, 0xDD, 0x84, 0x09, 0x99,
0x8E, 0x8B, 0x40, 0x97, 0x1B, 0x14, 0x85, 0x37,
0x11, 0x01, 0xE0, 0x74, 0x6B, 0x33, 0x52, 0x8C,
0x68, 0x3A, 0x89, 0xB2, 0xAF, 0x35, 0xE6, 0x65,
0xC3, 0x58, 0x70, 0xD2, 0xE7, 0x1F, 0x1F, 0xF6,
0xE5, 0x0A, 0xB1, 0xFE, 0xD0, 0xC9, 0x51, 0x50,
0xE7, 0xFD, 0x58, 0xF5, 0xC4, 0x58, 0x65, 0x94,
0xD1, 0x57, 0x55, 0x5E, 0xD2, 0x27, 0x98, 0xAF,
0xE7, 0x55, 0x0B, 0x87, 0x50, 0x9B, 0xEF, 0xE8,
0x2B, 0xFC, 0xE7, 0x3B, 0x4E, 0xD7, 0xB7, 0x4D,
0xF4, 0xBC, 0xF4, 0x88, 0x63, 0xE4, 0x8A, 0x20,
0x4B, 0x22, 0xB0, 0xA0, 0x53, 0x7F, 0xA8, 0xC9,
0x0C, 0xF8, 0xD7, 0xBD, 0x46, 0x39, 0xA7, 0x7D,
0xDD, 0x10, 0x91, 0x50, 0x54, 0x06, 0x47, 0xF0,
0x3C, 0xAA, 0x43, 0x40, 0xF8, 0x54, 0xDD, 0x8A,
0xEA, 0x8A, 0x0B, 0xA5, 0x7F, 0xCD, 0x5E, 0xAA,
0x02, 0x2E, 0x1F, 0xC6, 0x50, 0x15, 0xF8, 0x0A,
0x0C, 0x1B, 0x3C, 0x55, 0x3A, 0xC3, 0x6F, 0x88,
0xD7, 0xBF, 0xB1, 0x02, 0xCC, 0xE0, 0x08, 0x29,
0x97, 0xD2, 0xAA, 0x23, 0xC4, 0x6D, 0xE3, 0xE3,
0x76, 0x39, 0x92, 0xC3, 0x2E, 0x7A, 0xE2, 0x98,
0xD1, 0xFC, 0xAE, 0xCC, 0x95, 0xD8, 0xB4, 0xDC,
0x92, 0xEA, 0x6A, 0x5F, 0xF2, 0x92, 0x17, 0x0B,
0x8D, 0xC3, 0xFA, 0x9C, 0x62, 0xCE, 0x44, 0x8D,
0xC3, 0x1E, 0xC3, 0xB2, 0xD5, 0x00, 0xCD, 0xB4,
0x9E, 0x2D, 0x7B, 0xF2, 0x98, 0xA3, 0x00, 0x8B,
0x81, 0x30, 0x77, 0x5B, 0x02, 0x99, 0xB1, 0xCD,
0xC3, 0x1D, 0x74, 0x74, 0xEF, 0x41, 0xCB, 0x69,
0x63, 0x8E, 0xA6, 0xD3, 0x2D, 0x3E, 0x1F, 0x1D,
0x12, 0x9E, 0xD9, 0x18, 0x67, 0x06, 0xAF, 0x37,
0x29, 0xAD, 0x65, 0xD8, 0xEB, 0x71, 0xC4, 0x7D,
0x94, 0x3D, 0xEA, 0xCC, 0xDF, 0x72, 0x41, 0x51,
0x3C, 0xA1, 0x66, 0x98, 0x32, 0x32, 0x40, 0x54,
0xB0, 0x2F, 0xEB, 0xCE, 0xDF, 0x4A, 0x64, 0xFB,
0x9A, 0x90, 0xDC, 0xF6, 0x6F, 0xA9, 0xD4, 0xCA,
0xCB, 0x91, 0xC4, 0xFE, 0xEE, 0x9C, 0x01, 0x50,
0x2E, 0xAC, 0xCC, 0x5F, 0x89, 0xD0, 0x91, 0xA3,
0xD9, 0xF9, 0x4B, 0x8D, 0xDE, 0x6C, 0x60, 0x21,
0x19, 0xB1, 0xD3, 0x4D, 0x75, 0x56, 0x6F, 0xB8,
0x25, 0xA4, 0x92, 0x4F, 0x12, 0xF5, 0x8F, 0xC1,
0x17, 0x4B, 0xB3, 0x34, 0x21, 0x22, 0xAC, 0x52,
0xD2, 0x64, 0xC9, 0x9A, 0x7D, 0xFC, 0xC0, 0x0A,
0x89, 0x34, 0xFF, 0x08, 0xD3, 0x04, 0xDC, 0xFE,
0x7C, 0xB3, 0xB8, 0xFD, 0x85, 0xDD, 0x79, 0x51,
0xA7, 0x89, 0xE8, 0xF1, 0x23, 0xB1, 0xDF, 0xD7,
0x1F, 0x7B, 0xB1, 0x5D, 0x42, 0xF9, 0x61, 0xF8,
0xDC, 0x81, 0x04, 0xF1, 0xCC, 0xFA, 0xD7, 0xED,
0xBF, 0x47, 0xAC, 0xBD, 0xE5, 0xFA, 0xAC, 0xB3,
0x1C, 0xD9, 0xA1, 0xB3, 0x60, 0xEE, 0x9C, 0x8A,
0x36, 0x57, 0xB4, 0x2F, 0xA1, 0xA2, 0xF3, 0xE2,
0x09, 0x9A, 0x6E, 0x43, 0x9B, 0xE5, 0x93, 0xB8,
0x3D, 0x9E, 0x9F, 0xC1, 0xC6, 0x0D, 0x02, 0xEB,
0x4D, 0x38, 0xE9, 0xB4, 0x9F, 0xEA, 0x33, 0x8C,
0x07, 0xD8, 0xB4, 0x71, 0xAD, 0xE5, 0x43, 0xB2,
0xCC, 0x55, 0x93, 0x6A, 0xDB, 0x1E, 0x80, 0xDB,
0xC2, 0xEA, 0x42, 0x8E, 0xFC, 0x86, 0x44, 0xC9,
0x8A, 0xC4, 0xF2, 0x46, 0xA7, 0x39, 0x50, 0x0D,
0x1A, 0xAA, 0x07, 0x04, 0xBE, 0xD4, 0xCE, 0x62,
0x4D, 0x0F, 0x91, 0x7D, 0x29, 0x88, 0x9C, 0x4C,
0xAF, 0xF7, 0xD8, 0x40, 0x93, 0x88, 0xC7, 0x20,
0xD2, 0x17, 0x2A, 0xC4, 0x92, 0x72, 0xD0, 0xC0,
0x4E, 0x56, 0x47, 0xB1, 0x27, 0x02, 0xE6, 0x61,
0x82, 0x5E, 0xC8, 0x2E, 0x90, 0xD2, 0x31, 0x22,
0xE2, 0xA9, 0x4A, 0x91, 0x45, 0x69, 0xB1, 0xA5,
0x0F, 0x66, 0x2C, 0x30, 0xAD, 0x7F, 0x1B, 0x0E,
0x22, 0x17, 0x60, 0x2E, 0x3D, 0x7F, 0x7F, 0x8C,
0x33, 0x51, 0xA0, 0x25, 0xDE, 0xFD, 0x75, 0xBC,
0xEF, 0xE6, 0xE7, 0x20, 0x04, 0x5A, 0xEC, 0x50,
0x21, 0x48, 0x56, 0x98, 0xE2, 0x33, 0x6D, 0x22,
0x5C, 0xC3, 0xFB, 0xFC, 0x6F, 0xB3, 0xA7, 0x8E,
0x6F, 0x67, 0x70, 0x9D, 0xDA, 0x02, 0x01, 0x59,
0x7B, 0x3D, 0x2B, 0x38, 0xCC, 0x0F, 0x44, 0x3D,
0xFB, 0x9A, 0xB3, 0x23, 0x15, 0x50, 0x6E, 0xBF,
0x8B, 0xA1, 0x94, 0x33, 0xE5, 0x7B, 0x88, 0x4E,
0xCB, 0x6D, 0x9F, 0xBF, 0xBC, 0x7A, 0xA8, 0x1E,
0x68, 0x25, 0xED, 0x8E, 0x53, 0x21, 0x72, 0xC5,
0x70, 0xB3, 0xE4, 0xA6, 0xA1, 0x5A, 0x2D, 0xC8,
0x43, 0x9D, 0x60, 0x77, 0x78, 0xE0, 0xC4, 0xAF,
0xC8, 0x29, 0xBA, 0xD0, 0x4D, 0x39, 0x83, 0x51,
0xA7, 0x10, 0x7F, 0x0C, 0x34, 0x0E, 0x6C, 0x75,
0x26, 0xD7, 0xD6, 0xC7, 0x32, 0x53, 0xAF, 0x4E,
0xBE, 0xF2, 0xC2, 0x0F, 0x99, 0x23, 0xB9, 0xE1,
0xC8, 0xB4, 0xBC, 0x5A, 0xC6, 0xCB, 0xEB, 0x4D,
0x28, 0x56, 0x72, 0xFE, 0x1B, 0x2C, 0x5D, 0xE3,
0xBC, 0xC7, 0xA3, 0xC0, 0x7D, 0x27, 0xF0, 0xD0,
0x4F, 0x3F, 0x1F, 0xF7, 0x87, 0x15, 0xF2, 0xEA,
0xD4, 0x03, 0x6D, 0x2F, 0xD4, 0x8E, 0x50, 0x4B,
0x05, 0xBF, 0xF7, 0x8C, 0x67, 0x5A, 0xDC, 0x4D,
0xCD, 0xCF, 0x9D, 0x02, 0xB6, 0xE7, 0xAE, 0x49,
0xD1, 0x7C, 0x00, 0xE7, 0x3B, 0xEA, 0xFB, 0x0D,
0x2A, 0x7B, 0x41, 0x33, 0x66, 0xD0, 0x29, 0x9F,
0xB3, 0x8A, 0x71, 0xB0, 0xE2, 0x76, 0xA9, 0xDB,
0xFD, 0x64, 0x04, 0x69, 0xDF, 0x89, 0x1F, 0x56,
0x86, 0x92, 0xD9, 0xD9, 0xB9, 0xF3, 0x4F, 0xAC,
0xAE, 0x61, 0x48, 0x20, 0xCE, 0x3C, 0x2B, 0x44,
0xAB, 0x42, 0xFA, 0xAB, 0x2E, 0x94, 0x82, 0xC8,
0xD9, 0x97, 0xCF, 0x27, 0xDF, 0xAC, 0xAC, 0xE7,
0xCA, 0xB2, 0x84, 0xAB, 0xF2, 0x5D, 0xDF, 0x56,
0x0C, 0x8C, 0x07, 0x3C, 0x3D, 0xA8, 0xDD, 0xBE,
0xFF, 0x4E, 0x28, 0x0D, 0xB2, 0x2D, 0xE6, 0x9D,
0x44, 0x21, 0xCB, 0xE7, 0x33, 0x63, 0x22, 0x8F,
0x4C, 0xFF, 0xB6, 0x1D, 0x9A, 0x71, 0x3F, 0xB1,
0x29, 0xAE, 0x3A, 0x35, 0xEE, 0x9C, 0x97, 0x68,
0xA7, 0x52, 0x66, 0x01, 0xD8, 0x9A, 0x5D, 0xF4,
0xB3, 0x2F, 0x5C, 0xD4, 0x0E, 0xF9, 0xCF, 0x07,
0xF6, 0x8C, 0xBA, 0xA6, 0x8D, 0x6B, 0xC6, 0x01,
0xC2, 0x69, 0xAE, 0x60, 0x08, 0x1A, 0x0E, 0x3F,
0xAE, 0x60, 0x29, 0xF3, 0x48, 0x0D, 0xE0, 0xD0,
0xAE, 0x52, 0x44, 0xE9, 0x7F, 0x1F, 0x92, 0x5F,
0x71, 0xAD, 0xEC, 0x6B, 0x47, 0x66, 0x92, 0x22,
0x27, 0xAE, 0x6E, 0x25, 0xCD, 0xF3, 0x5F, 0x55,
0x59, 0xBD, 0x73, 0xCE, 0x2B, 0x7E, 0x99, 0x44,
0x56, 0x70, 0xA3, 0xE7, 0x7A, 0x59, 0x75, 0xD8,
0x48, 0x0C, 0x39, 0x2B, 0xD7, 0x53, 0xC6, 0xAD,
0x4A, 0x6F, 0xB4, 0x14, 0x96, 0xDF, 0xF2, 0x4A,
0x0C, 0xA2, 0xD5, 0x29, 0x98, 0x7C, 0x42, 0x87,
0xD9, 0x1F, 0x97, 0x61, 0xD9, 0xBF, 0x99, 0x4F,
0x2C, 0x4C, 0x75, 0xAC, 0xB8, 0x06, 0x75, 0xD6,
0x87, 0x76, 0x7E, 0xE3, 0x23, 0x4B, 0xEA, 0x1A,
0x1A, 0xF4, 0xB7, 0x09, 0xAF, 0x53, 0xEB, 0xA6,
0x39, 0x10, 0xFE, 0xD4, 0xEB, 0x1B, 0xAE, 0x38,
0x31, 0x33, 0xBA, 0x68, 0xEE, 0xC7, 0x65, 0x76,
0xFB, 0x49, 0x77, 0xD4, 0x19, 0xC4, 0xE6, 0xA7,
0x05, 0xFE, 0x2A, 0xDA, 0x39, 0x99, 0x1A, 0x92,
0xD2, 0xF0, 0x61, 0x97, 0xF6, 0x06, 0x6C, 0x88,
0x7B, 0x6F, 0x60, 0xE6, 0x70, 0x08, 0xF0, 0xB4,
0x6B, 0x39, 0x6F, 0x05, 0x41, 0x81, 0xF9, 0xBE,
0x7A, 0x51, 0xC4, 0x75, 0xB0, 0x6A, 0x89, 0xA0,
0xA6, 0x9A, 0x5B, 0xEE, 0x7D, 0x78, 0x17, 0x5F,
0x9F, 0x3B, 0x7D, 0xDD, 0x8A, 0x9E, 0xAA, 0x1A,
0xDA, 0x49, 0x08, 0xE9, 0xFD, 0x91, 0xA6, 0xFA,
0xCE, 0xCF, 0x67, 0xDF, 0x0F, 0xC9, 0xD6, 0x38,
0xD9, 0xD5, 0xD1, 0xC0, 0x76, 0x59, 0x42, 0x53,
0xBF, 0x48, 0xE9, 0x11, 0x74, 0xC7, 0x11, 0xD8,
0xE7, 0x8E, 0xD3, 0xC8, 0x25, 0xA1, 0x26, 0x50,
0xBB, 0xB4, 0x35, 0xAF, 0xAF, 0x06, 0x23, 0x69,
0x3E, 0x30, 0xFD, 0x7B, 0x34, 0x83, 0x07, 0xD0,
0xF0, 0x0F, 0x6C, 0x9A, 0x13, 0x5D, 0xC2, 0x7B,
0xDF, 0x6F, 0xDD, 0x8E, 0xF4, 0x30, 0x82, 0x05,
0x41, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x05, 0x32,
0x04, 0x82, 0x05, 0x2E, 0x30, 0x82, 0x05, 0x2A,
0x30, 0x82, 0x05, 0x26, 0x06, 0x0B, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01,
0x02, 0xA0, 0x82, 0x04, 0xEE, 0x30, 0x82, 0x04,
0xEA, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30,
0x0E, 0x04, 0x08, 0x74, 0xC0, 0x84, 0x8F, 0xC7,
0x74, 0x5E, 0x21, 0x02, 0x02, 0x08, 0x00, 0x04,
0x82, 0x04, 0xC8, 0x1E, 0xF4, 0xE9, 0x07, 0x27,
0x9E, 0x5A, 0xC9, 0x39, 0x1D, 0x37, 0x2C, 0x06,
0x4B, 0x57, 0xEA, 0xC5, 0x42, 0x9A, 0x60, 0xD5,
0x42, 0xB2, 0x34, 0x2D, 0xD3, 0x88, 0x7C, 0x78,
0x87, 0xB6, 0xE9, 0x42, 0x44, 0x1F, 0x67, 0x32,
0x92, 0x54, 0x22, 0xDA, 0xB2, 0x43, 0xE7, 0x40,
0xBE, 0x1F, 0xAF, 0x3A, 0xCD, 0x2A, 0x9F, 0xD7,
0x44, 0x5B, 0x37, 0x69, 0x85, 0xDF, 0xEB, 0x2A,
0xB9, 0xE2, 0x92, 0x3B, 0xEA, 0xD5, 0x42, 0x53,
0x95, 0x4A, 0xB0, 0x1B, 0xA5, 0xEF, 0xA6, 0x0D,
0x29, 0xF4, 0x33, 0xFE, 0xD7, 0x49, 0x04, 0x1E,
0x8C, 0xAD, 0x63, 0x1E, 0x79, 0x63, 0x74, 0x0C,
0xE5, 0x5E, 0xA2, 0x2C, 0xBE, 0xB8, 0x90, 0xCE,
0x06, 0x25, 0xBF, 0xD1, 0x5A, 0x50, 0xCF, 0x3B,
0x52, 0xE2, 0xA7, 0xFF, 0x19, 0x02, 0xCF, 0xD0,
0x9B, 0xD9, 0xF7, 0x28, 0x07, 0x38, 0x1F, 0xF2,
0xAF, 0x44, 0x91, 0x3F, 0x0F, 0xB6, 0x6E, 0x8C,
0xC0, 0x32, 0x92, 0xC0, 0xCD, 0x25, 0x98, 0x67,
0xF1, 0x47, 0x52, 0x50, 0xF0, 0xA3, 0x7B, 0xE6,
0x74, 0xDC, 0x72, 0x28, 0xC8, 0xAB, 0xB3, 0x31,
0x7D, 0xA3, 0xF7, 0xC7, 0xD1, 0xE6, 0x99, 0xB4,
0xB6, 0x5A, 0x3A, 0x4D, 0x83, 0x4F, 0xB8, 0xB5,
0x86, 0xF8, 0x37, 0x7F, 0xA0, 0x16, 0x2F, 0x3C,
0x62, 0x7A, 0xD4, 0x3A, 0xEB, 0xC2, 0xE8, 0x03,
0x49, 0x17, 0x9E, 0xFB, 0xD7, 0xAF, 0x91, 0x32,
0xFD, 0xEA, 0x4F, 0x64, 0xC6, 0x6E, 0x02, 0xEA,
0xC4, 0xC8, 0x1F, 0x16, 0xC5, 0x4C, 0xFB, 0xC5,
0x42, 0xF5, 0x85, 0x05, 0x92, 0x59, 0x4B, 0x31,
0xE5, 0xE9, 0x69, 0xE7, 0x02, 0x98, 0x33, 0xBA,
0x4C, 0x17, 0x09, 0xEF, 0x89, 0x20, 0xFA, 0x83,
0x9F, 0xAE, 0x0E, 0x1B, 0x7D, 0x98, 0xB9, 0xF2,
0x3C, 0x0F, 0xB7, 0x1C, 0x72, 0xDF, 0x17, 0x84,
0x7F, 0x0A, 0xFD, 0x12, 0x3C, 0x6F, 0x68, 0x5D,
0x45, 0xEB, 0xB8, 0xD6, 0x24, 0x65, 0x42, 0x75,
0x5C, 0xC2, 0xF3, 0x3A, 0x6A, 0x4E, 0x51, 0x34,
0x1B, 0xB6, 0x81, 0xB2, 0x8A, 0xEF, 0x28, 0xA4,
0xC5, 0x88, 0x9A, 0x97, 0xE0, 0xEF, 0x31, 0x12,
0x01, 0x7E, 0x1B, 0x43, 0x0F, 0x27, 0x80, 0x87,
0x98, 0xC5, 0xD5, 0x83, 0xCB, 0x4B, 0xB7, 0x01,
0x79, 0x60, 0xA1, 0x1A, 0x03, 0x05, 0xC6, 0x36,
0x04, 0x31, 0x3C, 0x06, 0xDB, 0x08, 0xA8, 0xDA,
0x8E, 0x32, 0x19, 0x91, 0xF1, 0x0D, 0x61, 0x6F,
0xE4, 0xB2, 0x79, 0x8A, 0xDE, 0xF4, 0xF7, 0xFB,
0x2C, 0x23, 0x5B, 0xD9, 0x64, 0x2F, 0xB7, 0xB3,
0x8B, 0xCA, 0xB8, 0x8C, 0x1D, 0x3B, 0x49, 0x05,
0x38, 0xA1, 0xE5, 0x8C, 0x1A, 0xDC, 0xA5, 0x61,
0xFE, 0xF4, 0x2B, 0xDC, 0x77, 0x28, 0xF6, 0x19,
0xE7, 0xB7, 0x8F, 0x4D, 0x27, 0x2D, 0xED, 0x8A,
0x3F, 0x3D, 0xDC, 0x9F, 0xD1, 0x30, 0xFF, 0xD6,
0xC3, 0xBE, 0x41, 0x25, 0xE3, 0xA5, 0x9B, 0x73,
0xDF, 0x6A, 0xD9, 0xF9, 0x70, 0x84, 0x02, 0x4C,
0x35, 0xD4, 0x3E, 0x05, 0x76, 0x3A, 0xDC, 0x6D,
0x5A, 0x81, 0xB3, 0x94, 0xF7, 0x22, 0xF7, 0xDC,
0xC1, 0x43, 0x31, 0x57, 0x5B, 0x42, 0x9A, 0x0B,
0xF4, 0x95, 0x30, 0xA9, 0xBB, 0xD8, 0x06, 0xFB,
0x1D, 0x6F, 0x9B, 0xC3, 0xBB, 0xF3, 0xBF, 0xFB,
0xB4, 0x9F, 0x35, 0x64, 0x0A, 0x69, 0xB7, 0xD1,
0x3E, 0xCA, 0x78, 0x07, 0x04, 0x03, 0x79, 0xD4,
0xF3, 0xA8, 0xEC, 0x18, 0xDB, 0x03, 0x5E, 0x47,
0xD7, 0xD0, 0x56, 0x2C, 0x74, 0x94, 0x86, 0x04,
0x46, 0xB8, 0xD4, 0x35, 0x0A, 0x7B, 0xE6, 0x78,
0xC4, 0x43, 0x3C, 0x56, 0xCC, 0x37, 0x8B, 0xFD,
0xE8, 0xF4, 0x57, 0xEA, 0xAE, 0xCF, 0x36, 0x97,
0x12, 0xAC, 0x39, 0xCF, 0x7C, 0xEF, 0x22, 0x67,
0x01, 0xEC, 0xD8, 0x09, 0x49, 0x4E, 0xE3, 0x74,
0xDD, 0x39, 0xE1, 0x39, 0xD7, 0x0C, 0x5F, 0x1B,
0xCE, 0x69, 0xBC, 0x72, 0x44, 0x87, 0x64, 0x1C,
0x08, 0x05, 0x93, 0x69, 0x6D, 0x7F, 0x90, 0x0A,
0x2C, 0xCB, 0x8A, 0xBB, 0x7F, 0xE3, 0xE0, 0x80,
0x31, 0xD0, 0x0A, 0x3A, 0x95, 0xFF, 0xF7, 0xB4,
0x36, 0x38, 0x93, 0xE0, 0x0C, 0x11, 0x37, 0x12,
0x06, 0xF6, 0xAD, 0xE9, 0xB1, 0x7A, 0x00, 0xF5,
0xD2, 0x32, 0x6B, 0xD0, 0x27, 0xA5, 0x1B, 0x3D,
0xE8, 0xDB, 0xCC, 0xA9, 0x1F, 0x1F, 0xB1, 0x99,
0x3D, 0x7C, 0xB7, 0xCA, 0xDA, 0x27, 0x2C, 0x64,
0x1C, 0x49, 0xB6, 0x87, 0x44, 0x06, 0x94, 0x9D,
0xBC, 0x6B, 0x20, 0xA2, 0x68, 0x15, 0x1F, 0xE2,
0xF2, 0xAD, 0x6D, 0x23, 0x2E, 0x2B, 0x74, 0xE2,
0x5D, 0xE4, 0xB0, 0xC7, 0x84, 0xCB, 0x64, 0xBF,
0xE0, 0xA8, 0x18, 0x83, 0xB4, 0xC9, 0xD9, 0x73,
0xA8, 0xE6, 0xA9, 0x36, 0xD5, 0x63, 0x1E, 0x2C,
0x2A, 0x55, 0x09, 0x77, 0x5E, 0xB3, 0x4B, 0xEA,
0xB5, 0xD0, 0x14, 0x5F, 0xEB, 0x50, 0x7B, 0xAA,
0xEF, 0x94, 0xBA, 0x2B, 0xD7, 0x8A, 0x07, 0xF1,
0xF9, 0x5E, 0x12, 0x12, 0x21, 0x52, 0xE5, 0x0A,
0x3E, 0xC0, 0xBC, 0x5D, 0x4C, 0xE2, 0x12, 0x7C,
0x39, 0xF9, 0x16, 0x9D, 0xBD, 0x96, 0x83, 0x3B,
0x7F, 0x3D, 0x6A, 0xEC, 0xF1, 0x25, 0xD2, 0xB0,
0xB0, 0xEB, 0x20, 0x06, 0x07, 0xD6, 0xD9, 0x4C,
0x07, 0x9A, 0x82, 0xC1, 0xFC, 0xF7, 0x66, 0x15,
0xBD, 0x62, 0x65, 0xD8, 0x6C, 0xF6, 0x33, 0x7B,
0x5A, 0x28, 0xEC, 0x90, 0xA1, 0x26, 0x9F, 0xC3,
0x28, 0x4A, 0x64, 0x50, 0x5F, 0xCA, 0xE2, 0x6D,
0xB8, 0x0F, 0xE2, 0x94, 0xB5, 0x8E, 0x1F, 0x8A,
0x8F, 0x6B, 0xA6, 0x86, 0x1F, 0xEE, 0xDC, 0x24,
0xB4, 0xB8, 0x25, 0xEC, 0x28, 0x2D, 0xF9, 0xCB,
0x7D, 0x38, 0xFF, 0xC7, 0x74, 0x2E, 0xD3, 0x10,
0xEC, 0x03, 0x31, 0xEE, 0x83, 0xE7, 0xA4, 0xF7,
0xBA, 0x28, 0x21, 0xE0, 0x7F, 0xB4, 0xB7, 0xE1,
0x7A, 0xF9, 0x2B, 0xB0, 0x2C, 0x3B, 0x80, 0x5F,
0xE0, 0x5D, 0xB2, 0x7E, 0x59, 0xFF, 0x59, 0x07,
0x58, 0x42, 0x57, 0xEE, 0x44, 0xF1, 0xB1, 0xAD,
0xBA, 0xDE, 0xCB, 0x1D, 0x8A, 0x36, 0x67, 0xE8,
0x45, 0xFF, 0x07, 0x8D, 0xEE, 0xA4, 0x51, 0x9C,
0x4C, 0x83, 0x5D, 0x2E, 0x2F, 0xE1, 0x5B, 0x75,
0xE8, 0x29, 0xCD, 0x0B, 0x07, 0x62, 0xE0, 0xC3,
0x0D, 0x1D, 0xEA, 0xCF, 0xF0, 0x8A, 0x65, 0x27,
0x70, 0x42, 0x9F, 0x26, 0x00, 0x15, 0x70, 0xC5,
0x4A, 0xF6, 0x25, 0xD0, 0x40, 0x72, 0xE9, 0xC1,
0x73, 0xFD, 0x48, 0x94, 0xA3, 0x8D, 0x66, 0x63,
0x96, 0x4F, 0xF7, 0xEE, 0xFB, 0x4C, 0xC7, 0xB8,
0x6B, 0xE9, 0x90, 0xE1, 0x2A, 0x66, 0x80, 0x99,
0x3B, 0xB0, 0x1A, 0x6C, 0xF9, 0x0E, 0x72, 0xDA,
0x8E, 0x4F, 0x46, 0xC2, 0x6A, 0x4B, 0x7A, 0x16,
0xE5, 0x26, 0x0B, 0x5C, 0xD4, 0x47, 0x34, 0xE5,
0x37, 0xBE, 0x68, 0x6C, 0xDA, 0xD3, 0x9B, 0x6F,
0xAE, 0x51, 0x9C, 0x99, 0x0A, 0x5B, 0xF8, 0x37,
0xBC, 0xDE, 0xFC, 0x93, 0xC5, 0xE7, 0x0F, 0xEF,
0x0B, 0xA6, 0x07, 0xC2, 0xA6, 0xE6, 0xDA, 0x2D,
0x1B, 0x49, 0xC9, 0xDE, 0x6B, 0x27, 0xDC, 0x00,
0xEF, 0x23, 0x87, 0x0E, 0xEB, 0xD1, 0x48, 0x7D,
0xB4, 0xF2, 0x58, 0xC6, 0x3C, 0xE2, 0x89, 0xBA,
0xB0, 0x05, 0xAC, 0x94, 0x41, 0x9A, 0xA8, 0xFF,
0x3E, 0xBC, 0x3A, 0x52, 0x9C, 0xF9, 0x7F, 0x07,
0x8B, 0xB0, 0x2C, 0x71, 0x83, 0x7B, 0xCF, 0x2E,
0x7F, 0x7C, 0x96, 0x65, 0xD9, 0x08, 0x17, 0xEC,
0xFA, 0xDE, 0x4E, 0x40, 0x12, 0x26, 0x70, 0x71,
0x65, 0xA5, 0xDC, 0x98, 0x47, 0xA3, 0xFC, 0xE0,
0x9A, 0x16, 0xED, 0x45, 0x56, 0x72, 0x50, 0x05,
0x28, 0x2C, 0x99, 0xEC, 0x20, 0x2E, 0x40, 0xC0,
0x26, 0x69, 0xCD, 0x49, 0x45, 0x17, 0xA4, 0xA3,
0x42, 0x0D, 0x14, 0x65, 0x87, 0x33, 0x8C, 0x92,
0xC5, 0xC4, 0x61, 0xFD, 0xE8, 0x68, 0x56, 0x20,
0x57, 0xF5, 0x8E, 0x5F, 0xCF, 0x7E, 0x97, 0xF6,
0x49, 0x97, 0x0A, 0xFE, 0xD3, 0x60, 0x1A, 0x5B,
0x0C, 0x75, 0xDD, 0x8E, 0x31, 0x78, 0x29, 0xA6,
0xB1, 0x4D, 0xAA, 0xDF, 0x8A, 0xD1, 0xE6, 0x91,
0xE3, 0x32, 0x3F, 0xEC, 0x8A, 0x1F, 0x0E, 0x35,
0x07, 0x6E, 0x4B, 0x83, 0x3B, 0xE5, 0x67, 0x34,
0x1F, 0x0C, 0x81, 0xD8, 0xD5, 0x25, 0x68, 0xE5,
0x28, 0x1B, 0x5C, 0x81, 0x3E, 0xE3, 0x5C, 0xB4,
0xB6, 0xBD, 0x62, 0x6A, 0x70, 0x33, 0xC2, 0xC5,
0x75, 0x27, 0xF4, 0x30, 0xE1, 0x1D, 0xC1, 0x4C,
0xC5, 0x02, 0x12, 0x46, 0xAC, 0xEC, 0xF9, 0xE8,
0xE7, 0x58, 0x24, 0x11, 0xB1, 0xF3, 0xB7, 0x8C,
0x3C, 0xA4, 0x0A, 0x94, 0xA6, 0x7C, 0x68, 0x54,
0x5B, 0xB9, 0x4D, 0x57, 0x9C, 0xE7, 0x28, 0x09,
0x6B, 0x89, 0x26, 0x5D, 0xE7, 0x50, 0xA9, 0x95,
0x90, 0x91, 0x8E, 0x00, 0x59, 0xF8, 0x3A, 0x70,
0xAF, 0x48, 0x2E, 0xE8, 0xC4, 0x34, 0x8C, 0xF4,
0x5F, 0x7F, 0xCB, 0x07, 0xAA, 0xF0, 0xD9, 0xFB,
0x5C, 0x32, 0x90, 0x22, 0x1A, 0xD2, 0x1A, 0xCF,
0x92, 0x06, 0x02, 0xCF, 0x10, 0x18, 0x7B, 0x93,
0xCC, 0x07, 0x4A, 0x31, 0x25, 0x30, 0x23, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x09, 0x15, 0x31, 0x16, 0x04, 0x14, 0xD1, 0xDE,
0x23, 0x16, 0x9F, 0x6E, 0xF4, 0x42, 0x21, 0x23,
0xE1, 0x11, 0xAA, 0xC8, 0x7C, 0x60, 0x4A, 0x78,
0x9D, 0x24, 0x30, 0x31, 0x30, 0x21, 0x30, 0x09,
0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05,
0x00, 0x04, 0x14, 0xD6, 0x4A, 0xBB, 0x75, 0xB1,
0xF9, 0x9E, 0xD3, 0x58, 0x6D, 0xD1, 0x74, 0x9F,
0x00, 0x8A, 0xF2, 0xC8, 0xAA, 0x52, 0x4D, 0x04,
0x08, 0x77, 0x46, 0xE7, 0xBA, 0x25, 0x4B, 0xDA,
0x41, 0x02, 0x02, 0x08, 0x00]
};
const WPA_EAP_CLIENT_LIST = [
{
ssid: 'WPA-EAP-PEAP',
keyManagement: 'WPA-EAP',
eap: 'PEAP',
identity: EAP_USERNAME,
password: EAP_PASSWORD,
serverCertificate: CLIENT_PKCS12_CERT.nickname,
phase2: 'MSCHAPV2'
}
];
/**
* Convert the given MozWifiNetwork object array to testAssociate chain.
*
* @param aNetworks
* An array of MozWifiNetwork which we want to convert.
*
* @return A promise chain which "then"s testAssociate accordingly.
*/
function convertToTestAssociateChain(aNetworks) {
let chain = Promise.resolve();
aNetworks.forEach(function (aNetwork) {
network = new window.MozWifiNetwork(aNetwork);
chain = chain.then(() => gTestSuite.testAssociate(network));
});
return chain;
}
gTestSuite.doTestWithCertificate(
new Blob([new Uint8Array(CLIENT_PKCS12_CERT.content)]),
CLIENT_PKCS12_CERT.password,
CLIENT_PKCS12_CERT.nickname,
CLIENT_PKCS12_CERT.usage,
function() {
return gTestSuite.ensureWifiEnabled(true)
// Load required server files.
.then(() => gTestSuite.writeFile(SERVER_EAP_USER_CONF.path, SERVER_EAP_USER_CONF.content))
.then(() => gTestSuite.writeFile(CA_CERT.path, CA_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_CERT.path, SERVER_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_KEY.path, SERVER_KEY.content))
// Start AP.
.then(() => gTestSuite.startHostapds(WPA_EAP_AP_LIST))
// Scan test.
.then(() => gTestSuite.testWifiScanWithRetry(SCAN_RETRY_CNT, WPA_EAP_AP_LIST))
// Associate test.
.then(() => convertToTestAssociateChain(WPA_EAP_CLIENT_LIST))
// Tear down.
.then(gTestSuite.killAllHostapd)
});

View File

@ -0,0 +1,622 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
const SCAN_RETRY_CNT = 5;
const EAP_USERNAME = 'username';
const EAP_PASSWORD = 'password';
const SERVER_EAP_USER_CONF = {
path: HOSTAPD_CONFIG_PATH + 'hostapd.eap_user',
content: '* PEAP,TTLS,TLS\n' +
'"' + EAP_USERNAME + '" MSCHAPV2,TTLS-MSCHAPV2 "' + EAP_PASSWORD + '" [2]\n'
};
const CA_CERT = {
path: HOSTAPD_CONFIG_PATH + 'ca.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIIDsTCCApmgAwIBAgIJAKxTf+8X8qngMA0GCSqGSIb3DQEBCwUAMG4xCzAJBgNV\n' +
'BAYTAlRXMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTER\n' +
'MA8GA1UEAwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdt\n' +
'YWlsLmNvbTAgFw0xNDEyMjQxMTI4NTBaGA8yMjg4MTAwNzExMjg1MFowbjELMAkG\n' +
'A1UEBhMCVFcxEzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCGNodWNrbGVl\n' +
'MREwDwYDVQQDDAhjaHVja2xlZTEkMCIGCSqGSIb3DQEJARYVY2h1Y2tsaTA3MDZA\n' +
'Z21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo3c2yFxY\n' +
'o6gGg0I83jy00ME+MAfzCd+4ShL45ZLqysQP93jRBfPzU9ZuZ29ysVwgWIdqkZao\n' +
'XTuV/NAW2GMGd8W1jQJ3J81fjb9wvhlny3rrACwvUn1N1S1BnM+BAAiDLGxEmvAQ\n' +
'onp2aaa6HsHsYS8ONX+d2Qh4LEA4vupeSGAqJychCZv/l+aq/ErFZhFYB3CPUQEt\n' +
'cClO24ucsIYP95lA0zhscnmAj06qplFD4Bv6IVrdDqujy1zNwCQwsJq/8OQdaTN/\n' +
'h3y9pWvNKMBMM2niOUAjtuNpqsSK/lTS1WAT3PdtVECX9fYBi0Bg+HM92xs/6gt6\n' +
'kh9jPV8keXHvSwIDAQABo1AwTjAdBgNVHQ4EFgQU7hBqhuG04xeCzrQ3ngx18ZJ3\n' +
'lUswHwYDVR0jBBgwFoAU7hBqhuG04xeCzrQ3ngx18ZJ3lUswDAYDVR0TBAUwAwEB\n' +
'/zANBgkqhkiG9w0BAQsFAAOCAQEAFYX2iy680GAnBTttk0gyX6gk+8pYr3D22k/G\n' +
'6rvcjefzS7ELQPRKr6mfmwXq3mMf/4jiS2zI5zmXsestPYzHYxf2viQ6t7vr9XiJ\n' +
'3WfFjNw4ERlRisAvg0aqqTNNQq5v2VME4sdFZagy217f73C7azwCHl0bqOLH05rl\n' +
'8RubOxiHEj7ZybJqnRciK/bht4D+rZkwf4bBBmoloqH7xT0+rFQclpYXDGGjNUQB\n' +
'LcHLF10xcr7g3ZVVu82fe6+d85gIGOIMR9+TKhdw6gO3CNcnDAj6gxksghgtcxmh\n' +
'OzOggCn7nlIwImtsg2sZkpWB4lEi9hdv4lkNuyFjOL3bnuc+NA==\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_CERT = {
path: HOSTAPD_CONFIG_PATH + 'server.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIID1DCCArygAwIBAgIBADANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJUVzET\n' +
'MBEGA1UECAwKU29tZS1TdGF0ZTERMA8GA1UECgwIY2h1Y2tsZWUxETAPBgNVBAMM\n' +
'CGNodWNrbGVlMSQwIgYJKoZIhvcNAQkBFhVjaHVja2xpMDcwNkBnbWFpbC5jb20w\n' +
'IBcNMTQxMjI0MTEyOTQ5WhgPMjI4ODEwMDcxMTI5NDlaMG4xCzAJBgNVBAYTAlRX\n' +
'MRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTERMA8GA1UE\n' +
'AwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdtYWlsLmNv\n' +
'bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdhQmKilTJbWZRxTiSV\n' +
'rqIU+LYW1RKghx5o+0JpNRJVLuz5kBMaNskbbfUSNuHbEq0QA9BDKAZWIc4LSotk\n' +
'lCo8TbcO9CJvJPQGGjGdHcohWX5vy6BE/OVE46CUteMFyZF6F8R2fNUww08iR/u1\n' +
'YZebL5pWO1j43sPpAzEy6Tij2ACPt6EZcFaZG3SF2mVJWkCQnBqrojP65WUvZQqp\n' +
'seUhW2YAS8Nu0Yrohgxz6VYk+cNDuDZVGs6qWRStZzJfYrfc76DtkHof5B14M+xp\n' +
'XJaBLxN+whvnYkDTfinaCxnW1O7eXUltr87fLc5zmeBkgwaiaQuIdcfZm7vDUiz8\n' +
'vnUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH\n' +
'ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFKK4f9/YavTHOfEiAB83Deac\n' +
'6gT5MB8GA1UdIwQYMBaAFO4QaobhtOMXgs60N54MdfGSd5VLMA0GCSqGSIb3DQEB\n' +
'CwUAA4IBAQBWnO9o9KSJIqjoz5Nwll63ULOdcvgGdOeJIw1fcKQ817Rsp+TVcjcH\n' +
'IrIADsT/QZGXRO/l6p1750e2iFtJEo1hsRaxtA1wWn2I9HO3+av2spQhr3jpYGPf\n' +
'zpsMTp4RNYV7Q8+q1kZIz9PY4V1T0p6lveK8+fUj2hSLnxSj0QiGSJJtnEC3w4Rv\n' +
'C9T6oUwIeToULmi+8FXQFdEqwKRU98DPq3eLzN28ZxUgoPE1C8+42D2UW8uyp/Gm\n' +
'tGOa/k7nzkCdVqZI7lX7f0AjEvQgjtAMQ/k7Mhxx7TzW2HO+1YPMoKji6Z4WkNwt\n' +
'JEj9ZUBSNt8B26UksJMBDkcvSegF3a7o\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_KEY = {
path: HOSTAPD_CONFIG_PATH + 'server.key',
content: '-----BEGIN RSA PRIVATE KEY-----\n' +
'MIIEpAIBAAKCAQEAx2FCYqKVMltZlHFOJJWuohT4thbVEqCHHmj7Qmk1ElUu7PmQ\n' +
'Exo2yRtt9RI24dsSrRAD0EMoBlYhzgtKi2SUKjxNtw70Im8k9AYaMZ0dyiFZfm/L\n' +
'oET85UTjoJS14wXJkXoXxHZ81TDDTyJH+7Vhl5svmlY7WPjew+kDMTLpOKPYAI+3\n' +
'oRlwVpkbdIXaZUlaQJCcGquiM/rlZS9lCqmx5SFbZgBLw27RiuiGDHPpViT5w0O4\n' +
'NlUazqpZFK1nMl9it9zvoO2Qeh/kHXgz7GlcloEvE37CG+diQNN+KdoLGdbU7t5d\n' +
'SW2vzt8tznOZ4GSDBqJpC4h1x9mbu8NSLPy+dQIDAQABAoIBAASG4Mr8hgaurEoC\n' +
'iJOsElr7vunjetMBcg/uskW/vcS8ymP3Bp5oafYG+WgnEbfvEW18f5mq7K24JuxW\n' +
'tUqU7ghHdjxByqk9fMlNmiqmNpbwSufkAeuRpWxPNBvhRH/zEbCL5R5A0nTEtqqF\n' +
'TL0aUSzwCRSoAJD0lZo9ICVt0n3GsDyM9rqQg/uZmh1qsRdwPsRuYORND9g48rKq\n' +
'6WN9leskSxhhsYE2D9ocOFd9bNt8Zxejh9ppVSnG/KsIdt18iBzcabatgAQ046fb\n' +
'Z3vprcZJLg93Sg2gSuVqlSTs3M2W8VQnm22/EBMb1y0M48MSRCgnbPLG/CcCLLfF\n' +
'LwxCOgECgYEA/eYt67xyJ6JeAdxdwOZuT1WWGbFpLiG9+2OgiHumyRQ5969XMTWo\n' +
'fIhMKchDdjoy9RR236\/\/EFCs7UEyB7+a7ODRzNiK2zCD8Smjp+21fUPSthEeQesk\n' +
'eiMYICIu5Ay35x9sxIX+XOUVvRhPOGcD29GVeRnKh1inTHOz2dje8LkCgYEAyQeY\n' +
'STi9jjCEcHkM1E/UeDiLfHHepLXi8wS41JNRHl5Jacp7XB5djAjKu/jf367/VpFy\n' +
'GDDMetE7n8eWkrnAvovxOwZ000YDMtL1sUYSjL+XtBS5s6VY1p4qaSAY9nUUGrJh\n' +
'JvtvsuI7SKTtL+60vjBOH7zDnvOdBgAp0utLhZ0CgYEAuLzzqrPKB8afShFSchn4\n' +
'J2dpuLYahsNsXW7HDqeR2nsKFosRETAusLXnXPtnAq4kB6jlOarwFqnsuRCX24Vx\n' +
'r2uBm9/vYL7zMdUPTA+s30ErHuhjsKjsOKYyVqcooSwT32pBFNk+E89nutfmRG7I\n' +
'IvhjHuNCNqqtx/Xj5d1jkZkCgYBQicppC2Jl5OoqZVTOem0U/RJk+PnJ41TZJ7sk\n' +
'7yBAmmWvDH\/\/l+rCf4M5a6vFYcbKV9rt9h711X2dtciNX/3oWQh8LUoAmrwNUJc+\n' +
'PmSQHvIYI3WCk2vUD+nN1B4sHxu+1lg11eYaNKiroeeknG2tBI1ICcgVlmQCU25u\n' +
'IfZPwQKBgQCdO6QHhPLtcHUDNFA6FQ1jKL1iEd7G0JLVRz4Xkpkn1Vrr5MD6JFDa\n' +
'5ccabADyl0lpFqDIVJQIzLku2hOD2i9aBNCY0pL391HeOS7CkZX+TdOY1tquoBq5\n' +
'MnmixZjDCVd2VcrVyTA6ntOBoharKFW0rH1PqU+qu7dZF7CBPbAdEw==\n' +
'-----END RSA PRIVATE KEY-----\n'
};
const WPA_EAP_AP_LIST = [
{
ssid: 'WPA-EAP-TLS',
ieee8021x: 1,
eapol_version: 1,
eap_server: 1,
eapol_key_index_workaround: 0,
eap_user_file: SERVER_EAP_USER_CONF.path,
ca_cert: CA_CERT.path,
server_cert: SERVER_CERT.path,
private_key: SERVER_KEY.path,
wpa: 2,
wpa_key_mgmt: 'WPA-EAP'
}
];
const CLIENT_PKCS12_CERT = {
nickname: 'client',
password: 'password',
usage: ['UserCert', 'ServerCert'],
content: [0x30, 0x82, 0x0E, 0x01, 0x02, 0x01, 0x03, 0x30,
0x82, 0x0D, 0xC7, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82,
0x0D, 0xB8, 0x04, 0x82, 0x0D, 0xB4, 0x30, 0x82,
0x0D, 0xB0, 0x30, 0x82, 0x08, 0x67, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
0x06, 0xA0, 0x82, 0x08, 0x58, 0x30, 0x82, 0x08,
0x54, 0x02, 0x01, 0x00, 0x30, 0x82, 0x08, 0x4D,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x0A, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01,
0x06, 0x30, 0x0E, 0x04, 0x08, 0x67, 0x7A, 0xF3,
0x61, 0xBE, 0xE0, 0x51, 0xC1, 0x02, 0x02, 0x08,
0x00, 0x80, 0x82, 0x08, 0x20, 0xFC, 0x6A, 0x79,
0xA1, 0x6C, 0xAF, 0xBE, 0xEE, 0x62, 0x45, 0x33,
0xB8, 0x48, 0xE1, 0x68, 0xA1, 0x15, 0x11, 0x4B,
0x95, 0xCB, 0x77, 0xC0, 0x5D, 0xA2, 0xCB, 0xDB,
0xD1, 0x83, 0x74, 0x60, 0xD7, 0xEC, 0x42, 0xA6,
0x3A, 0x23, 0xF7, 0x85, 0xEB, 0xC1, 0xFE, 0x6A,
0x57, 0x8E, 0xC1, 0x44, 0xF3, 0x1F, 0xFE, 0xB8,
0x2D, 0x8C, 0x4D, 0xC9, 0x5B, 0xAE, 0x21, 0x2E,
0x4C, 0x1A, 0xEB, 0x84, 0x09, 0xF3, 0x40, 0x92,
0x39, 0x7F, 0x56, 0x02, 0x46, 0x61, 0x16, 0xDE,
0x5C, 0x48, 0xB6, 0x0C, 0x1D, 0xD3, 0x5F, 0x10,
0x9A, 0x39, 0xB8, 0x66, 0x31, 0xFC, 0x39, 0x71,
0x87, 0x23, 0x46, 0x9D, 0xE8, 0x3C, 0x2B, 0xA1,
0x39, 0x8A, 0xD3, 0xFF, 0xD9, 0x43, 0xB6, 0x61,
0xC6, 0x67, 0x70, 0x40, 0xBD, 0xFE, 0xD3, 0xC1,
0x68, 0xF5, 0xF7, 0xC8, 0x89, 0xD8, 0x17, 0xC5,
0xE8, 0x3D, 0x29, 0xD5, 0x91, 0xDF, 0x1F, 0x56,
0x74, 0x5A, 0xC4, 0xA8, 0x14, 0xBA, 0xD4, 0xFA,
0x13, 0x49, 0x2A, 0x9F, 0x63, 0xF1, 0xB2, 0x45,
0xF1, 0xF0, 0x2A, 0xDD, 0x75, 0x66, 0x8A, 0xF7,
0xAB, 0x73, 0x86, 0x26, 0x9D, 0x1F, 0x07, 0xAD,
0xD3, 0xFE, 0xE0, 0xA3, 0xED, 0xA0, 0x96, 0x3E,
0x1E, 0x89, 0x86, 0x02, 0x4C, 0x28, 0xFD, 0x57,
0xA1, 0x67, 0x55, 0xF0, 0x82, 0x3B, 0x7F, 0xCC,
0x2A, 0x32, 0x01, 0x93, 0x1D, 0x8B, 0x66, 0x8A,
0x20, 0x52, 0x84, 0xDD, 0x2C, 0xFD, 0xEE, 0x72,
0xF3, 0x8C, 0x58, 0xB9, 0x99, 0xE5, 0xC1, 0x22,
0x63, 0x59, 0x00, 0xE2, 0x76, 0xC5, 0x3A, 0x17,
0x7F, 0x93, 0xE9, 0x67, 0x61, 0xAA, 0x10, 0xC3,
0xD9, 0xC8, 0x24, 0x46, 0x5B, 0xBE, 0x8C, 0x1F,
0x2D, 0x66, 0x48, 0xD2, 0x02, 0x11, 0xFB, 0x74,
0x14, 0x76, 0x76, 0x5A, 0x98, 0x54, 0x35, 0xA7,
0x85, 0x66, 0x20, 0x26, 0x8B, 0x13, 0x6F, 0x68,
0xE3, 0xC9, 0x58, 0x7D, 0x1C, 0x3E, 0x01, 0x8D,
0xF8, 0xD6, 0x7F, 0xCF, 0xA2, 0x07, 0xB7, 0x95,
0xFD, 0xF0, 0x02, 0x34, 0x32, 0x30, 0xE8, 0xD4,
0x57, 0x5E, 0x53, 0xFB, 0x54, 0xE2, 0x03, 0x32,
0xCC, 0x52, 0x2E, 0xD2, 0x35, 0xD9, 0x58, 0x85,
0x2D, 0xEC, 0x2D, 0x71, 0xD1, 0x8A, 0x29, 0xD0,
0xB0, 0x24, 0xBD, 0x24, 0xDC, 0x1A, 0x28, 0x3F,
0xA0, 0x12, 0x81, 0x15, 0x24, 0xC9, 0xB5, 0x4A,
0x23, 0xB6, 0xA3, 0x45, 0x50, 0x2D, 0x73, 0x99,
0x6B, 0x1C, 0xFB, 0xA4, 0x53, 0xD7, 0x5C, 0xF4,
0x6C, 0xB0, 0xE5, 0x74, 0xB3, 0x76, 0xF8, 0xB1,
0x0D, 0x59, 0x70, 0x9F, 0xCA, 0xDE, 0xF2, 0xAA,
0x4C, 0x7D, 0x11, 0x54, 0xC4, 0x19, 0x0F, 0x36,
0x4A, 0x62, 0xFF, 0x8B, 0x10, 0xCB, 0x93, 0x50,
0xDA, 0x79, 0x5E, 0x4E, 0x09, 0x1F, 0x22, 0xC8,
0x19, 0x85, 0xE9, 0xEE, 0xB7, 0x71, 0x65, 0xB9,
0x10, 0xD2, 0x0A, 0x73, 0x5B, 0xA6, 0xDA, 0x37,
0x46, 0x02, 0x00, 0x98, 0x9E, 0x20, 0x6C, 0x7D,
0xC7, 0x69, 0xBB, 0xC2, 0x00, 0x40, 0x9C, 0x57,
0x00, 0xC2, 0x36, 0x76, 0xE8, 0x2A, 0x8D, 0xAD,
0x62, 0x57, 0xC8, 0xD0, 0x9D, 0x66, 0x27, 0x5A,
0xD8, 0x0D, 0x35, 0x60, 0x28, 0x38, 0x62, 0x94,
0x78, 0x36, 0x25, 0x58, 0xFD, 0xF8, 0x66, 0x1F,
0x68, 0x04, 0x0F, 0xD8, 0x00, 0xDF, 0xA0, 0x6C,
0x25, 0x42, 0x9A, 0x4C, 0xEB, 0x80, 0x13, 0x51,
0x7D, 0x2D, 0xA8, 0x89, 0xD6, 0x1B, 0x67, 0x72,
0x01, 0xF3, 0x2D, 0x16, 0x77, 0xFE, 0x22, 0xBC,
0x8A, 0x45, 0x09, 0x1F, 0x9C, 0x2F, 0x2A, 0xA9,
0x61, 0x5B, 0x4A, 0xE6, 0x64, 0x2C, 0x62, 0x1A,
0x3A, 0x96, 0xE6, 0x0A, 0xAE, 0x05, 0x1A, 0xC8,
0xCB, 0xD6, 0x8F, 0x3A, 0x4B, 0xE0, 0x7F, 0x82,
0xB4, 0x98, 0xF1, 0x9D, 0xD7, 0x14, 0x76, 0x5E,
0x77, 0x85, 0x87, 0xEC, 0x13, 0xDA, 0xFD, 0xAF,
0xCB, 0xA3, 0x1C, 0x99, 0xC1, 0xFE, 0x17, 0x0C,
0x40, 0x4D, 0x3C, 0x8F, 0x70, 0x86, 0x63, 0x64,
0xB7, 0x75, 0xA8, 0x71, 0x36, 0xDC, 0x54, 0x10,
0x57, 0x0C, 0xA8, 0xF2, 0xA1, 0xBB, 0xED, 0x03,
0x41, 0x57, 0x34, 0x2C, 0x8F, 0x7C, 0xA0, 0x09,
0xF3, 0x9E, 0x41, 0xB7, 0xA8, 0xD4, 0x66, 0x0D,
0x0D, 0xC0, 0x6A, 0xFC, 0x6A, 0xA2, 0xAC, 0xE2,
0x60, 0x00, 0xE3, 0xF7, 0x75, 0x43, 0x23, 0xEB,
0xC8, 0x61, 0xFA, 0xB3, 0xB8, 0x28, 0xCE, 0xCA,
0xF4, 0x47, 0x7F, 0x30, 0x6D, 0x61, 0x89, 0x47,
0xA1, 0x4A, 0xFE, 0xD1, 0x21, 0x0B, 0x6D, 0xF4,
0x3F, 0x00, 0x86, 0x30, 0x8E, 0x33, 0x21, 0x6F,
0xDA, 0x15, 0xFD, 0x5F, 0xEC, 0x8E, 0xF1, 0x12,
0x3F, 0xC9, 0x83, 0x0C, 0xCA, 0x22, 0x01, 0xF1,
0x70, 0x5F, 0x1F, 0x66, 0xB5, 0xF8, 0x3E, 0x7A,
0x6F, 0xDE, 0xDB, 0xA7, 0x8D, 0x18, 0x9E, 0xBE,
0xDB, 0xAD, 0x3D, 0x66, 0x30, 0xC1, 0x6C, 0x0C,
0x87, 0xB4, 0x65, 0x75, 0xE0, 0x9D, 0xEA, 0x16,
0x0D, 0x07, 0x37, 0x33, 0xC5, 0xEC, 0x97, 0x93,
0x37, 0xEB, 0x8E, 0x65, 0x9C, 0x40, 0x63, 0x6C,
0x43, 0x60, 0xB0, 0x40, 0x4D, 0x85, 0xEF, 0xC2,
0x47, 0x5F, 0xE7, 0x6B, 0xCB, 0x40, 0xE8, 0xEA,
0xD8, 0xAB, 0xB1, 0x9A, 0x72, 0xDC, 0x4C, 0x14,
0xFA, 0x43, 0x61, 0x5F, 0xA6, 0x5C, 0x3A, 0x05,
0x17, 0x2E, 0x74, 0xF3, 0x5E, 0x45, 0xD9, 0x47,
0xAA, 0x59, 0xB6, 0x8F, 0x42, 0x66, 0x42, 0x29,
0x90, 0x95, 0x48, 0x46, 0x91, 0x88, 0x3C, 0x8C,
0xDE, 0xCC, 0xED, 0xB3, 0xAA, 0x62, 0xEA, 0xBC,
0xB4, 0x0C, 0x48, 0x4C, 0x53, 0x23, 0x5E, 0x24,
0x85, 0xBF, 0x92, 0xDA, 0x14, 0xDB, 0x1A, 0x3D,
0xEF, 0x30, 0xD9, 0x49, 0x64, 0x4D, 0xE5, 0x01,
0xFC, 0xA4, 0x4B, 0xD1, 0x9F, 0xDE, 0x96, 0x7F,
0x50, 0xBC, 0x4D, 0x38, 0x44, 0xE9, 0x23, 0x5F,
0x37, 0x57, 0x1A, 0xA6, 0x52, 0x5A, 0x0F, 0x4F,
0x87, 0x33, 0x4A, 0x7B, 0x66, 0xEE, 0x3D, 0x66,
0x0A, 0x63, 0x39, 0x1F, 0x23, 0x38, 0x35, 0x73,
0x60, 0x5E, 0x47, 0x20, 0x4F, 0xC0, 0xC8, 0x3C,
0x09, 0xF9, 0x29, 0x4F, 0x5E, 0x55, 0x69, 0xC4,
0x6B, 0xE8, 0xF8, 0x91, 0xC0, 0x22, 0x65, 0x15,
0x1E, 0xFB, 0xB9, 0x61, 0xCE, 0x45, 0xBE, 0x2B,
0xEE, 0xB9, 0x04, 0x2B, 0xFD, 0xAE, 0x61, 0x1C,
0x3D, 0x3D, 0x7C, 0xBF, 0xC1, 0xF7, 0x3C, 0x4E,
0x9E, 0x0E, 0x54, 0xC8, 0xAD, 0xA9, 0xDF, 0x43,
0x49, 0xB9, 0x41, 0x05, 0xE5, 0xF1, 0x49, 0xAA,
0x77, 0x6C, 0x34, 0x5B, 0x93, 0x24, 0x24, 0x23,
0x74, 0x68, 0x11, 0xCE, 0x15, 0x80, 0xA1, 0xA4,
0x1F, 0x8D, 0x81, 0xCD, 0xB2, 0x98, 0xCA, 0x14,
0x0B, 0x0C, 0x61, 0x50, 0x69, 0x72, 0xAE, 0xFA,
0x8B, 0xC0, 0x3F, 0x0D, 0xE7, 0xF2, 0x0F, 0xEB,
0xC1, 0x11, 0xB9, 0x10, 0x03, 0x6A, 0xF5, 0x97,
0x3C, 0x53, 0x2F, 0x67, 0x86, 0x09, 0x6A, 0xE3,
0x28, 0xC0, 0x78, 0xC8, 0xB4, 0x39, 0x8E, 0xD1,
0xCE, 0x25, 0xE8, 0x66, 0xF7, 0x09, 0x40, 0x7D,
0x81, 0xFB, 0xAF, 0xFA, 0x59, 0xC4, 0x9B, 0x2B,
0x83, 0x45, 0x5B, 0xA8, 0x66, 0x9E, 0x38, 0xC8,
0xFD, 0xAC, 0xF2, 0x2D, 0x21, 0xDE, 0x50, 0x4C,
0x03, 0xCB, 0x88, 0x42, 0xDD, 0x84, 0x09, 0x99,
0x8E, 0x8B, 0x40, 0x97, 0x1B, 0x14, 0x85, 0x37,
0x11, 0x01, 0xE0, 0x74, 0x6B, 0x33, 0x52, 0x8C,
0x68, 0x3A, 0x89, 0xB2, 0xAF, 0x35, 0xE6, 0x65,
0xC3, 0x58, 0x70, 0xD2, 0xE7, 0x1F, 0x1F, 0xF6,
0xE5, 0x0A, 0xB1, 0xFE, 0xD0, 0xC9, 0x51, 0x50,
0xE7, 0xFD, 0x58, 0xF5, 0xC4, 0x58, 0x65, 0x94,
0xD1, 0x57, 0x55, 0x5E, 0xD2, 0x27, 0x98, 0xAF,
0xE7, 0x55, 0x0B, 0x87, 0x50, 0x9B, 0xEF, 0xE8,
0x2B, 0xFC, 0xE7, 0x3B, 0x4E, 0xD7, 0xB7, 0x4D,
0xF4, 0xBC, 0xF4, 0x88, 0x63, 0xE4, 0x8A, 0x20,
0x4B, 0x22, 0xB0, 0xA0, 0x53, 0x7F, 0xA8, 0xC9,
0x0C, 0xF8, 0xD7, 0xBD, 0x46, 0x39, 0xA7, 0x7D,
0xDD, 0x10, 0x91, 0x50, 0x54, 0x06, 0x47, 0xF0,
0x3C, 0xAA, 0x43, 0x40, 0xF8, 0x54, 0xDD, 0x8A,
0xEA, 0x8A, 0x0B, 0xA5, 0x7F, 0xCD, 0x5E, 0xAA,
0x02, 0x2E, 0x1F, 0xC6, 0x50, 0x15, 0xF8, 0x0A,
0x0C, 0x1B, 0x3C, 0x55, 0x3A, 0xC3, 0x6F, 0x88,
0xD7, 0xBF, 0xB1, 0x02, 0xCC, 0xE0, 0x08, 0x29,
0x97, 0xD2, 0xAA, 0x23, 0xC4, 0x6D, 0xE3, 0xE3,
0x76, 0x39, 0x92, 0xC3, 0x2E, 0x7A, 0xE2, 0x98,
0xD1, 0xFC, 0xAE, 0xCC, 0x95, 0xD8, 0xB4, 0xDC,
0x92, 0xEA, 0x6A, 0x5F, 0xF2, 0x92, 0x17, 0x0B,
0x8D, 0xC3, 0xFA, 0x9C, 0x62, 0xCE, 0x44, 0x8D,
0xC3, 0x1E, 0xC3, 0xB2, 0xD5, 0x00, 0xCD, 0xB4,
0x9E, 0x2D, 0x7B, 0xF2, 0x98, 0xA3, 0x00, 0x8B,
0x81, 0x30, 0x77, 0x5B, 0x02, 0x99, 0xB1, 0xCD,
0xC3, 0x1D, 0x74, 0x74, 0xEF, 0x41, 0xCB, 0x69,
0x63, 0x8E, 0xA6, 0xD3, 0x2D, 0x3E, 0x1F, 0x1D,
0x12, 0x9E, 0xD9, 0x18, 0x67, 0x06, 0xAF, 0x37,
0x29, 0xAD, 0x65, 0xD8, 0xEB, 0x71, 0xC4, 0x7D,
0x94, 0x3D, 0xEA, 0xCC, 0xDF, 0x72, 0x41, 0x51,
0x3C, 0xA1, 0x66, 0x98, 0x32, 0x32, 0x40, 0x54,
0xB0, 0x2F, 0xEB, 0xCE, 0xDF, 0x4A, 0x64, 0xFB,
0x9A, 0x90, 0xDC, 0xF6, 0x6F, 0xA9, 0xD4, 0xCA,
0xCB, 0x91, 0xC4, 0xFE, 0xEE, 0x9C, 0x01, 0x50,
0x2E, 0xAC, 0xCC, 0x5F, 0x89, 0xD0, 0x91, 0xA3,
0xD9, 0xF9, 0x4B, 0x8D, 0xDE, 0x6C, 0x60, 0x21,
0x19, 0xB1, 0xD3, 0x4D, 0x75, 0x56, 0x6F, 0xB8,
0x25, 0xA4, 0x92, 0x4F, 0x12, 0xF5, 0x8F, 0xC1,
0x17, 0x4B, 0xB3, 0x34, 0x21, 0x22, 0xAC, 0x52,
0xD2, 0x64, 0xC9, 0x9A, 0x7D, 0xFC, 0xC0, 0x0A,
0x89, 0x34, 0xFF, 0x08, 0xD3, 0x04, 0xDC, 0xFE,
0x7C, 0xB3, 0xB8, 0xFD, 0x85, 0xDD, 0x79, 0x51,
0xA7, 0x89, 0xE8, 0xF1, 0x23, 0xB1, 0xDF, 0xD7,
0x1F, 0x7B, 0xB1, 0x5D, 0x42, 0xF9, 0x61, 0xF8,
0xDC, 0x81, 0x04, 0xF1, 0xCC, 0xFA, 0xD7, 0xED,
0xBF, 0x47, 0xAC, 0xBD, 0xE5, 0xFA, 0xAC, 0xB3,
0x1C, 0xD9, 0xA1, 0xB3, 0x60, 0xEE, 0x9C, 0x8A,
0x36, 0x57, 0xB4, 0x2F, 0xA1, 0xA2, 0xF3, 0xE2,
0x09, 0x9A, 0x6E, 0x43, 0x9B, 0xE5, 0x93, 0xB8,
0x3D, 0x9E, 0x9F, 0xC1, 0xC6, 0x0D, 0x02, 0xEB,
0x4D, 0x38, 0xE9, 0xB4, 0x9F, 0xEA, 0x33, 0x8C,
0x07, 0xD8, 0xB4, 0x71, 0xAD, 0xE5, 0x43, 0xB2,
0xCC, 0x55, 0x93, 0x6A, 0xDB, 0x1E, 0x80, 0xDB,
0xC2, 0xEA, 0x42, 0x8E, 0xFC, 0x86, 0x44, 0xC9,
0x8A, 0xC4, 0xF2, 0x46, 0xA7, 0x39, 0x50, 0x0D,
0x1A, 0xAA, 0x07, 0x04, 0xBE, 0xD4, 0xCE, 0x62,
0x4D, 0x0F, 0x91, 0x7D, 0x29, 0x88, 0x9C, 0x4C,
0xAF, 0xF7, 0xD8, 0x40, 0x93, 0x88, 0xC7, 0x20,
0xD2, 0x17, 0x2A, 0xC4, 0x92, 0x72, 0xD0, 0xC0,
0x4E, 0x56, 0x47, 0xB1, 0x27, 0x02, 0xE6, 0x61,
0x82, 0x5E, 0xC8, 0x2E, 0x90, 0xD2, 0x31, 0x22,
0xE2, 0xA9, 0x4A, 0x91, 0x45, 0x69, 0xB1, 0xA5,
0x0F, 0x66, 0x2C, 0x30, 0xAD, 0x7F, 0x1B, 0x0E,
0x22, 0x17, 0x60, 0x2E, 0x3D, 0x7F, 0x7F, 0x8C,
0x33, 0x51, 0xA0, 0x25, 0xDE, 0xFD, 0x75, 0xBC,
0xEF, 0xE6, 0xE7, 0x20, 0x04, 0x5A, 0xEC, 0x50,
0x21, 0x48, 0x56, 0x98, 0xE2, 0x33, 0x6D, 0x22,
0x5C, 0xC3, 0xFB, 0xFC, 0x6F, 0xB3, 0xA7, 0x8E,
0x6F, 0x67, 0x70, 0x9D, 0xDA, 0x02, 0x01, 0x59,
0x7B, 0x3D, 0x2B, 0x38, 0xCC, 0x0F, 0x44, 0x3D,
0xFB, 0x9A, 0xB3, 0x23, 0x15, 0x50, 0x6E, 0xBF,
0x8B, 0xA1, 0x94, 0x33, 0xE5, 0x7B, 0x88, 0x4E,
0xCB, 0x6D, 0x9F, 0xBF, 0xBC, 0x7A, 0xA8, 0x1E,
0x68, 0x25, 0xED, 0x8E, 0x53, 0x21, 0x72, 0xC5,
0x70, 0xB3, 0xE4, 0xA6, 0xA1, 0x5A, 0x2D, 0xC8,
0x43, 0x9D, 0x60, 0x77, 0x78, 0xE0, 0xC4, 0xAF,
0xC8, 0x29, 0xBA, 0xD0, 0x4D, 0x39, 0x83, 0x51,
0xA7, 0x10, 0x7F, 0x0C, 0x34, 0x0E, 0x6C, 0x75,
0x26, 0xD7, 0xD6, 0xC7, 0x32, 0x53, 0xAF, 0x4E,
0xBE, 0xF2, 0xC2, 0x0F, 0x99, 0x23, 0xB9, 0xE1,
0xC8, 0xB4, 0xBC, 0x5A, 0xC6, 0xCB, 0xEB, 0x4D,
0x28, 0x56, 0x72, 0xFE, 0x1B, 0x2C, 0x5D, 0xE3,
0xBC, 0xC7, 0xA3, 0xC0, 0x7D, 0x27, 0xF0, 0xD0,
0x4F, 0x3F, 0x1F, 0xF7, 0x87, 0x15, 0xF2, 0xEA,
0xD4, 0x03, 0x6D, 0x2F, 0xD4, 0x8E, 0x50, 0x4B,
0x05, 0xBF, 0xF7, 0x8C, 0x67, 0x5A, 0xDC, 0x4D,
0xCD, 0xCF, 0x9D, 0x02, 0xB6, 0xE7, 0xAE, 0x49,
0xD1, 0x7C, 0x00, 0xE7, 0x3B, 0xEA, 0xFB, 0x0D,
0x2A, 0x7B, 0x41, 0x33, 0x66, 0xD0, 0x29, 0x9F,
0xB3, 0x8A, 0x71, 0xB0, 0xE2, 0x76, 0xA9, 0xDB,
0xFD, 0x64, 0x04, 0x69, 0xDF, 0x89, 0x1F, 0x56,
0x86, 0x92, 0xD9, 0xD9, 0xB9, 0xF3, 0x4F, 0xAC,
0xAE, 0x61, 0x48, 0x20, 0xCE, 0x3C, 0x2B, 0x44,
0xAB, 0x42, 0xFA, 0xAB, 0x2E, 0x94, 0x82, 0xC8,
0xD9, 0x97, 0xCF, 0x27, 0xDF, 0xAC, 0xAC, 0xE7,
0xCA, 0xB2, 0x84, 0xAB, 0xF2, 0x5D, 0xDF, 0x56,
0x0C, 0x8C, 0x07, 0x3C, 0x3D, 0xA8, 0xDD, 0xBE,
0xFF, 0x4E, 0x28, 0x0D, 0xB2, 0x2D, 0xE6, 0x9D,
0x44, 0x21, 0xCB, 0xE7, 0x33, 0x63, 0x22, 0x8F,
0x4C, 0xFF, 0xB6, 0x1D, 0x9A, 0x71, 0x3F, 0xB1,
0x29, 0xAE, 0x3A, 0x35, 0xEE, 0x9C, 0x97, 0x68,
0xA7, 0x52, 0x66, 0x01, 0xD8, 0x9A, 0x5D, 0xF4,
0xB3, 0x2F, 0x5C, 0xD4, 0x0E, 0xF9, 0xCF, 0x07,
0xF6, 0x8C, 0xBA, 0xA6, 0x8D, 0x6B, 0xC6, 0x01,
0xC2, 0x69, 0xAE, 0x60, 0x08, 0x1A, 0x0E, 0x3F,
0xAE, 0x60, 0x29, 0xF3, 0x48, 0x0D, 0xE0, 0xD0,
0xAE, 0x52, 0x44, 0xE9, 0x7F, 0x1F, 0x92, 0x5F,
0x71, 0xAD, 0xEC, 0x6B, 0x47, 0x66, 0x92, 0x22,
0x27, 0xAE, 0x6E, 0x25, 0xCD, 0xF3, 0x5F, 0x55,
0x59, 0xBD, 0x73, 0xCE, 0x2B, 0x7E, 0x99, 0x44,
0x56, 0x70, 0xA3, 0xE7, 0x7A, 0x59, 0x75, 0xD8,
0x48, 0x0C, 0x39, 0x2B, 0xD7, 0x53, 0xC6, 0xAD,
0x4A, 0x6F, 0xB4, 0x14, 0x96, 0xDF, 0xF2, 0x4A,
0x0C, 0xA2, 0xD5, 0x29, 0x98, 0x7C, 0x42, 0x87,
0xD9, 0x1F, 0x97, 0x61, 0xD9, 0xBF, 0x99, 0x4F,
0x2C, 0x4C, 0x75, 0xAC, 0xB8, 0x06, 0x75, 0xD6,
0x87, 0x76, 0x7E, 0xE3, 0x23, 0x4B, 0xEA, 0x1A,
0x1A, 0xF4, 0xB7, 0x09, 0xAF, 0x53, 0xEB, 0xA6,
0x39, 0x10, 0xFE, 0xD4, 0xEB, 0x1B, 0xAE, 0x38,
0x31, 0x33, 0xBA, 0x68, 0xEE, 0xC7, 0x65, 0x76,
0xFB, 0x49, 0x77, 0xD4, 0x19, 0xC4, 0xE6, 0xA7,
0x05, 0xFE, 0x2A, 0xDA, 0x39, 0x99, 0x1A, 0x92,
0xD2, 0xF0, 0x61, 0x97, 0xF6, 0x06, 0x6C, 0x88,
0x7B, 0x6F, 0x60, 0xE6, 0x70, 0x08, 0xF0, 0xB4,
0x6B, 0x39, 0x6F, 0x05, 0x41, 0x81, 0xF9, 0xBE,
0x7A, 0x51, 0xC4, 0x75, 0xB0, 0x6A, 0x89, 0xA0,
0xA6, 0x9A, 0x5B, 0xEE, 0x7D, 0x78, 0x17, 0x5F,
0x9F, 0x3B, 0x7D, 0xDD, 0x8A, 0x9E, 0xAA, 0x1A,
0xDA, 0x49, 0x08, 0xE9, 0xFD, 0x91, 0xA6, 0xFA,
0xCE, 0xCF, 0x67, 0xDF, 0x0F, 0xC9, 0xD6, 0x38,
0xD9, 0xD5, 0xD1, 0xC0, 0x76, 0x59, 0x42, 0x53,
0xBF, 0x48, 0xE9, 0x11, 0x74, 0xC7, 0x11, 0xD8,
0xE7, 0x8E, 0xD3, 0xC8, 0x25, 0xA1, 0x26, 0x50,
0xBB, 0xB4, 0x35, 0xAF, 0xAF, 0x06, 0x23, 0x69,
0x3E, 0x30, 0xFD, 0x7B, 0x34, 0x83, 0x07, 0xD0,
0xF0, 0x0F, 0x6C, 0x9A, 0x13, 0x5D, 0xC2, 0x7B,
0xDF, 0x6F, 0xDD, 0x8E, 0xF4, 0x30, 0x82, 0x05,
0x41, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x05, 0x32,
0x04, 0x82, 0x05, 0x2E, 0x30, 0x82, 0x05, 0x2A,
0x30, 0x82, 0x05, 0x26, 0x06, 0x0B, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01,
0x02, 0xA0, 0x82, 0x04, 0xEE, 0x30, 0x82, 0x04,
0xEA, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30,
0x0E, 0x04, 0x08, 0x74, 0xC0, 0x84, 0x8F, 0xC7,
0x74, 0x5E, 0x21, 0x02, 0x02, 0x08, 0x00, 0x04,
0x82, 0x04, 0xC8, 0x1E, 0xF4, 0xE9, 0x07, 0x27,
0x9E, 0x5A, 0xC9, 0x39, 0x1D, 0x37, 0x2C, 0x06,
0x4B, 0x57, 0xEA, 0xC5, 0x42, 0x9A, 0x60, 0xD5,
0x42, 0xB2, 0x34, 0x2D, 0xD3, 0x88, 0x7C, 0x78,
0x87, 0xB6, 0xE9, 0x42, 0x44, 0x1F, 0x67, 0x32,
0x92, 0x54, 0x22, 0xDA, 0xB2, 0x43, 0xE7, 0x40,
0xBE, 0x1F, 0xAF, 0x3A, 0xCD, 0x2A, 0x9F, 0xD7,
0x44, 0x5B, 0x37, 0x69, 0x85, 0xDF, 0xEB, 0x2A,
0xB9, 0xE2, 0x92, 0x3B, 0xEA, 0xD5, 0x42, 0x53,
0x95, 0x4A, 0xB0, 0x1B, 0xA5, 0xEF, 0xA6, 0x0D,
0x29, 0xF4, 0x33, 0xFE, 0xD7, 0x49, 0x04, 0x1E,
0x8C, 0xAD, 0x63, 0x1E, 0x79, 0x63, 0x74, 0x0C,
0xE5, 0x5E, 0xA2, 0x2C, 0xBE, 0xB8, 0x90, 0xCE,
0x06, 0x25, 0xBF, 0xD1, 0x5A, 0x50, 0xCF, 0x3B,
0x52, 0xE2, 0xA7, 0xFF, 0x19, 0x02, 0xCF, 0xD0,
0x9B, 0xD9, 0xF7, 0x28, 0x07, 0x38, 0x1F, 0xF2,
0xAF, 0x44, 0x91, 0x3F, 0x0F, 0xB6, 0x6E, 0x8C,
0xC0, 0x32, 0x92, 0xC0, 0xCD, 0x25, 0x98, 0x67,
0xF1, 0x47, 0x52, 0x50, 0xF0, 0xA3, 0x7B, 0xE6,
0x74, 0xDC, 0x72, 0x28, 0xC8, 0xAB, 0xB3, 0x31,
0x7D, 0xA3, 0xF7, 0xC7, 0xD1, 0xE6, 0x99, 0xB4,
0xB6, 0x5A, 0x3A, 0x4D, 0x83, 0x4F, 0xB8, 0xB5,
0x86, 0xF8, 0x37, 0x7F, 0xA0, 0x16, 0x2F, 0x3C,
0x62, 0x7A, 0xD4, 0x3A, 0xEB, 0xC2, 0xE8, 0x03,
0x49, 0x17, 0x9E, 0xFB, 0xD7, 0xAF, 0x91, 0x32,
0xFD, 0xEA, 0x4F, 0x64, 0xC6, 0x6E, 0x02, 0xEA,
0xC4, 0xC8, 0x1F, 0x16, 0xC5, 0x4C, 0xFB, 0xC5,
0x42, 0xF5, 0x85, 0x05, 0x92, 0x59, 0x4B, 0x31,
0xE5, 0xE9, 0x69, 0xE7, 0x02, 0x98, 0x33, 0xBA,
0x4C, 0x17, 0x09, 0xEF, 0x89, 0x20, 0xFA, 0x83,
0x9F, 0xAE, 0x0E, 0x1B, 0x7D, 0x98, 0xB9, 0xF2,
0x3C, 0x0F, 0xB7, 0x1C, 0x72, 0xDF, 0x17, 0x84,
0x7F, 0x0A, 0xFD, 0x12, 0x3C, 0x6F, 0x68, 0x5D,
0x45, 0xEB, 0xB8, 0xD6, 0x24, 0x65, 0x42, 0x75,
0x5C, 0xC2, 0xF3, 0x3A, 0x6A, 0x4E, 0x51, 0x34,
0x1B, 0xB6, 0x81, 0xB2, 0x8A, 0xEF, 0x28, 0xA4,
0xC5, 0x88, 0x9A, 0x97, 0xE0, 0xEF, 0x31, 0x12,
0x01, 0x7E, 0x1B, 0x43, 0x0F, 0x27, 0x80, 0x87,
0x98, 0xC5, 0xD5, 0x83, 0xCB, 0x4B, 0xB7, 0x01,
0x79, 0x60, 0xA1, 0x1A, 0x03, 0x05, 0xC6, 0x36,
0x04, 0x31, 0x3C, 0x06, 0xDB, 0x08, 0xA8, 0xDA,
0x8E, 0x32, 0x19, 0x91, 0xF1, 0x0D, 0x61, 0x6F,
0xE4, 0xB2, 0x79, 0x8A, 0xDE, 0xF4, 0xF7, 0xFB,
0x2C, 0x23, 0x5B, 0xD9, 0x64, 0x2F, 0xB7, 0xB3,
0x8B, 0xCA, 0xB8, 0x8C, 0x1D, 0x3B, 0x49, 0x05,
0x38, 0xA1, 0xE5, 0x8C, 0x1A, 0xDC, 0xA5, 0x61,
0xFE, 0xF4, 0x2B, 0xDC, 0x77, 0x28, 0xF6, 0x19,
0xE7, 0xB7, 0x8F, 0x4D, 0x27, 0x2D, 0xED, 0x8A,
0x3F, 0x3D, 0xDC, 0x9F, 0xD1, 0x30, 0xFF, 0xD6,
0xC3, 0xBE, 0x41, 0x25, 0xE3, 0xA5, 0x9B, 0x73,
0xDF, 0x6A, 0xD9, 0xF9, 0x70, 0x84, 0x02, 0x4C,
0x35, 0xD4, 0x3E, 0x05, 0x76, 0x3A, 0xDC, 0x6D,
0x5A, 0x81, 0xB3, 0x94, 0xF7, 0x22, 0xF7, 0xDC,
0xC1, 0x43, 0x31, 0x57, 0x5B, 0x42, 0x9A, 0x0B,
0xF4, 0x95, 0x30, 0xA9, 0xBB, 0xD8, 0x06, 0xFB,
0x1D, 0x6F, 0x9B, 0xC3, 0xBB, 0xF3, 0xBF, 0xFB,
0xB4, 0x9F, 0x35, 0x64, 0x0A, 0x69, 0xB7, 0xD1,
0x3E, 0xCA, 0x78, 0x07, 0x04, 0x03, 0x79, 0xD4,
0xF3, 0xA8, 0xEC, 0x18, 0xDB, 0x03, 0x5E, 0x47,
0xD7, 0xD0, 0x56, 0x2C, 0x74, 0x94, 0x86, 0x04,
0x46, 0xB8, 0xD4, 0x35, 0x0A, 0x7B, 0xE6, 0x78,
0xC4, 0x43, 0x3C, 0x56, 0xCC, 0x37, 0x8B, 0xFD,
0xE8, 0xF4, 0x57, 0xEA, 0xAE, 0xCF, 0x36, 0x97,
0x12, 0xAC, 0x39, 0xCF, 0x7C, 0xEF, 0x22, 0x67,
0x01, 0xEC, 0xD8, 0x09, 0x49, 0x4E, 0xE3, 0x74,
0xDD, 0x39, 0xE1, 0x39, 0xD7, 0x0C, 0x5F, 0x1B,
0xCE, 0x69, 0xBC, 0x72, 0x44, 0x87, 0x64, 0x1C,
0x08, 0x05, 0x93, 0x69, 0x6D, 0x7F, 0x90, 0x0A,
0x2C, 0xCB, 0x8A, 0xBB, 0x7F, 0xE3, 0xE0, 0x80,
0x31, 0xD0, 0x0A, 0x3A, 0x95, 0xFF, 0xF7, 0xB4,
0x36, 0x38, 0x93, 0xE0, 0x0C, 0x11, 0x37, 0x12,
0x06, 0xF6, 0xAD, 0xE9, 0xB1, 0x7A, 0x00, 0xF5,
0xD2, 0x32, 0x6B, 0xD0, 0x27, 0xA5, 0x1B, 0x3D,
0xE8, 0xDB, 0xCC, 0xA9, 0x1F, 0x1F, 0xB1, 0x99,
0x3D, 0x7C, 0xB7, 0xCA, 0xDA, 0x27, 0x2C, 0x64,
0x1C, 0x49, 0xB6, 0x87, 0x44, 0x06, 0x94, 0x9D,
0xBC, 0x6B, 0x20, 0xA2, 0x68, 0x15, 0x1F, 0xE2,
0xF2, 0xAD, 0x6D, 0x23, 0x2E, 0x2B, 0x74, 0xE2,
0x5D, 0xE4, 0xB0, 0xC7, 0x84, 0xCB, 0x64, 0xBF,
0xE0, 0xA8, 0x18, 0x83, 0xB4, 0xC9, 0xD9, 0x73,
0xA8, 0xE6, 0xA9, 0x36, 0xD5, 0x63, 0x1E, 0x2C,
0x2A, 0x55, 0x09, 0x77, 0x5E, 0xB3, 0x4B, 0xEA,
0xB5, 0xD0, 0x14, 0x5F, 0xEB, 0x50, 0x7B, 0xAA,
0xEF, 0x94, 0xBA, 0x2B, 0xD7, 0x8A, 0x07, 0xF1,
0xF9, 0x5E, 0x12, 0x12, 0x21, 0x52, 0xE5, 0x0A,
0x3E, 0xC0, 0xBC, 0x5D, 0x4C, 0xE2, 0x12, 0x7C,
0x39, 0xF9, 0x16, 0x9D, 0xBD, 0x96, 0x83, 0x3B,
0x7F, 0x3D, 0x6A, 0xEC, 0xF1, 0x25, 0xD2, 0xB0,
0xB0, 0xEB, 0x20, 0x06, 0x07, 0xD6, 0xD9, 0x4C,
0x07, 0x9A, 0x82, 0xC1, 0xFC, 0xF7, 0x66, 0x15,
0xBD, 0x62, 0x65, 0xD8, 0x6C, 0xF6, 0x33, 0x7B,
0x5A, 0x28, 0xEC, 0x90, 0xA1, 0x26, 0x9F, 0xC3,
0x28, 0x4A, 0x64, 0x50, 0x5F, 0xCA, 0xE2, 0x6D,
0xB8, 0x0F, 0xE2, 0x94, 0xB5, 0x8E, 0x1F, 0x8A,
0x8F, 0x6B, 0xA6, 0x86, 0x1F, 0xEE, 0xDC, 0x24,
0xB4, 0xB8, 0x25, 0xEC, 0x28, 0x2D, 0xF9, 0xCB,
0x7D, 0x38, 0xFF, 0xC7, 0x74, 0x2E, 0xD3, 0x10,
0xEC, 0x03, 0x31, 0xEE, 0x83, 0xE7, 0xA4, 0xF7,
0xBA, 0x28, 0x21, 0xE0, 0x7F, 0xB4, 0xB7, 0xE1,
0x7A, 0xF9, 0x2B, 0xB0, 0x2C, 0x3B, 0x80, 0x5F,
0xE0, 0x5D, 0xB2, 0x7E, 0x59, 0xFF, 0x59, 0x07,
0x58, 0x42, 0x57, 0xEE, 0x44, 0xF1, 0xB1, 0xAD,
0xBA, 0xDE, 0xCB, 0x1D, 0x8A, 0x36, 0x67, 0xE8,
0x45, 0xFF, 0x07, 0x8D, 0xEE, 0xA4, 0x51, 0x9C,
0x4C, 0x83, 0x5D, 0x2E, 0x2F, 0xE1, 0x5B, 0x75,
0xE8, 0x29, 0xCD, 0x0B, 0x07, 0x62, 0xE0, 0xC3,
0x0D, 0x1D, 0xEA, 0xCF, 0xF0, 0x8A, 0x65, 0x27,
0x70, 0x42, 0x9F, 0x26, 0x00, 0x15, 0x70, 0xC5,
0x4A, 0xF6, 0x25, 0xD0, 0x40, 0x72, 0xE9, 0xC1,
0x73, 0xFD, 0x48, 0x94, 0xA3, 0x8D, 0x66, 0x63,
0x96, 0x4F, 0xF7, 0xEE, 0xFB, 0x4C, 0xC7, 0xB8,
0x6B, 0xE9, 0x90, 0xE1, 0x2A, 0x66, 0x80, 0x99,
0x3B, 0xB0, 0x1A, 0x6C, 0xF9, 0x0E, 0x72, 0xDA,
0x8E, 0x4F, 0x46, 0xC2, 0x6A, 0x4B, 0x7A, 0x16,
0xE5, 0x26, 0x0B, 0x5C, 0xD4, 0x47, 0x34, 0xE5,
0x37, 0xBE, 0x68, 0x6C, 0xDA, 0xD3, 0x9B, 0x6F,
0xAE, 0x51, 0x9C, 0x99, 0x0A, 0x5B, 0xF8, 0x37,
0xBC, 0xDE, 0xFC, 0x93, 0xC5, 0xE7, 0x0F, 0xEF,
0x0B, 0xA6, 0x07, 0xC2, 0xA6, 0xE6, 0xDA, 0x2D,
0x1B, 0x49, 0xC9, 0xDE, 0x6B, 0x27, 0xDC, 0x00,
0xEF, 0x23, 0x87, 0x0E, 0xEB, 0xD1, 0x48, 0x7D,
0xB4, 0xF2, 0x58, 0xC6, 0x3C, 0xE2, 0x89, 0xBA,
0xB0, 0x05, 0xAC, 0x94, 0x41, 0x9A, 0xA8, 0xFF,
0x3E, 0xBC, 0x3A, 0x52, 0x9C, 0xF9, 0x7F, 0x07,
0x8B, 0xB0, 0x2C, 0x71, 0x83, 0x7B, 0xCF, 0x2E,
0x7F, 0x7C, 0x96, 0x65, 0xD9, 0x08, 0x17, 0xEC,
0xFA, 0xDE, 0x4E, 0x40, 0x12, 0x26, 0x70, 0x71,
0x65, 0xA5, 0xDC, 0x98, 0x47, 0xA3, 0xFC, 0xE0,
0x9A, 0x16, 0xED, 0x45, 0x56, 0x72, 0x50, 0x05,
0x28, 0x2C, 0x99, 0xEC, 0x20, 0x2E, 0x40, 0xC0,
0x26, 0x69, 0xCD, 0x49, 0x45, 0x17, 0xA4, 0xA3,
0x42, 0x0D, 0x14, 0x65, 0x87, 0x33, 0x8C, 0x92,
0xC5, 0xC4, 0x61, 0xFD, 0xE8, 0x68, 0x56, 0x20,
0x57, 0xF5, 0x8E, 0x5F, 0xCF, 0x7E, 0x97, 0xF6,
0x49, 0x97, 0x0A, 0xFE, 0xD3, 0x60, 0x1A, 0x5B,
0x0C, 0x75, 0xDD, 0x8E, 0x31, 0x78, 0x29, 0xA6,
0xB1, 0x4D, 0xAA, 0xDF, 0x8A, 0xD1, 0xE6, 0x91,
0xE3, 0x32, 0x3F, 0xEC, 0x8A, 0x1F, 0x0E, 0x35,
0x07, 0x6E, 0x4B, 0x83, 0x3B, 0xE5, 0x67, 0x34,
0x1F, 0x0C, 0x81, 0xD8, 0xD5, 0x25, 0x68, 0xE5,
0x28, 0x1B, 0x5C, 0x81, 0x3E, 0xE3, 0x5C, 0xB4,
0xB6, 0xBD, 0x62, 0x6A, 0x70, 0x33, 0xC2, 0xC5,
0x75, 0x27, 0xF4, 0x30, 0xE1, 0x1D, 0xC1, 0x4C,
0xC5, 0x02, 0x12, 0x46, 0xAC, 0xEC, 0xF9, 0xE8,
0xE7, 0x58, 0x24, 0x11, 0xB1, 0xF3, 0xB7, 0x8C,
0x3C, 0xA4, 0x0A, 0x94, 0xA6, 0x7C, 0x68, 0x54,
0x5B, 0xB9, 0x4D, 0x57, 0x9C, 0xE7, 0x28, 0x09,
0x6B, 0x89, 0x26, 0x5D, 0xE7, 0x50, 0xA9, 0x95,
0x90, 0x91, 0x8E, 0x00, 0x59, 0xF8, 0x3A, 0x70,
0xAF, 0x48, 0x2E, 0xE8, 0xC4, 0x34, 0x8C, 0xF4,
0x5F, 0x7F, 0xCB, 0x07, 0xAA, 0xF0, 0xD9, 0xFB,
0x5C, 0x32, 0x90, 0x22, 0x1A, 0xD2, 0x1A, 0xCF,
0x92, 0x06, 0x02, 0xCF, 0x10, 0x18, 0x7B, 0x93,
0xCC, 0x07, 0x4A, 0x31, 0x25, 0x30, 0x23, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x09, 0x15, 0x31, 0x16, 0x04, 0x14, 0xD1, 0xDE,
0x23, 0x16, 0x9F, 0x6E, 0xF4, 0x42, 0x21, 0x23,
0xE1, 0x11, 0xAA, 0xC8, 0x7C, 0x60, 0x4A, 0x78,
0x9D, 0x24, 0x30, 0x31, 0x30, 0x21, 0x30, 0x09,
0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05,
0x00, 0x04, 0x14, 0xD6, 0x4A, 0xBB, 0x75, 0xB1,
0xF9, 0x9E, 0xD3, 0x58, 0x6D, 0xD1, 0x74, 0x9F,
0x00, 0x8A, 0xF2, 0xC8, 0xAA, 0x52, 0x4D, 0x04,
0x08, 0x77, 0x46, 0xE7, 0xBA, 0x25, 0x4B, 0xDA,
0x41, 0x02, 0x02, 0x08, 0x00]
};
const WPA_EAP_CLIENT_LIST = [
{
ssid: 'WPA-EAP-TLS',
keyManagement: 'WPA-EAP',
eap: 'TLS',
identity: EAP_USERNAME,
serverCertificate: CLIENT_PKCS12_CERT.nickname,
userCertificate: CLIENT_PKCS12_CERT.nickname
}
];
/**
* Convert the given MozWifiNetwork object array to testAssociate chain.
*
* @param aNetworks
* An array of MozWifiNetwork which we want to convert.
*
* @return A promise chain which "then"s testAssociate accordingly.
*/
function convertToTestAssociateChain(aNetworks) {
let chain = Promise.resolve();
aNetworks.forEach(function (aNetwork) {
network = new window.MozWifiNetwork(aNetwork);
chain = chain.then(() => gTestSuite.testAssociate(network));
});
return chain;
}
gTestSuite.doTestWithCertificate(
new Blob([new Uint8Array(CLIENT_PKCS12_CERT.content)]),
CLIENT_PKCS12_CERT.password,
CLIENT_PKCS12_CERT.nickname,
CLIENT_PKCS12_CERT.usage,
function() {
return gTestSuite.ensureWifiEnabled(true)
// Load required server files.
.then(() => gTestSuite.writeFile(SERVER_EAP_USER_CONF.path, SERVER_EAP_USER_CONF.content))
.then(() => gTestSuite.writeFile(CA_CERT.path, CA_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_CERT.path, SERVER_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_KEY.path, SERVER_KEY.content))
// Start AP.
.then(() => gTestSuite.startHostapds(WPA_EAP_AP_LIST))
// Scan test.
.then(() => gTestSuite.testWifiScanWithRetry(SCAN_RETRY_CNT, WPA_EAP_AP_LIST))
// Associate test.
.then(() => convertToTestAssociateChain(WPA_EAP_CLIENT_LIST))
// Tear down.
.then(gTestSuite.killAllHostapd)
});

View File

@ -0,0 +1,623 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
MARIONETTE_TIMEOUT = 60000;
MARIONETTE_HEAD_JS = 'head.js';
const SCAN_RETRY_CNT = 5;
const EAP_USERNAME = 'username';
const EAP_PASSWORD = 'password';
const SERVER_EAP_USER_CONF = {
path: HOSTAPD_CONFIG_PATH + 'hostapd.eap_user',
content: '* PEAP,TTLS,TLS\n' +
'"' + EAP_USERNAME + '" MSCHAPV2,TTLS-MSCHAPV2 "' + EAP_PASSWORD + '" [2]\n'
};
const CA_CERT = {
path: HOSTAPD_CONFIG_PATH + 'ca.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIIDsTCCApmgAwIBAgIJAKxTf+8X8qngMA0GCSqGSIb3DQEBCwUAMG4xCzAJBgNV\n' +
'BAYTAlRXMRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTER\n' +
'MA8GA1UEAwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdt\n' +
'YWlsLmNvbTAgFw0xNDEyMjQxMTI4NTBaGA8yMjg4MTAwNzExMjg1MFowbjELMAkG\n' +
'A1UEBhMCVFcxEzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAoMCGNodWNrbGVl\n' +
'MREwDwYDVQQDDAhjaHVja2xlZTEkMCIGCSqGSIb3DQEJARYVY2h1Y2tsaTA3MDZA\n' +
'Z21haWwuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo3c2yFxY\n' +
'o6gGg0I83jy00ME+MAfzCd+4ShL45ZLqysQP93jRBfPzU9ZuZ29ysVwgWIdqkZao\n' +
'XTuV/NAW2GMGd8W1jQJ3J81fjb9wvhlny3rrACwvUn1N1S1BnM+BAAiDLGxEmvAQ\n' +
'onp2aaa6HsHsYS8ONX+d2Qh4LEA4vupeSGAqJychCZv/l+aq/ErFZhFYB3CPUQEt\n' +
'cClO24ucsIYP95lA0zhscnmAj06qplFD4Bv6IVrdDqujy1zNwCQwsJq/8OQdaTN/\n' +
'h3y9pWvNKMBMM2niOUAjtuNpqsSK/lTS1WAT3PdtVECX9fYBi0Bg+HM92xs/6gt6\n' +
'kh9jPV8keXHvSwIDAQABo1AwTjAdBgNVHQ4EFgQU7hBqhuG04xeCzrQ3ngx18ZJ3\n' +
'lUswHwYDVR0jBBgwFoAU7hBqhuG04xeCzrQ3ngx18ZJ3lUswDAYDVR0TBAUwAwEB\n' +
'/zANBgkqhkiG9w0BAQsFAAOCAQEAFYX2iy680GAnBTttk0gyX6gk+8pYr3D22k/G\n' +
'6rvcjefzS7ELQPRKr6mfmwXq3mMf/4jiS2zI5zmXsestPYzHYxf2viQ6t7vr9XiJ\n' +
'3WfFjNw4ERlRisAvg0aqqTNNQq5v2VME4sdFZagy217f73C7azwCHl0bqOLH05rl\n' +
'8RubOxiHEj7ZybJqnRciK/bht4D+rZkwf4bBBmoloqH7xT0+rFQclpYXDGGjNUQB\n' +
'LcHLF10xcr7g3ZVVu82fe6+d85gIGOIMR9+TKhdw6gO3CNcnDAj6gxksghgtcxmh\n' +
'OzOggCn7nlIwImtsg2sZkpWB4lEi9hdv4lkNuyFjOL3bnuc+NA==\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_CERT = {
path: HOSTAPD_CONFIG_PATH + 'server.pem',
content: '-----BEGIN CERTIFICATE-----\n' +
'MIID1DCCArygAwIBAgIBADANBgkqhkiG9w0BAQsFADBuMQswCQYDVQQGEwJUVzET\n' +
'MBEGA1UECAwKU29tZS1TdGF0ZTERMA8GA1UECgwIY2h1Y2tsZWUxETAPBgNVBAMM\n' +
'CGNodWNrbGVlMSQwIgYJKoZIhvcNAQkBFhVjaHVja2xpMDcwNkBnbWFpbC5jb20w\n' +
'IBcNMTQxMjI0MTEyOTQ5WhgPMjI4ODEwMDcxMTI5NDlaMG4xCzAJBgNVBAYTAlRX\n' +
'MRMwEQYDVQQIDApTb21lLVN0YXRlMREwDwYDVQQKDAhjaHVja2xlZTERMA8GA1UE\n' +
'AwwIY2h1Y2tsZWUxJDAiBgkqhkiG9w0BCQEWFWNodWNrbGkwNzA2QGdtYWlsLmNv\n' +
'bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMdhQmKilTJbWZRxTiSV\n' +
'rqIU+LYW1RKghx5o+0JpNRJVLuz5kBMaNskbbfUSNuHbEq0QA9BDKAZWIc4LSotk\n' +
'lCo8TbcO9CJvJPQGGjGdHcohWX5vy6BE/OVE46CUteMFyZF6F8R2fNUww08iR/u1\n' +
'YZebL5pWO1j43sPpAzEy6Tij2ACPt6EZcFaZG3SF2mVJWkCQnBqrojP65WUvZQqp\n' +
'seUhW2YAS8Nu0Yrohgxz6VYk+cNDuDZVGs6qWRStZzJfYrfc76DtkHof5B14M+xp\n' +
'XJaBLxN+whvnYkDTfinaCxnW1O7eXUltr87fLc5zmeBkgwaiaQuIdcfZm7vDUiz8\n' +
'vnUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBH\n' +
'ZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFKK4f9/YavTHOfEiAB83Deac\n' +
'6gT5MB8GA1UdIwQYMBaAFO4QaobhtOMXgs60N54MdfGSd5VLMA0GCSqGSIb3DQEB\n' +
'CwUAA4IBAQBWnO9o9KSJIqjoz5Nwll63ULOdcvgGdOeJIw1fcKQ817Rsp+TVcjcH\n' +
'IrIADsT/QZGXRO/l6p1750e2iFtJEo1hsRaxtA1wWn2I9HO3+av2spQhr3jpYGPf\n' +
'zpsMTp4RNYV7Q8+q1kZIz9PY4V1T0p6lveK8+fUj2hSLnxSj0QiGSJJtnEC3w4Rv\n' +
'C9T6oUwIeToULmi+8FXQFdEqwKRU98DPq3eLzN28ZxUgoPE1C8+42D2UW8uyp/Gm\n' +
'tGOa/k7nzkCdVqZI7lX7f0AjEvQgjtAMQ/k7Mhxx7TzW2HO+1YPMoKji6Z4WkNwt\n' +
'JEj9ZUBSNt8B26UksJMBDkcvSegF3a7o\n' +
'-----END CERTIFICATE-----\n'
};
const SERVER_KEY = {
path: HOSTAPD_CONFIG_PATH + 'server.key',
content: '-----BEGIN RSA PRIVATE KEY-----\n' +
'MIIEpAIBAAKCAQEAx2FCYqKVMltZlHFOJJWuohT4thbVEqCHHmj7Qmk1ElUu7PmQ\n' +
'Exo2yRtt9RI24dsSrRAD0EMoBlYhzgtKi2SUKjxNtw70Im8k9AYaMZ0dyiFZfm/L\n' +
'oET85UTjoJS14wXJkXoXxHZ81TDDTyJH+7Vhl5svmlY7WPjew+kDMTLpOKPYAI+3\n' +
'oRlwVpkbdIXaZUlaQJCcGquiM/rlZS9lCqmx5SFbZgBLw27RiuiGDHPpViT5w0O4\n' +
'NlUazqpZFK1nMl9it9zvoO2Qeh/kHXgz7GlcloEvE37CG+diQNN+KdoLGdbU7t5d\n' +
'SW2vzt8tznOZ4GSDBqJpC4h1x9mbu8NSLPy+dQIDAQABAoIBAASG4Mr8hgaurEoC\n' +
'iJOsElr7vunjetMBcg/uskW/vcS8ymP3Bp5oafYG+WgnEbfvEW18f5mq7K24JuxW\n' +
'tUqU7ghHdjxByqk9fMlNmiqmNpbwSufkAeuRpWxPNBvhRH/zEbCL5R5A0nTEtqqF\n' +
'TL0aUSzwCRSoAJD0lZo9ICVt0n3GsDyM9rqQg/uZmh1qsRdwPsRuYORND9g48rKq\n' +
'6WN9leskSxhhsYE2D9ocOFd9bNt8Zxejh9ppVSnG/KsIdt18iBzcabatgAQ046fb\n' +
'Z3vprcZJLg93Sg2gSuVqlSTs3M2W8VQnm22/EBMb1y0M48MSRCgnbPLG/CcCLLfF\n' +
'LwxCOgECgYEA/eYt67xyJ6JeAdxdwOZuT1WWGbFpLiG9+2OgiHumyRQ5969XMTWo\n' +
'fIhMKchDdjoy9RR236\/\/EFCs7UEyB7+a7ODRzNiK2zCD8Smjp+21fUPSthEeQesk\n' +
'eiMYICIu5Ay35x9sxIX+XOUVvRhPOGcD29GVeRnKh1inTHOz2dje8LkCgYEAyQeY\n' +
'STi9jjCEcHkM1E/UeDiLfHHepLXi8wS41JNRHl5Jacp7XB5djAjKu/jf367/VpFy\n' +
'GDDMetE7n8eWkrnAvovxOwZ000YDMtL1sUYSjL+XtBS5s6VY1p4qaSAY9nUUGrJh\n' +
'JvtvsuI7SKTtL+60vjBOH7zDnvOdBgAp0utLhZ0CgYEAuLzzqrPKB8afShFSchn4\n' +
'J2dpuLYahsNsXW7HDqeR2nsKFosRETAusLXnXPtnAq4kB6jlOarwFqnsuRCX24Vx\n' +
'r2uBm9/vYL7zMdUPTA+s30ErHuhjsKjsOKYyVqcooSwT32pBFNk+E89nutfmRG7I\n' +
'IvhjHuNCNqqtx/Xj5d1jkZkCgYBQicppC2Jl5OoqZVTOem0U/RJk+PnJ41TZJ7sk\n' +
'7yBAmmWvDH\/\/l+rCf4M5a6vFYcbKV9rt9h711X2dtciNX/3oWQh8LUoAmrwNUJc+\n' +
'PmSQHvIYI3WCk2vUD+nN1B4sHxu+1lg11eYaNKiroeeknG2tBI1ICcgVlmQCU25u\n' +
'IfZPwQKBgQCdO6QHhPLtcHUDNFA6FQ1jKL1iEd7G0JLVRz4Xkpkn1Vrr5MD6JFDa\n' +
'5ccabADyl0lpFqDIVJQIzLku2hOD2i9aBNCY0pL391HeOS7CkZX+TdOY1tquoBq5\n' +
'MnmixZjDCVd2VcrVyTA6ntOBoharKFW0rH1PqU+qu7dZF7CBPbAdEw==\n' +
'-----END RSA PRIVATE KEY-----\n'
};
const WPA_EAP_AP_LIST = [
{
ssid: 'WPA-EAP-TTLS',
ieee8021x: 1,
eapol_version: 1,
eap_server: 1,
eapol_key_index_workaround: 0,
eap_user_file: SERVER_EAP_USER_CONF.path,
ca_cert: CA_CERT.path,
server_cert: SERVER_CERT.path,
private_key: SERVER_KEY.path,
wpa: 3,
wpa_key_mgmt: 'WPA-EAP'
}
];
const CLIENT_PKCS12_CERT = {
nickname: 'client',
password: 'password',
usage: ['UserCert', 'ServerCert'],
content: [0x30, 0x82, 0x0E, 0x01, 0x02, 0x01, 0x03, 0x30,
0x82, 0x0D, 0xC7, 0x06, 0x09, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82,
0x0D, 0xB8, 0x04, 0x82, 0x0D, 0xB4, 0x30, 0x82,
0x0D, 0xB0, 0x30, 0x82, 0x08, 0x67, 0x06, 0x09,
0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x07,
0x06, 0xA0, 0x82, 0x08, 0x58, 0x30, 0x82, 0x08,
0x54, 0x02, 0x01, 0x00, 0x30, 0x82, 0x08, 0x4D,
0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D,
0x01, 0x07, 0x01, 0x30, 0x1C, 0x06, 0x0A, 0x2A,
0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01,
0x06, 0x30, 0x0E, 0x04, 0x08, 0x67, 0x7A, 0xF3,
0x61, 0xBE, 0xE0, 0x51, 0xC1, 0x02, 0x02, 0x08,
0x00, 0x80, 0x82, 0x08, 0x20, 0xFC, 0x6A, 0x79,
0xA1, 0x6C, 0xAF, 0xBE, 0xEE, 0x62, 0x45, 0x33,
0xB8, 0x48, 0xE1, 0x68, 0xA1, 0x15, 0x11, 0x4B,
0x95, 0xCB, 0x77, 0xC0, 0x5D, 0xA2, 0xCB, 0xDB,
0xD1, 0x83, 0x74, 0x60, 0xD7, 0xEC, 0x42, 0xA6,
0x3A, 0x23, 0xF7, 0x85, 0xEB, 0xC1, 0xFE, 0x6A,
0x57, 0x8E, 0xC1, 0x44, 0xF3, 0x1F, 0xFE, 0xB8,
0x2D, 0x8C, 0x4D, 0xC9, 0x5B, 0xAE, 0x21, 0x2E,
0x4C, 0x1A, 0xEB, 0x84, 0x09, 0xF3, 0x40, 0x92,
0x39, 0x7F, 0x56, 0x02, 0x46, 0x61, 0x16, 0xDE,
0x5C, 0x48, 0xB6, 0x0C, 0x1D, 0xD3, 0x5F, 0x10,
0x9A, 0x39, 0xB8, 0x66, 0x31, 0xFC, 0x39, 0x71,
0x87, 0x23, 0x46, 0x9D, 0xE8, 0x3C, 0x2B, 0xA1,
0x39, 0x8A, 0xD3, 0xFF, 0xD9, 0x43, 0xB6, 0x61,
0xC6, 0x67, 0x70, 0x40, 0xBD, 0xFE, 0xD3, 0xC1,
0x68, 0xF5, 0xF7, 0xC8, 0x89, 0xD8, 0x17, 0xC5,
0xE8, 0x3D, 0x29, 0xD5, 0x91, 0xDF, 0x1F, 0x56,
0x74, 0x5A, 0xC4, 0xA8, 0x14, 0xBA, 0xD4, 0xFA,
0x13, 0x49, 0x2A, 0x9F, 0x63, 0xF1, 0xB2, 0x45,
0xF1, 0xF0, 0x2A, 0xDD, 0x75, 0x66, 0x8A, 0xF7,
0xAB, 0x73, 0x86, 0x26, 0x9D, 0x1F, 0x07, 0xAD,
0xD3, 0xFE, 0xE0, 0xA3, 0xED, 0xA0, 0x96, 0x3E,
0x1E, 0x89, 0x86, 0x02, 0x4C, 0x28, 0xFD, 0x57,
0xA1, 0x67, 0x55, 0xF0, 0x82, 0x3B, 0x7F, 0xCC,
0x2A, 0x32, 0x01, 0x93, 0x1D, 0x8B, 0x66, 0x8A,
0x20, 0x52, 0x84, 0xDD, 0x2C, 0xFD, 0xEE, 0x72,
0xF3, 0x8C, 0x58, 0xB9, 0x99, 0xE5, 0xC1, 0x22,
0x63, 0x59, 0x00, 0xE2, 0x76, 0xC5, 0x3A, 0x17,
0x7F, 0x93, 0xE9, 0x67, 0x61, 0xAA, 0x10, 0xC3,
0xD9, 0xC8, 0x24, 0x46, 0x5B, 0xBE, 0x8C, 0x1F,
0x2D, 0x66, 0x48, 0xD2, 0x02, 0x11, 0xFB, 0x74,
0x14, 0x76, 0x76, 0x5A, 0x98, 0x54, 0x35, 0xA7,
0x85, 0x66, 0x20, 0x26, 0x8B, 0x13, 0x6F, 0x68,
0xE3, 0xC9, 0x58, 0x7D, 0x1C, 0x3E, 0x01, 0x8D,
0xF8, 0xD6, 0x7F, 0xCF, 0xA2, 0x07, 0xB7, 0x95,
0xFD, 0xF0, 0x02, 0x34, 0x32, 0x30, 0xE8, 0xD4,
0x57, 0x5E, 0x53, 0xFB, 0x54, 0xE2, 0x03, 0x32,
0xCC, 0x52, 0x2E, 0xD2, 0x35, 0xD9, 0x58, 0x85,
0x2D, 0xEC, 0x2D, 0x71, 0xD1, 0x8A, 0x29, 0xD0,
0xB0, 0x24, 0xBD, 0x24, 0xDC, 0x1A, 0x28, 0x3F,
0xA0, 0x12, 0x81, 0x15, 0x24, 0xC9, 0xB5, 0x4A,
0x23, 0xB6, 0xA3, 0x45, 0x50, 0x2D, 0x73, 0x99,
0x6B, 0x1C, 0xFB, 0xA4, 0x53, 0xD7, 0x5C, 0xF4,
0x6C, 0xB0, 0xE5, 0x74, 0xB3, 0x76, 0xF8, 0xB1,
0x0D, 0x59, 0x70, 0x9F, 0xCA, 0xDE, 0xF2, 0xAA,
0x4C, 0x7D, 0x11, 0x54, 0xC4, 0x19, 0x0F, 0x36,
0x4A, 0x62, 0xFF, 0x8B, 0x10, 0xCB, 0x93, 0x50,
0xDA, 0x79, 0x5E, 0x4E, 0x09, 0x1F, 0x22, 0xC8,
0x19, 0x85, 0xE9, 0xEE, 0xB7, 0x71, 0x65, 0xB9,
0x10, 0xD2, 0x0A, 0x73, 0x5B, 0xA6, 0xDA, 0x37,
0x46, 0x02, 0x00, 0x98, 0x9E, 0x20, 0x6C, 0x7D,
0xC7, 0x69, 0xBB, 0xC2, 0x00, 0x40, 0x9C, 0x57,
0x00, 0xC2, 0x36, 0x76, 0xE8, 0x2A, 0x8D, 0xAD,
0x62, 0x57, 0xC8, 0xD0, 0x9D, 0x66, 0x27, 0x5A,
0xD8, 0x0D, 0x35, 0x60, 0x28, 0x38, 0x62, 0x94,
0x78, 0x36, 0x25, 0x58, 0xFD, 0xF8, 0x66, 0x1F,
0x68, 0x04, 0x0F, 0xD8, 0x00, 0xDF, 0xA0, 0x6C,
0x25, 0x42, 0x9A, 0x4C, 0xEB, 0x80, 0x13, 0x51,
0x7D, 0x2D, 0xA8, 0x89, 0xD6, 0x1B, 0x67, 0x72,
0x01, 0xF3, 0x2D, 0x16, 0x77, 0xFE, 0x22, 0xBC,
0x8A, 0x45, 0x09, 0x1F, 0x9C, 0x2F, 0x2A, 0xA9,
0x61, 0x5B, 0x4A, 0xE6, 0x64, 0x2C, 0x62, 0x1A,
0x3A, 0x96, 0xE6, 0x0A, 0xAE, 0x05, 0x1A, 0xC8,
0xCB, 0xD6, 0x8F, 0x3A, 0x4B, 0xE0, 0x7F, 0x82,
0xB4, 0x98, 0xF1, 0x9D, 0xD7, 0x14, 0x76, 0x5E,
0x77, 0x85, 0x87, 0xEC, 0x13, 0xDA, 0xFD, 0xAF,
0xCB, 0xA3, 0x1C, 0x99, 0xC1, 0xFE, 0x17, 0x0C,
0x40, 0x4D, 0x3C, 0x8F, 0x70, 0x86, 0x63, 0x64,
0xB7, 0x75, 0xA8, 0x71, 0x36, 0xDC, 0x54, 0x10,
0x57, 0x0C, 0xA8, 0xF2, 0xA1, 0xBB, 0xED, 0x03,
0x41, 0x57, 0x34, 0x2C, 0x8F, 0x7C, 0xA0, 0x09,
0xF3, 0x9E, 0x41, 0xB7, 0xA8, 0xD4, 0x66, 0x0D,
0x0D, 0xC0, 0x6A, 0xFC, 0x6A, 0xA2, 0xAC, 0xE2,
0x60, 0x00, 0xE3, 0xF7, 0x75, 0x43, 0x23, 0xEB,
0xC8, 0x61, 0xFA, 0xB3, 0xB8, 0x28, 0xCE, 0xCA,
0xF4, 0x47, 0x7F, 0x30, 0x6D, 0x61, 0x89, 0x47,
0xA1, 0x4A, 0xFE, 0xD1, 0x21, 0x0B, 0x6D, 0xF4,
0x3F, 0x00, 0x86, 0x30, 0x8E, 0x33, 0x21, 0x6F,
0xDA, 0x15, 0xFD, 0x5F, 0xEC, 0x8E, 0xF1, 0x12,
0x3F, 0xC9, 0x83, 0x0C, 0xCA, 0x22, 0x01, 0xF1,
0x70, 0x5F, 0x1F, 0x66, 0xB5, 0xF8, 0x3E, 0x7A,
0x6F, 0xDE, 0xDB, 0xA7, 0x8D, 0x18, 0x9E, 0xBE,
0xDB, 0xAD, 0x3D, 0x66, 0x30, 0xC1, 0x6C, 0x0C,
0x87, 0xB4, 0x65, 0x75, 0xE0, 0x9D, 0xEA, 0x16,
0x0D, 0x07, 0x37, 0x33, 0xC5, 0xEC, 0x97, 0x93,
0x37, 0xEB, 0x8E, 0x65, 0x9C, 0x40, 0x63, 0x6C,
0x43, 0x60, 0xB0, 0x40, 0x4D, 0x85, 0xEF, 0xC2,
0x47, 0x5F, 0xE7, 0x6B, 0xCB, 0x40, 0xE8, 0xEA,
0xD8, 0xAB, 0xB1, 0x9A, 0x72, 0xDC, 0x4C, 0x14,
0xFA, 0x43, 0x61, 0x5F, 0xA6, 0x5C, 0x3A, 0x05,
0x17, 0x2E, 0x74, 0xF3, 0x5E, 0x45, 0xD9, 0x47,
0xAA, 0x59, 0xB6, 0x8F, 0x42, 0x66, 0x42, 0x29,
0x90, 0x95, 0x48, 0x46, 0x91, 0x88, 0x3C, 0x8C,
0xDE, 0xCC, 0xED, 0xB3, 0xAA, 0x62, 0xEA, 0xBC,
0xB4, 0x0C, 0x48, 0x4C, 0x53, 0x23, 0x5E, 0x24,
0x85, 0xBF, 0x92, 0xDA, 0x14, 0xDB, 0x1A, 0x3D,
0xEF, 0x30, 0xD9, 0x49, 0x64, 0x4D, 0xE5, 0x01,
0xFC, 0xA4, 0x4B, 0xD1, 0x9F, 0xDE, 0x96, 0x7F,
0x50, 0xBC, 0x4D, 0x38, 0x44, 0xE9, 0x23, 0x5F,
0x37, 0x57, 0x1A, 0xA6, 0x52, 0x5A, 0x0F, 0x4F,
0x87, 0x33, 0x4A, 0x7B, 0x66, 0xEE, 0x3D, 0x66,
0x0A, 0x63, 0x39, 0x1F, 0x23, 0x38, 0x35, 0x73,
0x60, 0x5E, 0x47, 0x20, 0x4F, 0xC0, 0xC8, 0x3C,
0x09, 0xF9, 0x29, 0x4F, 0x5E, 0x55, 0x69, 0xC4,
0x6B, 0xE8, 0xF8, 0x91, 0xC0, 0x22, 0x65, 0x15,
0x1E, 0xFB, 0xB9, 0x61, 0xCE, 0x45, 0xBE, 0x2B,
0xEE, 0xB9, 0x04, 0x2B, 0xFD, 0xAE, 0x61, 0x1C,
0x3D, 0x3D, 0x7C, 0xBF, 0xC1, 0xF7, 0x3C, 0x4E,
0x9E, 0x0E, 0x54, 0xC8, 0xAD, 0xA9, 0xDF, 0x43,
0x49, 0xB9, 0x41, 0x05, 0xE5, 0xF1, 0x49, 0xAA,
0x77, 0x6C, 0x34, 0x5B, 0x93, 0x24, 0x24, 0x23,
0x74, 0x68, 0x11, 0xCE, 0x15, 0x80, 0xA1, 0xA4,
0x1F, 0x8D, 0x81, 0xCD, 0xB2, 0x98, 0xCA, 0x14,
0x0B, 0x0C, 0x61, 0x50, 0x69, 0x72, 0xAE, 0xFA,
0x8B, 0xC0, 0x3F, 0x0D, 0xE7, 0xF2, 0x0F, 0xEB,
0xC1, 0x11, 0xB9, 0x10, 0x03, 0x6A, 0xF5, 0x97,
0x3C, 0x53, 0x2F, 0x67, 0x86, 0x09, 0x6A, 0xE3,
0x28, 0xC0, 0x78, 0xC8, 0xB4, 0x39, 0x8E, 0xD1,
0xCE, 0x25, 0xE8, 0x66, 0xF7, 0x09, 0x40, 0x7D,
0x81, 0xFB, 0xAF, 0xFA, 0x59, 0xC4, 0x9B, 0x2B,
0x83, 0x45, 0x5B, 0xA8, 0x66, 0x9E, 0x38, 0xC8,
0xFD, 0xAC, 0xF2, 0x2D, 0x21, 0xDE, 0x50, 0x4C,
0x03, 0xCB, 0x88, 0x42, 0xDD, 0x84, 0x09, 0x99,
0x8E, 0x8B, 0x40, 0x97, 0x1B, 0x14, 0x85, 0x37,
0x11, 0x01, 0xE0, 0x74, 0x6B, 0x33, 0x52, 0x8C,
0x68, 0x3A, 0x89, 0xB2, 0xAF, 0x35, 0xE6, 0x65,
0xC3, 0x58, 0x70, 0xD2, 0xE7, 0x1F, 0x1F, 0xF6,
0xE5, 0x0A, 0xB1, 0xFE, 0xD0, 0xC9, 0x51, 0x50,
0xE7, 0xFD, 0x58, 0xF5, 0xC4, 0x58, 0x65, 0x94,
0xD1, 0x57, 0x55, 0x5E, 0xD2, 0x27, 0x98, 0xAF,
0xE7, 0x55, 0x0B, 0x87, 0x50, 0x9B, 0xEF, 0xE8,
0x2B, 0xFC, 0xE7, 0x3B, 0x4E, 0xD7, 0xB7, 0x4D,
0xF4, 0xBC, 0xF4, 0x88, 0x63, 0xE4, 0x8A, 0x20,
0x4B, 0x22, 0xB0, 0xA0, 0x53, 0x7F, 0xA8, 0xC9,
0x0C, 0xF8, 0xD7, 0xBD, 0x46, 0x39, 0xA7, 0x7D,
0xDD, 0x10, 0x91, 0x50, 0x54, 0x06, 0x47, 0xF0,
0x3C, 0xAA, 0x43, 0x40, 0xF8, 0x54, 0xDD, 0x8A,
0xEA, 0x8A, 0x0B, 0xA5, 0x7F, 0xCD, 0x5E, 0xAA,
0x02, 0x2E, 0x1F, 0xC6, 0x50, 0x15, 0xF8, 0x0A,
0x0C, 0x1B, 0x3C, 0x55, 0x3A, 0xC3, 0x6F, 0x88,
0xD7, 0xBF, 0xB1, 0x02, 0xCC, 0xE0, 0x08, 0x29,
0x97, 0xD2, 0xAA, 0x23, 0xC4, 0x6D, 0xE3, 0xE3,
0x76, 0x39, 0x92, 0xC3, 0x2E, 0x7A, 0xE2, 0x98,
0xD1, 0xFC, 0xAE, 0xCC, 0x95, 0xD8, 0xB4, 0xDC,
0x92, 0xEA, 0x6A, 0x5F, 0xF2, 0x92, 0x17, 0x0B,
0x8D, 0xC3, 0xFA, 0x9C, 0x62, 0xCE, 0x44, 0x8D,
0xC3, 0x1E, 0xC3, 0xB2, 0xD5, 0x00, 0xCD, 0xB4,
0x9E, 0x2D, 0x7B, 0xF2, 0x98, 0xA3, 0x00, 0x8B,
0x81, 0x30, 0x77, 0x5B, 0x02, 0x99, 0xB1, 0xCD,
0xC3, 0x1D, 0x74, 0x74, 0xEF, 0x41, 0xCB, 0x69,
0x63, 0x8E, 0xA6, 0xD3, 0x2D, 0x3E, 0x1F, 0x1D,
0x12, 0x9E, 0xD9, 0x18, 0x67, 0x06, 0xAF, 0x37,
0x29, 0xAD, 0x65, 0xD8, 0xEB, 0x71, 0xC4, 0x7D,
0x94, 0x3D, 0xEA, 0xCC, 0xDF, 0x72, 0x41, 0x51,
0x3C, 0xA1, 0x66, 0x98, 0x32, 0x32, 0x40, 0x54,
0xB0, 0x2F, 0xEB, 0xCE, 0xDF, 0x4A, 0x64, 0xFB,
0x9A, 0x90, 0xDC, 0xF6, 0x6F, 0xA9, 0xD4, 0xCA,
0xCB, 0x91, 0xC4, 0xFE, 0xEE, 0x9C, 0x01, 0x50,
0x2E, 0xAC, 0xCC, 0x5F, 0x89, 0xD0, 0x91, 0xA3,
0xD9, 0xF9, 0x4B, 0x8D, 0xDE, 0x6C, 0x60, 0x21,
0x19, 0xB1, 0xD3, 0x4D, 0x75, 0x56, 0x6F, 0xB8,
0x25, 0xA4, 0x92, 0x4F, 0x12, 0xF5, 0x8F, 0xC1,
0x17, 0x4B, 0xB3, 0x34, 0x21, 0x22, 0xAC, 0x52,
0xD2, 0x64, 0xC9, 0x9A, 0x7D, 0xFC, 0xC0, 0x0A,
0x89, 0x34, 0xFF, 0x08, 0xD3, 0x04, 0xDC, 0xFE,
0x7C, 0xB3, 0xB8, 0xFD, 0x85, 0xDD, 0x79, 0x51,
0xA7, 0x89, 0xE8, 0xF1, 0x23, 0xB1, 0xDF, 0xD7,
0x1F, 0x7B, 0xB1, 0x5D, 0x42, 0xF9, 0x61, 0xF8,
0xDC, 0x81, 0x04, 0xF1, 0xCC, 0xFA, 0xD7, 0xED,
0xBF, 0x47, 0xAC, 0xBD, 0xE5, 0xFA, 0xAC, 0xB3,
0x1C, 0xD9, 0xA1, 0xB3, 0x60, 0xEE, 0x9C, 0x8A,
0x36, 0x57, 0xB4, 0x2F, 0xA1, 0xA2, 0xF3, 0xE2,
0x09, 0x9A, 0x6E, 0x43, 0x9B, 0xE5, 0x93, 0xB8,
0x3D, 0x9E, 0x9F, 0xC1, 0xC6, 0x0D, 0x02, 0xEB,
0x4D, 0x38, 0xE9, 0xB4, 0x9F, 0xEA, 0x33, 0x8C,
0x07, 0xD8, 0xB4, 0x71, 0xAD, 0xE5, 0x43, 0xB2,
0xCC, 0x55, 0x93, 0x6A, 0xDB, 0x1E, 0x80, 0xDB,
0xC2, 0xEA, 0x42, 0x8E, 0xFC, 0x86, 0x44, 0xC9,
0x8A, 0xC4, 0xF2, 0x46, 0xA7, 0x39, 0x50, 0x0D,
0x1A, 0xAA, 0x07, 0x04, 0xBE, 0xD4, 0xCE, 0x62,
0x4D, 0x0F, 0x91, 0x7D, 0x29, 0x88, 0x9C, 0x4C,
0xAF, 0xF7, 0xD8, 0x40, 0x93, 0x88, 0xC7, 0x20,
0xD2, 0x17, 0x2A, 0xC4, 0x92, 0x72, 0xD0, 0xC0,
0x4E, 0x56, 0x47, 0xB1, 0x27, 0x02, 0xE6, 0x61,
0x82, 0x5E, 0xC8, 0x2E, 0x90, 0xD2, 0x31, 0x22,
0xE2, 0xA9, 0x4A, 0x91, 0x45, 0x69, 0xB1, 0xA5,
0x0F, 0x66, 0x2C, 0x30, 0xAD, 0x7F, 0x1B, 0x0E,
0x22, 0x17, 0x60, 0x2E, 0x3D, 0x7F, 0x7F, 0x8C,
0x33, 0x51, 0xA0, 0x25, 0xDE, 0xFD, 0x75, 0xBC,
0xEF, 0xE6, 0xE7, 0x20, 0x04, 0x5A, 0xEC, 0x50,
0x21, 0x48, 0x56, 0x98, 0xE2, 0x33, 0x6D, 0x22,
0x5C, 0xC3, 0xFB, 0xFC, 0x6F, 0xB3, 0xA7, 0x8E,
0x6F, 0x67, 0x70, 0x9D, 0xDA, 0x02, 0x01, 0x59,
0x7B, 0x3D, 0x2B, 0x38, 0xCC, 0x0F, 0x44, 0x3D,
0xFB, 0x9A, 0xB3, 0x23, 0x15, 0x50, 0x6E, 0xBF,
0x8B, 0xA1, 0x94, 0x33, 0xE5, 0x7B, 0x88, 0x4E,
0xCB, 0x6D, 0x9F, 0xBF, 0xBC, 0x7A, 0xA8, 0x1E,
0x68, 0x25, 0xED, 0x8E, 0x53, 0x21, 0x72, 0xC5,
0x70, 0xB3, 0xE4, 0xA6, 0xA1, 0x5A, 0x2D, 0xC8,
0x43, 0x9D, 0x60, 0x77, 0x78, 0xE0, 0xC4, 0xAF,
0xC8, 0x29, 0xBA, 0xD0, 0x4D, 0x39, 0x83, 0x51,
0xA7, 0x10, 0x7F, 0x0C, 0x34, 0x0E, 0x6C, 0x75,
0x26, 0xD7, 0xD6, 0xC7, 0x32, 0x53, 0xAF, 0x4E,
0xBE, 0xF2, 0xC2, 0x0F, 0x99, 0x23, 0xB9, 0xE1,
0xC8, 0xB4, 0xBC, 0x5A, 0xC6, 0xCB, 0xEB, 0x4D,
0x28, 0x56, 0x72, 0xFE, 0x1B, 0x2C, 0x5D, 0xE3,
0xBC, 0xC7, 0xA3, 0xC0, 0x7D, 0x27, 0xF0, 0xD0,
0x4F, 0x3F, 0x1F, 0xF7, 0x87, 0x15, 0xF2, 0xEA,
0xD4, 0x03, 0x6D, 0x2F, 0xD4, 0x8E, 0x50, 0x4B,
0x05, 0xBF, 0xF7, 0x8C, 0x67, 0x5A, 0xDC, 0x4D,
0xCD, 0xCF, 0x9D, 0x02, 0xB6, 0xE7, 0xAE, 0x49,
0xD1, 0x7C, 0x00, 0xE7, 0x3B, 0xEA, 0xFB, 0x0D,
0x2A, 0x7B, 0x41, 0x33, 0x66, 0xD0, 0x29, 0x9F,
0xB3, 0x8A, 0x71, 0xB0, 0xE2, 0x76, 0xA9, 0xDB,
0xFD, 0x64, 0x04, 0x69, 0xDF, 0x89, 0x1F, 0x56,
0x86, 0x92, 0xD9, 0xD9, 0xB9, 0xF3, 0x4F, 0xAC,
0xAE, 0x61, 0x48, 0x20, 0xCE, 0x3C, 0x2B, 0x44,
0xAB, 0x42, 0xFA, 0xAB, 0x2E, 0x94, 0x82, 0xC8,
0xD9, 0x97, 0xCF, 0x27, 0xDF, 0xAC, 0xAC, 0xE7,
0xCA, 0xB2, 0x84, 0xAB, 0xF2, 0x5D, 0xDF, 0x56,
0x0C, 0x8C, 0x07, 0x3C, 0x3D, 0xA8, 0xDD, 0xBE,
0xFF, 0x4E, 0x28, 0x0D, 0xB2, 0x2D, 0xE6, 0x9D,
0x44, 0x21, 0xCB, 0xE7, 0x33, 0x63, 0x22, 0x8F,
0x4C, 0xFF, 0xB6, 0x1D, 0x9A, 0x71, 0x3F, 0xB1,
0x29, 0xAE, 0x3A, 0x35, 0xEE, 0x9C, 0x97, 0x68,
0xA7, 0x52, 0x66, 0x01, 0xD8, 0x9A, 0x5D, 0xF4,
0xB3, 0x2F, 0x5C, 0xD4, 0x0E, 0xF9, 0xCF, 0x07,
0xF6, 0x8C, 0xBA, 0xA6, 0x8D, 0x6B, 0xC6, 0x01,
0xC2, 0x69, 0xAE, 0x60, 0x08, 0x1A, 0x0E, 0x3F,
0xAE, 0x60, 0x29, 0xF3, 0x48, 0x0D, 0xE0, 0xD0,
0xAE, 0x52, 0x44, 0xE9, 0x7F, 0x1F, 0x92, 0x5F,
0x71, 0xAD, 0xEC, 0x6B, 0x47, 0x66, 0x92, 0x22,
0x27, 0xAE, 0x6E, 0x25, 0xCD, 0xF3, 0x5F, 0x55,
0x59, 0xBD, 0x73, 0xCE, 0x2B, 0x7E, 0x99, 0x44,
0x56, 0x70, 0xA3, 0xE7, 0x7A, 0x59, 0x75, 0xD8,
0x48, 0x0C, 0x39, 0x2B, 0xD7, 0x53, 0xC6, 0xAD,
0x4A, 0x6F, 0xB4, 0x14, 0x96, 0xDF, 0xF2, 0x4A,
0x0C, 0xA2, 0xD5, 0x29, 0x98, 0x7C, 0x42, 0x87,
0xD9, 0x1F, 0x97, 0x61, 0xD9, 0xBF, 0x99, 0x4F,
0x2C, 0x4C, 0x75, 0xAC, 0xB8, 0x06, 0x75, 0xD6,
0x87, 0x76, 0x7E, 0xE3, 0x23, 0x4B, 0xEA, 0x1A,
0x1A, 0xF4, 0xB7, 0x09, 0xAF, 0x53, 0xEB, 0xA6,
0x39, 0x10, 0xFE, 0xD4, 0xEB, 0x1B, 0xAE, 0x38,
0x31, 0x33, 0xBA, 0x68, 0xEE, 0xC7, 0x65, 0x76,
0xFB, 0x49, 0x77, 0xD4, 0x19, 0xC4, 0xE6, 0xA7,
0x05, 0xFE, 0x2A, 0xDA, 0x39, 0x99, 0x1A, 0x92,
0xD2, 0xF0, 0x61, 0x97, 0xF6, 0x06, 0x6C, 0x88,
0x7B, 0x6F, 0x60, 0xE6, 0x70, 0x08, 0xF0, 0xB4,
0x6B, 0x39, 0x6F, 0x05, 0x41, 0x81, 0xF9, 0xBE,
0x7A, 0x51, 0xC4, 0x75, 0xB0, 0x6A, 0x89, 0xA0,
0xA6, 0x9A, 0x5B, 0xEE, 0x7D, 0x78, 0x17, 0x5F,
0x9F, 0x3B, 0x7D, 0xDD, 0x8A, 0x9E, 0xAA, 0x1A,
0xDA, 0x49, 0x08, 0xE9, 0xFD, 0x91, 0xA6, 0xFA,
0xCE, 0xCF, 0x67, 0xDF, 0x0F, 0xC9, 0xD6, 0x38,
0xD9, 0xD5, 0xD1, 0xC0, 0x76, 0x59, 0x42, 0x53,
0xBF, 0x48, 0xE9, 0x11, 0x74, 0xC7, 0x11, 0xD8,
0xE7, 0x8E, 0xD3, 0xC8, 0x25, 0xA1, 0x26, 0x50,
0xBB, 0xB4, 0x35, 0xAF, 0xAF, 0x06, 0x23, 0x69,
0x3E, 0x30, 0xFD, 0x7B, 0x34, 0x83, 0x07, 0xD0,
0xF0, 0x0F, 0x6C, 0x9A, 0x13, 0x5D, 0xC2, 0x7B,
0xDF, 0x6F, 0xDD, 0x8E, 0xF4, 0x30, 0x82, 0x05,
0x41, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7,
0x0D, 0x01, 0x07, 0x01, 0xA0, 0x82, 0x05, 0x32,
0x04, 0x82, 0x05, 0x2E, 0x30, 0x82, 0x05, 0x2A,
0x30, 0x82, 0x05, 0x26, 0x06, 0x0B, 0x2A, 0x86,
0x48, 0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x0A, 0x01,
0x02, 0xA0, 0x82, 0x04, 0xEE, 0x30, 0x82, 0x04,
0xEA, 0x30, 0x1C, 0x06, 0x0A, 0x2A, 0x86, 0x48,
0x86, 0xF7, 0x0D, 0x01, 0x0C, 0x01, 0x03, 0x30,
0x0E, 0x04, 0x08, 0x74, 0xC0, 0x84, 0x8F, 0xC7,
0x74, 0x5E, 0x21, 0x02, 0x02, 0x08, 0x00, 0x04,
0x82, 0x04, 0xC8, 0x1E, 0xF4, 0xE9, 0x07, 0x27,
0x9E, 0x5A, 0xC9, 0x39, 0x1D, 0x37, 0x2C, 0x06,
0x4B, 0x57, 0xEA, 0xC5, 0x42, 0x9A, 0x60, 0xD5,
0x42, 0xB2, 0x34, 0x2D, 0xD3, 0x88, 0x7C, 0x78,
0x87, 0xB6, 0xE9, 0x42, 0x44, 0x1F, 0x67, 0x32,
0x92, 0x54, 0x22, 0xDA, 0xB2, 0x43, 0xE7, 0x40,
0xBE, 0x1F, 0xAF, 0x3A, 0xCD, 0x2A, 0x9F, 0xD7,
0x44, 0x5B, 0x37, 0x69, 0x85, 0xDF, 0xEB, 0x2A,
0xB9, 0xE2, 0x92, 0x3B, 0xEA, 0xD5, 0x42, 0x53,
0x95, 0x4A, 0xB0, 0x1B, 0xA5, 0xEF, 0xA6, 0x0D,
0x29, 0xF4, 0x33, 0xFE, 0xD7, 0x49, 0x04, 0x1E,
0x8C, 0xAD, 0x63, 0x1E, 0x79, 0x63, 0x74, 0x0C,
0xE5, 0x5E, 0xA2, 0x2C, 0xBE, 0xB8, 0x90, 0xCE,
0x06, 0x25, 0xBF, 0xD1, 0x5A, 0x50, 0xCF, 0x3B,
0x52, 0xE2, 0xA7, 0xFF, 0x19, 0x02, 0xCF, 0xD0,
0x9B, 0xD9, 0xF7, 0x28, 0x07, 0x38, 0x1F, 0xF2,
0xAF, 0x44, 0x91, 0x3F, 0x0F, 0xB6, 0x6E, 0x8C,
0xC0, 0x32, 0x92, 0xC0, 0xCD, 0x25, 0x98, 0x67,
0xF1, 0x47, 0x52, 0x50, 0xF0, 0xA3, 0x7B, 0xE6,
0x74, 0xDC, 0x72, 0x28, 0xC8, 0xAB, 0xB3, 0x31,
0x7D, 0xA3, 0xF7, 0xC7, 0xD1, 0xE6, 0x99, 0xB4,
0xB6, 0x5A, 0x3A, 0x4D, 0x83, 0x4F, 0xB8, 0xB5,
0x86, 0xF8, 0x37, 0x7F, 0xA0, 0x16, 0x2F, 0x3C,
0x62, 0x7A, 0xD4, 0x3A, 0xEB, 0xC2, 0xE8, 0x03,
0x49, 0x17, 0x9E, 0xFB, 0xD7, 0xAF, 0x91, 0x32,
0xFD, 0xEA, 0x4F, 0x64, 0xC6, 0x6E, 0x02, 0xEA,
0xC4, 0xC8, 0x1F, 0x16, 0xC5, 0x4C, 0xFB, 0xC5,
0x42, 0xF5, 0x85, 0x05, 0x92, 0x59, 0x4B, 0x31,
0xE5, 0xE9, 0x69, 0xE7, 0x02, 0x98, 0x33, 0xBA,
0x4C, 0x17, 0x09, 0xEF, 0x89, 0x20, 0xFA, 0x83,
0x9F, 0xAE, 0x0E, 0x1B, 0x7D, 0x98, 0xB9, 0xF2,
0x3C, 0x0F, 0xB7, 0x1C, 0x72, 0xDF, 0x17, 0x84,
0x7F, 0x0A, 0xFD, 0x12, 0x3C, 0x6F, 0x68, 0x5D,
0x45, 0xEB, 0xB8, 0xD6, 0x24, 0x65, 0x42, 0x75,
0x5C, 0xC2, 0xF3, 0x3A, 0x6A, 0x4E, 0x51, 0x34,
0x1B, 0xB6, 0x81, 0xB2, 0x8A, 0xEF, 0x28, 0xA4,
0xC5, 0x88, 0x9A, 0x97, 0xE0, 0xEF, 0x31, 0x12,
0x01, 0x7E, 0x1B, 0x43, 0x0F, 0x27, 0x80, 0x87,
0x98, 0xC5, 0xD5, 0x83, 0xCB, 0x4B, 0xB7, 0x01,
0x79, 0x60, 0xA1, 0x1A, 0x03, 0x05, 0xC6, 0x36,
0x04, 0x31, 0x3C, 0x06, 0xDB, 0x08, 0xA8, 0xDA,
0x8E, 0x32, 0x19, 0x91, 0xF1, 0x0D, 0x61, 0x6F,
0xE4, 0xB2, 0x79, 0x8A, 0xDE, 0xF4, 0xF7, 0xFB,
0x2C, 0x23, 0x5B, 0xD9, 0x64, 0x2F, 0xB7, 0xB3,
0x8B, 0xCA, 0xB8, 0x8C, 0x1D, 0x3B, 0x49, 0x05,
0x38, 0xA1, 0xE5, 0x8C, 0x1A, 0xDC, 0xA5, 0x61,
0xFE, 0xF4, 0x2B, 0xDC, 0x77, 0x28, 0xF6, 0x19,
0xE7, 0xB7, 0x8F, 0x4D, 0x27, 0x2D, 0xED, 0x8A,
0x3F, 0x3D, 0xDC, 0x9F, 0xD1, 0x30, 0xFF, 0xD6,
0xC3, 0xBE, 0x41, 0x25, 0xE3, 0xA5, 0x9B, 0x73,
0xDF, 0x6A, 0xD9, 0xF9, 0x70, 0x84, 0x02, 0x4C,
0x35, 0xD4, 0x3E, 0x05, 0x76, 0x3A, 0xDC, 0x6D,
0x5A, 0x81, 0xB3, 0x94, 0xF7, 0x22, 0xF7, 0xDC,
0xC1, 0x43, 0x31, 0x57, 0x5B, 0x42, 0x9A, 0x0B,
0xF4, 0x95, 0x30, 0xA9, 0xBB, 0xD8, 0x06, 0xFB,
0x1D, 0x6F, 0x9B, 0xC3, 0xBB, 0xF3, 0xBF, 0xFB,
0xB4, 0x9F, 0x35, 0x64, 0x0A, 0x69, 0xB7, 0xD1,
0x3E, 0xCA, 0x78, 0x07, 0x04, 0x03, 0x79, 0xD4,
0xF3, 0xA8, 0xEC, 0x18, 0xDB, 0x03, 0x5E, 0x47,
0xD7, 0xD0, 0x56, 0x2C, 0x74, 0x94, 0x86, 0x04,
0x46, 0xB8, 0xD4, 0x35, 0x0A, 0x7B, 0xE6, 0x78,
0xC4, 0x43, 0x3C, 0x56, 0xCC, 0x37, 0x8B, 0xFD,
0xE8, 0xF4, 0x57, 0xEA, 0xAE, 0xCF, 0x36, 0x97,
0x12, 0xAC, 0x39, 0xCF, 0x7C, 0xEF, 0x22, 0x67,
0x01, 0xEC, 0xD8, 0x09, 0x49, 0x4E, 0xE3, 0x74,
0xDD, 0x39, 0xE1, 0x39, 0xD7, 0x0C, 0x5F, 0x1B,
0xCE, 0x69, 0xBC, 0x72, 0x44, 0x87, 0x64, 0x1C,
0x08, 0x05, 0x93, 0x69, 0x6D, 0x7F, 0x90, 0x0A,
0x2C, 0xCB, 0x8A, 0xBB, 0x7F, 0xE3, 0xE0, 0x80,
0x31, 0xD0, 0x0A, 0x3A, 0x95, 0xFF, 0xF7, 0xB4,
0x36, 0x38, 0x93, 0xE0, 0x0C, 0x11, 0x37, 0x12,
0x06, 0xF6, 0xAD, 0xE9, 0xB1, 0x7A, 0x00, 0xF5,
0xD2, 0x32, 0x6B, 0xD0, 0x27, 0xA5, 0x1B, 0x3D,
0xE8, 0xDB, 0xCC, 0xA9, 0x1F, 0x1F, 0xB1, 0x99,
0x3D, 0x7C, 0xB7, 0xCA, 0xDA, 0x27, 0x2C, 0x64,
0x1C, 0x49, 0xB6, 0x87, 0x44, 0x06, 0x94, 0x9D,
0xBC, 0x6B, 0x20, 0xA2, 0x68, 0x15, 0x1F, 0xE2,
0xF2, 0xAD, 0x6D, 0x23, 0x2E, 0x2B, 0x74, 0xE2,
0x5D, 0xE4, 0xB0, 0xC7, 0x84, 0xCB, 0x64, 0xBF,
0xE0, 0xA8, 0x18, 0x83, 0xB4, 0xC9, 0xD9, 0x73,
0xA8, 0xE6, 0xA9, 0x36, 0xD5, 0x63, 0x1E, 0x2C,
0x2A, 0x55, 0x09, 0x77, 0x5E, 0xB3, 0x4B, 0xEA,
0xB5, 0xD0, 0x14, 0x5F, 0xEB, 0x50, 0x7B, 0xAA,
0xEF, 0x94, 0xBA, 0x2B, 0xD7, 0x8A, 0x07, 0xF1,
0xF9, 0x5E, 0x12, 0x12, 0x21, 0x52, 0xE5, 0x0A,
0x3E, 0xC0, 0xBC, 0x5D, 0x4C, 0xE2, 0x12, 0x7C,
0x39, 0xF9, 0x16, 0x9D, 0xBD, 0x96, 0x83, 0x3B,
0x7F, 0x3D, 0x6A, 0xEC, 0xF1, 0x25, 0xD2, 0xB0,
0xB0, 0xEB, 0x20, 0x06, 0x07, 0xD6, 0xD9, 0x4C,
0x07, 0x9A, 0x82, 0xC1, 0xFC, 0xF7, 0x66, 0x15,
0xBD, 0x62, 0x65, 0xD8, 0x6C, 0xF6, 0x33, 0x7B,
0x5A, 0x28, 0xEC, 0x90, 0xA1, 0x26, 0x9F, 0xC3,
0x28, 0x4A, 0x64, 0x50, 0x5F, 0xCA, 0xE2, 0x6D,
0xB8, 0x0F, 0xE2, 0x94, 0xB5, 0x8E, 0x1F, 0x8A,
0x8F, 0x6B, 0xA6, 0x86, 0x1F, 0xEE, 0xDC, 0x24,
0xB4, 0xB8, 0x25, 0xEC, 0x28, 0x2D, 0xF9, 0xCB,
0x7D, 0x38, 0xFF, 0xC7, 0x74, 0x2E, 0xD3, 0x10,
0xEC, 0x03, 0x31, 0xEE, 0x83, 0xE7, 0xA4, 0xF7,
0xBA, 0x28, 0x21, 0xE0, 0x7F, 0xB4, 0xB7, 0xE1,
0x7A, 0xF9, 0x2B, 0xB0, 0x2C, 0x3B, 0x80, 0x5F,
0xE0, 0x5D, 0xB2, 0x7E, 0x59, 0xFF, 0x59, 0x07,
0x58, 0x42, 0x57, 0xEE, 0x44, 0xF1, 0xB1, 0xAD,
0xBA, 0xDE, 0xCB, 0x1D, 0x8A, 0x36, 0x67, 0xE8,
0x45, 0xFF, 0x07, 0x8D, 0xEE, 0xA4, 0x51, 0x9C,
0x4C, 0x83, 0x5D, 0x2E, 0x2F, 0xE1, 0x5B, 0x75,
0xE8, 0x29, 0xCD, 0x0B, 0x07, 0x62, 0xE0, 0xC3,
0x0D, 0x1D, 0xEA, 0xCF, 0xF0, 0x8A, 0x65, 0x27,
0x70, 0x42, 0x9F, 0x26, 0x00, 0x15, 0x70, 0xC5,
0x4A, 0xF6, 0x25, 0xD0, 0x40, 0x72, 0xE9, 0xC1,
0x73, 0xFD, 0x48, 0x94, 0xA3, 0x8D, 0x66, 0x63,
0x96, 0x4F, 0xF7, 0xEE, 0xFB, 0x4C, 0xC7, 0xB8,
0x6B, 0xE9, 0x90, 0xE1, 0x2A, 0x66, 0x80, 0x99,
0x3B, 0xB0, 0x1A, 0x6C, 0xF9, 0x0E, 0x72, 0xDA,
0x8E, 0x4F, 0x46, 0xC2, 0x6A, 0x4B, 0x7A, 0x16,
0xE5, 0x26, 0x0B, 0x5C, 0xD4, 0x47, 0x34, 0xE5,
0x37, 0xBE, 0x68, 0x6C, 0xDA, 0xD3, 0x9B, 0x6F,
0xAE, 0x51, 0x9C, 0x99, 0x0A, 0x5B, 0xF8, 0x37,
0xBC, 0xDE, 0xFC, 0x93, 0xC5, 0xE7, 0x0F, 0xEF,
0x0B, 0xA6, 0x07, 0xC2, 0xA6, 0xE6, 0xDA, 0x2D,
0x1B, 0x49, 0xC9, 0xDE, 0x6B, 0x27, 0xDC, 0x00,
0xEF, 0x23, 0x87, 0x0E, 0xEB, 0xD1, 0x48, 0x7D,
0xB4, 0xF2, 0x58, 0xC6, 0x3C, 0xE2, 0x89, 0xBA,
0xB0, 0x05, 0xAC, 0x94, 0x41, 0x9A, 0xA8, 0xFF,
0x3E, 0xBC, 0x3A, 0x52, 0x9C, 0xF9, 0x7F, 0x07,
0x8B, 0xB0, 0x2C, 0x71, 0x83, 0x7B, 0xCF, 0x2E,
0x7F, 0x7C, 0x96, 0x65, 0xD9, 0x08, 0x17, 0xEC,
0xFA, 0xDE, 0x4E, 0x40, 0x12, 0x26, 0x70, 0x71,
0x65, 0xA5, 0xDC, 0x98, 0x47, 0xA3, 0xFC, 0xE0,
0x9A, 0x16, 0xED, 0x45, 0x56, 0x72, 0x50, 0x05,
0x28, 0x2C, 0x99, 0xEC, 0x20, 0x2E, 0x40, 0xC0,
0x26, 0x69, 0xCD, 0x49, 0x45, 0x17, 0xA4, 0xA3,
0x42, 0x0D, 0x14, 0x65, 0x87, 0x33, 0x8C, 0x92,
0xC5, 0xC4, 0x61, 0xFD, 0xE8, 0x68, 0x56, 0x20,
0x57, 0xF5, 0x8E, 0x5F, 0xCF, 0x7E, 0x97, 0xF6,
0x49, 0x97, 0x0A, 0xFE, 0xD3, 0x60, 0x1A, 0x5B,
0x0C, 0x75, 0xDD, 0x8E, 0x31, 0x78, 0x29, 0xA6,
0xB1, 0x4D, 0xAA, 0xDF, 0x8A, 0xD1, 0xE6, 0x91,
0xE3, 0x32, 0x3F, 0xEC, 0x8A, 0x1F, 0x0E, 0x35,
0x07, 0x6E, 0x4B, 0x83, 0x3B, 0xE5, 0x67, 0x34,
0x1F, 0x0C, 0x81, 0xD8, 0xD5, 0x25, 0x68, 0xE5,
0x28, 0x1B, 0x5C, 0x81, 0x3E, 0xE3, 0x5C, 0xB4,
0xB6, 0xBD, 0x62, 0x6A, 0x70, 0x33, 0xC2, 0xC5,
0x75, 0x27, 0xF4, 0x30, 0xE1, 0x1D, 0xC1, 0x4C,
0xC5, 0x02, 0x12, 0x46, 0xAC, 0xEC, 0xF9, 0xE8,
0xE7, 0x58, 0x24, 0x11, 0xB1, 0xF3, 0xB7, 0x8C,
0x3C, 0xA4, 0x0A, 0x94, 0xA6, 0x7C, 0x68, 0x54,
0x5B, 0xB9, 0x4D, 0x57, 0x9C, 0xE7, 0x28, 0x09,
0x6B, 0x89, 0x26, 0x5D, 0xE7, 0x50, 0xA9, 0x95,
0x90, 0x91, 0x8E, 0x00, 0x59, 0xF8, 0x3A, 0x70,
0xAF, 0x48, 0x2E, 0xE8, 0xC4, 0x34, 0x8C, 0xF4,
0x5F, 0x7F, 0xCB, 0x07, 0xAA, 0xF0, 0xD9, 0xFB,
0x5C, 0x32, 0x90, 0x22, 0x1A, 0xD2, 0x1A, 0xCF,
0x92, 0x06, 0x02, 0xCF, 0x10, 0x18, 0x7B, 0x93,
0xCC, 0x07, 0x4A, 0x31, 0x25, 0x30, 0x23, 0x06,
0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01,
0x09, 0x15, 0x31, 0x16, 0x04, 0x14, 0xD1, 0xDE,
0x23, 0x16, 0x9F, 0x6E, 0xF4, 0x42, 0x21, 0x23,
0xE1, 0x11, 0xAA, 0xC8, 0x7C, 0x60, 0x4A, 0x78,
0x9D, 0x24, 0x30, 0x31, 0x30, 0x21, 0x30, 0x09,
0x06, 0x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A, 0x05,
0x00, 0x04, 0x14, 0xD6, 0x4A, 0xBB, 0x75, 0xB1,
0xF9, 0x9E, 0xD3, 0x58, 0x6D, 0xD1, 0x74, 0x9F,
0x00, 0x8A, 0xF2, 0xC8, 0xAA, 0x52, 0x4D, 0x04,
0x08, 0x77, 0x46, 0xE7, 0xBA, 0x25, 0x4B, 0xDA,
0x41, 0x02, 0x02, 0x08, 0x00]
};
const WPA_EAP_CLIENT_LIST = [
{
ssid: 'WPA-EAP-TTLS',
keyManagement: 'WPA-EAP',
eap: 'TTLS',
identity: EAP_USERNAME,
password: EAP_PASSWORD,
serverCertificate: CLIENT_PKCS12_CERT.nickname,
phase2: 'MSCHAPV2'
}
];
/**
* Convert the given MozWifiNetwork object array to testAssociate chain.
*
* @param aNetworks
* An array of MozWifiNetwork which we want to convert.
*
* @return A promise chain which "then"s testAssociate accordingly.
*/
function convertToTestAssociateChain(aNetworks) {
let chain = Promise.resolve();
aNetworks.forEach(function (aNetwork) {
network = new window.MozWifiNetwork(aNetwork);
chain = chain.then(() => gTestSuite.testAssociate(network));
});
return chain;
}
gTestSuite.doTestWithCertificate(
new Blob([new Uint8Array(CLIENT_PKCS12_CERT.content)]),
CLIENT_PKCS12_CERT.password,
CLIENT_PKCS12_CERT.nickname,
CLIENT_PKCS12_CERT.usage,
function() {
return gTestSuite.ensureWifiEnabled(true)
// Load required server files.
.then(() => gTestSuite.writeFile(SERVER_EAP_USER_CONF.path, SERVER_EAP_USER_CONF.content))
.then(() => gTestSuite.writeFile(CA_CERT.path, CA_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_CERT.path, SERVER_CERT.content))
.then(() => gTestSuite.writeFile(SERVER_KEY.path, SERVER_KEY.content))
// Start AP.
.then(() => gTestSuite.startHostapds(WPA_EAP_AP_LIST))
// Scan test.
.then(() => gTestSuite.testWifiScanWithRetry(SCAN_RETRY_CNT, WPA_EAP_AP_LIST))
// Associate test.
.then(() => convertToTestAssociateChain(WPA_EAP_CLIENT_LIST))
// Tear down.
.then(gTestSuite.killAllHostapd)
});

View File

@ -332,6 +332,8 @@ CompositorVsyncObserver::Composite(TimeStamp aVsyncTimestamp)
mCurrentCompositeTask = nullptr;
}
DispatchTouchEvents(aVsyncTimestamp);
if (mNeedsComposite && mCompositorParent) {
mNeedsComposite = false;
mCompositorParent->CompositeCallback(aVsyncTimestamp);
@ -339,8 +341,6 @@ CompositorVsyncObserver::Composite(TimeStamp aVsyncTimestamp)
} else if (mVsyncNotificationsSkipped++ > gfxPrefs::CompositorUnobserveCount()) {
UnobserveVsync();
}
DispatchTouchEvents(aVsyncTimestamp);
}
void

View File

@ -5,7 +5,7 @@
MOZ_APP_BASENAME=Fennec
MOZ_APP_VENDOR=Mozilla
MOZ_APP_VERSION=39.0a1
MOZ_APP_VERSION=40.0a1
MOZ_APP_UA_NAME=Firefox
MOZ_BRANDING_DIRECTORY=mobile/android/branding/unofficial

View File

@ -9,7 +9,7 @@ interface nsIURI;
interface nsIChannel;
interface nsILoadInfo;
[scriptable, uuid(cdef9e4e-b731-450c-871a-8015a95fa54c)]
[scriptable, uuid(c0c19db9-1b5a-4ac5-b656-ed6f8149fa48)]
interface nsIAboutModule : nsISupports
{

View File

@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# Definitions used by constants.js.
weave_version := 1.41.0
weave_version := 1.42.0
weave_id := {340c2bbc-ce74-4362-90b5-7c26312808ef}
# Preprocess files.

View File

@ -11,6 +11,7 @@ RUN yum install -y epel-release && \
GConf2-devel \
alsa-lib-devel \
autoconf213 \
bc \
bison \
bzip2 \
ccache \

View File

@ -1 +1 @@
0.2.6
0.2.7

View File

@ -1,4 +1,4 @@
FROM quay.io/mozilla/b2g-build:0.2.6
FROM quay.io/mozilla/b2g-build:0.2.7
MAINTAINER Dustin J. Mitchell <dustin@mozilla.com>
ENV PYTHONPATH /tools/tools/lib/python:$PYTHONPATH

View File

@ -1 +1 @@
0.5.3
0.5.4

View File

@ -1 +1 @@
0.0.2
0.0.3

View File

@ -5,9 +5,16 @@ python /home/worker/bin/validate_task.py
echo "Retrieving device"
res=`curl --request POST -H "Content-Type: application/json" -d "$DEVICE_CAPABILITIES" http://$CLOUD_HOST/device`
error=`echo $res | jq .error`
if [ "$error" != "null" ]; then
echo $error
exit -1
fi
status=`echo $res | jq .session`
if [[ $status == 'null' ]]; then
if [ "$status" == "null" ]; then
echo "Session could not be created with a device."
exit -1
fi

View File

@ -18,6 +18,10 @@ flags:
- win32_gecko # b2g desktop win 32 bit
- flame-kk # b2g flame kitkat
- flame-kk-eng # b2g flame eng build
- dolphin
- dolphin-eng
- dolphin-512
- dolphin-512-eng
tests:
- cppunit

View File

@ -76,6 +76,30 @@ builds:
types:
opt:
task: tasks/builds/b2g_flame_kk_eng.yml
dolphin:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_dolphin_opt.yml
dolphin-eng:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_dolphin_eng.yml
dolphin-512:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_dolphin_512_opt.yml
dolphin-512-eng:
platforms:
- b2g
types:
opt:
task: tasks/builds/b2g_dolphin_512_eng.yml
tests:
cppunit:

View File

@ -1,18 +1,23 @@
$inherits:
from: 'tasks/builds/b2g_phone_base.yml'
from: 'tasks/builds/b2g_dolphin_base.yml'
task:
scopes:
- 'docker-worker:cache:build-dolphin-eng'
metadata:
name: B2G Dolphin Eng
name: '[TC] B2G Dolphin Eng'
extra:
treeherder:
symbol: Be
groupSymbol: Dolphin
groupName: Dolphin Device Image
machine:
platform: b2g-device-image
payload:
cache:
build-hamachi-eng: /home/worker/object-folder
build-dolphin-eng: /home/worker/object-folder
env:
TARGET: 'dolphin'
DEBUG: 0
VARIANT: eng
extra:
locations:
img: 'private/build/dolphin.zip'

View File

@ -1,17 +0,0 @@
$inherits:
from: 'tasks/builds/b2g_phone_base.yml'
task:
scopes:
- 'docker-worker:cache:build-dolphin-user'
metadata:
name: B2G Dolphin User
payload:
cache:
build-hamachi-user: /home/worker/object-folder
env:
TARGET: 'dolphin'
DEBUG: 0
extra:
locations:
img: 'private/build/dolphin.zip'

View File

@ -16,11 +16,14 @@ task:
- 'queue:define-task:aws-provisioner/test-c4-2xlarge'
- 'queue:create-task:aws-provisioner/test-c4-2xlarge'
- 'docker-worker:cache:tc-vcs'
- 'docker-worker:cache:linux-cache'
payload:
image: '{{#docker_image}}tester{{/docker_image}}'
maxRunTime: 3600
cache:
# So pip installs are cached...
linux-cache: /home/worker/.cache
tc-vcs: '/home/worker/.tc-vcs'
env:
GAIA_HEAD_REPOSITORY: '{{{gaia_head_repository}}}'

View File

@ -38,10 +38,12 @@ skip-if = android_version == "18"
# Bug 1144395: crash on Android 4.3
skip-if = android_version == "18"
[test_ThirdPartyCookieProbe.js]
skip-if = true # Bug 1149284
[test_TelemetrySendOldPings.js]
skip-if = debug == true || os == "android" # Disabled due to intermittent orange on Android
[test_TelemetrySession.js]
# Bug 1144395: crash on Android 4.3
skip-if = android_version == "18"
#skip-if = android_version == "18"
skip-if = true # Bug 1149284
[test_ThreadHangStats.js]
run-sequentially = Bug 1046307, test can fail intermittently when CPU load is high

View File

@ -31,5 +31,6 @@ aboutReader.footer.deleteThisArticle=Delete this article
# These are used for the Reader View toolbar button and the menuitem within the
# View menu.
readerView.enter=Enter Reader View
readerView.enter.accesskey=R
readerView.close=Close Reader View
readerView.accesskey=R
readerView.close.accesskey=R

View File

@ -132,7 +132,7 @@ GeckoTouchDispatcher::NotifyTouch(MultiTouchInput& aTouch, TimeStamp aEventTime)
layers::APZThreadUtils::RunOnControllerThread(NewRunnableMethod(
this, &GeckoTouchDispatcher::DispatchTouchMoveEvents, TimeStamp::Now()));
} else {
if (mResamplingEnabled) {
{ // scope lock
MutexAutoLock lock(mTouchQueueLock);
mInflightNonMoveEvents++;
}
@ -154,7 +154,7 @@ GeckoTouchDispatcher::DispatchTouchNonMoveEvent(MultiTouchInput aInput)
}
DispatchTouchEvent(aInput);
if (mResamplingEnabled) {
{ // scope lock
MutexAutoLock lock(mTouchQueueLock);
mInflightNonMoveEvents--;
MOZ_ASSERT(mInflightNonMoveEvents >= 0);
@ -169,6 +169,7 @@ GeckoTouchDispatcher::DispatchTouchMoveEvents(TimeStamp aVsyncTime)
{
MutexAutoLock lock(mTouchQueueLock);
if (!mHavePendingTouchMoves) {
MOZ_ASSERT(mTouchMoveEvents.empty());
return;
}
mHavePendingTouchMoves = false;

View File

@ -129,7 +129,11 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>&
}
// Overrides ConsumerBase::onFrameAvailable(), does not call base class impl.
#if ANDROID_VERSION >= 22
void FramebufferSurface::onFrameAvailable(const ::android::BufferItem &item) {
#else
void FramebufferSurface::onFrameAvailable() {
#endif
sp<GraphicBuffer> buf;
sp<Fence> acquireFence;
status_t err = nextBuffer(buf, acquireFence);

View File

@ -63,7 +63,11 @@ public:
private:
virtual ~FramebufferSurface() { }; // this class cannot be overloaded
#if ANDROID_VERSION >= 22
virtual void onFrameAvailable(const ::android::BufferItem &item);
#else
virtual void onFrameAvailable();
#endif
virtual void freeBufferLocked(int slotIndex);
// nextBuffer waits for and then latches the next buffer from the

View File

@ -32,12 +32,28 @@ GonkBufferQueue::ProxyConsumerListener::ProxyConsumerListener(
GonkBufferQueue::ProxyConsumerListener::~ProxyConsumerListener() {}
#if ANDROID_VERSION == 21
void GonkBufferQueue::ProxyConsumerListener::onFrameAvailable() {
sp<ConsumerListener> listener(mConsumerListener.promote());
if (listener != NULL) {
listener->onFrameAvailable();
}
}
#else
void GonkBufferQueue::ProxyConsumerListener::onFrameAvailable(const ::android::BufferItem& item) {
sp<ConsumerListener> listener(mConsumerListener.promote());
if (listener != NULL) {
listener->onFrameAvailable(item);
}
}
void GonkBufferQueue::ProxyConsumerListener::onFrameReplaced(const ::android::BufferItem& item) {
sp<ConsumerListener> listener(mConsumerListener.promote());
if (listener != NULL) {
listener->onFrameReplaced(item);
}
}
#endif
void GonkBufferQueue::ProxyConsumerListener::onBuffersReleased() {
sp<ConsumerListener> listener(mConsumerListener.promote());

View File

@ -63,7 +63,12 @@ public:
public:
ProxyConsumerListener(const wp<ConsumerListener>& consumerListener);
virtual ~ProxyConsumerListener();
#if ANDROID_VERSION == 21
virtual void onFrameAvailable();
#else
virtual void onFrameAvailable(const ::android::BufferItem& item);
virtual void onFrameReplaced(const ::android::BufferItem& item);
#endif
virtual void onBuffersReleased();
virtual void onSidebandStreamChanged();
private:

View File

@ -554,6 +554,7 @@ status_t GonkBufferQueueProducer::queueBuffer(int slot,
return BAD_VALUE;
}
GonkBufferItem item;
sp<IConsumerListener> listener;
{ // Autolock scope
Mutex::Autolock lock(mCore->mMutex);
@ -610,7 +611,6 @@ status_t GonkBufferQueueProducer::queueBuffer(int slot,
++mCore->mFrameCounter;
mSlots[slot].mFrameNumber = mCore->mFrameCounter;
GonkBufferItem item;
item.mAcquireCalled = mSlots[slot].mAcquireCalled;
item.mGraphicBuffer = mSlots[slot].mGraphicBuffer;
item.mCrop = crop;
@ -659,11 +659,18 @@ status_t GonkBufferQueueProducer::queueBuffer(int slot,
output->inflate(mCore->mDefaultWidth, mCore->mDefaultHeight,
mCore->mTransformHint, mCore->mQueue.size());
item.mGraphicBuffer.clear();
item.mSlot = GonkBufferItem::INVALID_BUFFER_SLOT;
} // Autolock scope
// Call back without lock held
if (listener != NULL) {
#if ANDROID_VERSION == 21
listener->onFrameAvailable();
#else
listener->onFrameAvailable(reinterpret_cast<::android::BufferItem&>(item));
#endif
}
return NO_ERROR;

View File

@ -85,7 +85,11 @@ void GonkConsumerBase::freeBufferLocked(int slotIndex) {
mSlots[slotIndex].mFrameNumber = 0;
}
#if ANDROID_VERSION == 21
void GonkConsumerBase::onFrameAvailable() {
#else
void GonkConsumerBase::onFrameAvailable(const ::android::BufferItem& item) {
#endif
ALOGV("onFrameAvailable");
sp<FrameAvailableListener> listener;

View File

@ -107,7 +107,12 @@ protected:
// the GonkConsumerBase implementation must be called from the derived class.
// The GonkConsumerBase version of onSidebandStreamChanged does nothing and can
// be overriden by derived classes if they want the notification.
#if ANDROID_VERSION == 21
virtual void onFrameAvailable();
#else
virtual void onFrameAvailable(const ::android::BufferItem& item);
virtual void onFrameReplaced(const ::android::BufferItem& item) {};
#endif
virtual void onBuffersReleased();
virtual void onSidebandStreamChanged();

View File

@ -188,8 +188,13 @@ void GonkNativeWindow::setNewFrameCallback(
mNewFrameCallback = callback;
}
#if ANDROID_VERSION == 21
void GonkNativeWindow::onFrameAvailable() {
GonkConsumerBase::onFrameAvailable();
#else
void GonkNativeWindow::onFrameAvailable(const ::android::BufferItem &item) {
GonkConsumerBase::onFrameAvailable(item);
#endif
if (mNewFrameCallback) {
mNewFrameCallback->OnNewFrame();

View File

@ -118,7 +118,11 @@ class GonkNativeWindow: public GonkConsumerBase
static void RecycleCallback(TextureClient* client, void* closure);
protected:
#if ANDROID_VERSION == 21
virtual void onFrameAvailable();
#else
virtual void onFrameAvailable(const ::android::BufferItem &item);
#endif
private:
GonkNativeWindowNewFrameCallback* mNewFrameCallback;

View File

@ -21,7 +21,7 @@ namespace mozilla {
*/
struct Module
{
static const unsigned int kVersion = 39;
static const unsigned int kVersion = 40;
struct CIDEntry;